搜索
bottom↓
回复: 81

开源Verilog HDL原创FIFO模块

  [复制链接]

出0入0汤圆

发表于 2013-6-23 23:16:14 | 显示全部楼层 |阅读模式
本帖最后由 skyxjh 于 2013-6-23 23:43 编辑

开源Verilog HDL原创FIFO模块,包含测试文件,请勿用于商业用途,用于出版或教程请联系本人。

  1. module fifo(rst,iclk,ien,oclk,oen,idat,odat,full,empty);
  2.         parameter datbits = 8, addrbits = 4;
  3.         parameter low = 1'b0, hi = 1'b1, true = low, false = hi;
  4.         input rst,iclk,oclk,ien,oen; //复位,输入时钟、输出时钟,输入使能,输出使能
  5.         input [datbits-1:0]idat; //输入数据
  6.         output [datbits-1:0]odat; //输出数据
  7.         output full,empty; //fifo满,空
  8.         reg [datbits-1:0]mem[0:2**addrbits-1]; //2^addrbits字节RAM块
  9.         reg [addrbits-1:0]rdaddr = {addrbits{1'b1}}; //fifo读地址
  10.         reg [addrbits-1:0]wraddr = {addrbits{1'b0}}; //fifo写地址
  11.         wire [addrbits-1:0]delt = wraddr - rdaddr; //有效数据数+1
  12.         assign full = delt == 1'b0 ? true : false; //fifo满信号
  13.         assign empty = delt == 1'b1 ? true : false; //fifo空信号
  14.         assign odat = oen == true ? mem[rdaddr] : {datbits{1'bz}}; //输出控制
  15.         initial begin //初始化
  16.                 wraddr = {addrbits{1'b0}}; //写地址复位
  17.                 rdaddr = {addrbits{1'b1}}; //读地址复位
  18.                 end //初始化
  19.         always @(negedge iclk or negedge rst) begin //push
  20.                 if(rst == low) begin //复位
  21.                         wraddr <= {addrbits{1'b0}}; //写地址复位
  22.                         end
  23.                 else begin //进栈
  24.                         if(ien == true) begin //输入使能
  25.                                 mem[wraddr] <= idat; //进栈
  26.                                 wraddr <= wraddr + 1'b1; //写地址调整
  27.                                 end
  28.                         end //进栈
  29.                 end //push
  30.         always @(negedge oclk or negedge rst) begin //pop
  31.                 if(rst == low) begin //复位
  32.                         rdaddr <= {addrbits{1'b1}}; //读地址复位
  33.                         end
  34.                 else begin //出栈
  35.                         if(oen == true) begin //输出使能
  36.                                 rdaddr <= rdaddr + 1'b1; //读地址调整
  37.                                 end
  38.                         end //出栈
  39.                 end //pop       
  40. endmodule

  41. `timescale 1ps/1ps
  42. module testbench();
  43.         parameter low = 1'b0, hi = 1'b1, true = low, false = hi;
  44.         wire [7:0]odat;
  45.         wire ick,ock;
  46.         reg iclk,oclk;
  47.         assign ick = iclk;
  48.         assign ock = oclk;
  49.         wire iena,oena;
  50.         reg ien,oen;
  51.         assign iena = ien;
  52.         assign oena = oen;
  53.         wire full,empty;
  54.         wire [7:0]idat;
  55.         reg [7:0]dat;
  56.         assign idat = dat;
  57.         always #1 iclk <= ~iclk;
  58.         always #3 oclk <= ~oclk;
  59.         initial begin
  60.                 iclk = hi;
  61.                 oclk = hi;
  62.                 dat = 8'd0;
  63.                 end
  64.         always @(posedge iclk) begin
  65.                 if(full == true) ien <= false;
  66.                 else begin
  67.                         ien <= true;
  68.                         dat <= dat + 1'b1;
  69.                         end
  70.                 end
  71.         always @(posedge oclk) begin
  72.                 if(empty == true) oen <= false;
  73.                 else oen <= true;
  74.                 end
  75.         fifo #(8,3) f1(hi,ick,iena,ock,oena,idat,odat,full,empty);
  76. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2013-6-23 23:16:44 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-23 23:17:01 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-23 23:20:53 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2013-6-24 00:08:01 | 显示全部楼层
make xiexie

出0入0汤圆

发表于 2013-6-24 08:42:46 | 显示全部楼层
学习了,谢谢。

出0入0汤圆

发表于 2013-6-24 08:48:06 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2013-6-24 08:54:17 来自手机 | 显示全部楼层
感谢楼主无私奉献,收藏了

出0入0汤圆

发表于 2013-6-24 12:25:48 | 显示全部楼层
感谢楼主无私奉献,收藏FIFO模块

出0入0汤圆

 楼主| 发表于 2013-6-24 12:41:47 | 显示全部楼层
一楼是同步FIFO模块,改写了一个异步FIFO模块,使用更方便。

  1. module fifo(rst,ien,oen,idat,odat,full,empty);
  2.         parameter datbits = 8, addrbits = 4;
  3.         parameter low = 1'b0, hi = 1'b1, true = low, false = hi;
  4.         input rst,ien,oen; //复位,输入使能,输出使能
  5.         input [datbits-1:0]idat; //输入数据
  6.         output [datbits-1:0]odat; //输出数据
  7.         output full,empty; //fifo满,空
  8.         reg [datbits-1:0]mem[0:2**addrbits-1]; //2^addrbits字节RAM块
  9.         reg [addrbits-1:0]rdaddr = {addrbits{1'b1}}; //fifo读地址
  10.         reg [addrbits-1:0]wraddr = {addrbits{1'b0}}; //fifo写地址
  11.         wire [addrbits-1:0]delt = wraddr - rdaddr; //有效数据数+1
  12.         assign full = delt == 1'b0 ? true : false; //fifo满信号
  13.         assign empty = delt == 1'b1 ? true : false; //fifo空信号
  14.         assign odat = oen == true ? mem[rdaddr] : {datbits{1'bz}}; //输出控制
  15.         initial begin //初始化
  16.                 wraddr = {addrbits{1'b0}}; //写地址复位
  17.                 rdaddr = {addrbits{1'b1}}; //读地址复位
  18.                 end //初始化
  19.         always @(negedge ien or negedge rst) begin //push
  20.                 if(rst == low) begin //复位
  21.                         wraddr <= {addrbits{1'b0}}; //写地址复位
  22.                         end
  23.                 else if(full == false) begin //进栈
  24.                         mem[wraddr] <= idat; //进栈
  25.                         wraddr <= wraddr + 1'b1; //写地址调整
  26.                         end //进栈
  27.                 end //push
  28.         always @(negedge oen or negedge rst) begin //pop
  29.                 if(rst == low) begin //复位
  30.                         rdaddr <= {addrbits{1'b1}}; //读地址复位
  31.                         end
  32.                 else if(empty == false) begin //出栈
  33.                         rdaddr <= rdaddr + 1'b1; //读地址调整
  34.                         end //出栈
  35.                 end //pop       
  36. endmodule

  37. `timescale 1ps/1ps
  38. module testbench();
  39.         parameter low = 1'b0, hi = 1'b1, true = low, false = hi;
  40.         wire [7:0]odat;
  41.         wire ick,ock;
  42.         reg iclk,oclk;
  43.         assign ick = iclk;
  44.         assign ock = oclk;
  45.         wire full,empty;
  46.         wire [7:0]idat;
  47.         reg [7:0]dat;
  48.         assign idat = dat;
  49.         always #3 iclk <= ~iclk;
  50.         always #1 oclk <= ~oclk;
  51.         initial begin
  52.                 iclk = hi;
  53.                 oclk = hi;
  54.                 dat = 8'd0;
  55.                 end
  56.         always @(posedge iclk) begin
  57.                 dat <= dat + 1'b1;
  58.                 end
  59.         fifo #(8,3) f1(hi,ick,ock,idat,odat,full,empty);
  60. endmodule
复制代码

出0入0汤圆

 楼主| 发表于 2013-6-24 12:43:51 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-24 12:45:04 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-24 12:50:54 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-6-24 15:29:10 | 显示全部楼层
感谢skyxjh 。

出0入0汤圆

发表于 2013-6-24 16:14:59 | 显示全部楼层
感谢楼主无私奉献

出0入0汤圆

 楼主| 发表于 2013-6-24 21:00:14 | 显示全部楼层
大家多指教!

出0入0汤圆

发表于 2013-6-28 20:13:01 | 显示全部楼层
楼主很厉害,谢谢。

出0入0汤圆

 楼主| 发表于 2013-6-28 23:13:34 | 显示全部楼层
jxcylxh 发表于 2013-6-28 20:13
楼主很厉害,谢谢。

使用中有什么问题可以互相交流。

出0入0汤圆

发表于 2013-7-11 16:12:08 | 显示全部楼层
{addrbits{1'b1}}是什么意思啊?

出0入0汤圆

发表于 2013-7-11 16:29:09 | 显示全部楼层
本帖最后由 stdio 于 2013-7-11 16:30 编辑

异步FIFO这样做有问题。

出0入0汤圆

 楼主| 发表于 2013-7-11 20:57:09 | 显示全部楼层
sky_prince 发表于 2013-7-11 16:12
{addrbits{1'b1}}是什么意思啊?

{addrbits{1'b1}}是addrbits位1的意思

出0入0汤圆

 楼主| 发表于 2013-7-11 20:57:30 | 显示全部楼层
stdio 发表于 2013-7-11 16:29
异步FIFO这样做有问题。

有什么问题?

出0入0汤圆

发表于 2013-7-11 20:59:34 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2013-7-11 22:36:42 | 显示全部楼层
好像很不错啊,LZ有FPGA采集编码器的代码不?急需啊

出0入0汤圆

 楼主| 发表于 2013-7-11 22:49:44 | 显示全部楼层
hy2515131 发表于 2013-7-11 22:36
好像很不错啊,LZ有FPGA采集编码器的代码不?急需啊

编码器的输出波形很简单,解码不难,搞清楚正反转的编码规律,设定一个计数器初值,采集到一个正转编码计数器值加一,反之则减一,你可以自己写一个。

出0入0汤圆

发表于 2013-7-12 08:48:16 | 显示全部楼层
skyxjh 发表于 2013-7-11 20:57
{addrbits{1'b1}}是addrbits位1的意思

我以前常见变量的位拼接,常量也可以啊?

出0入0汤圆

 楼主| 发表于 2013-7-12 12:31:59 | 显示全部楼层
sky_prince 发表于 2013-7-12 08:48
我以前常见变量的位拼接,常量也可以啊?

常量当然可以拼接了。

出0入0汤圆

发表于 2013-7-12 13:20:15 | 显示全部楼层
skyxjh 发表于 2013-7-12 12:31
常量当然可以拼接了。

理解了,相当于1111。

出0入0汤圆

发表于 2013-7-12 14:04:58 | 显示全部楼层
delt = wraddr - rdaddr;当wraddr<rdaddr会如何???

出0入0汤圆

发表于 2013-7-12 16:20:59 | 显示全部楼层
skyxjh 发表于 2013-7-12 12:31
常量当然可以拼接了。

这个iclk和oclk不能相等是吧?只能ilclk比oclk快?

出0入0汤圆

 楼主| 发表于 2013-7-13 08:33:11 | 显示全部楼层
wwwjjj-1 发表于 2013-7-12 14:04
delt = wraddr - rdaddr;当wraddr

无符号数减法,4‘d1-4'd2=4'd15

出0入0汤圆

 楼主| 发表于 2013-7-13 08:34:43 | 显示全部楼层
86793 发表于 2013-7-12 16:20
这个iclk和oclk不能相等是吧?只能ilclk比oclk快?

可以相等,也可以输入比输出慢,这样FIFO就不会满。

出0入0汤圆

发表于 2013-7-18 18:26:19 | 显示全部楼层
本帖最后由 loyoan 于 2013-7-18 19:08 编辑

谢谢LZ的分享~
请教一个低级的问题,我刚学没多久,大神见笑:
如果是3位地址的FIFO,delt也是3位的,
assign empty = delt == 1'b1 ? true : false; //fifo空信号
这句不会出问题吗?多位与1位的数能相等吗?

现在明白了。。。好代码,LZ给力

出0入0汤圆

 楼主| 发表于 2013-7-20 22:25:07 | 显示全部楼层
loyoan 发表于 2013-7-18 18:26
谢谢LZ的分享~
请教一个低级的问题,我刚学没多久,大神见笑:
如果是3位地址的FIFO,delt也是3位的,

当然不会出问题,比较器是以最长的变量来对齐的,高位补0。

出0入0汤圆

发表于 2013-8-1 13:55:01 | 显示全部楼层
谢谢楼主奉献

出0入0汤圆

发表于 2013-8-1 23:35:58 | 显示全部楼层
非常的厉害  非常的佩服楼主

出0入0汤圆

发表于 2013-8-2 14:13:34 | 显示全部楼层
向楼主学习啊

出0入0汤圆

发表于 2013-8-2 15:11:41 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-8-9 16:24:19 | 显示全部楼层
Error: Fitter requires 344 LABs to implement the project, but the device contains only 288 LABs;
数据位设置为9位时,用EP2C5Q208时报的错误,占用资源太大。怎么我位数小的时候,用modelsim独立仿真的时候效果还好,用quartus和modelsim联合仿真时,出现Error: ModelSim Error: # ** Error: c:/altera/11.0/quartus/eda/sim_lib/cycloneii_atoms.v(5351): $hold( posedge clk &&& nosloadsclr:7769 ps, datain:7784的错误。有人说是后仿真约束设置的不对,可这些选项我根本就没设置啊

出0入0汤圆

发表于 2013-8-9 17:48:57 | 显示全部楼层
太耗资源了,如果数据太多,根本不能做别的。请教一下lz:我想通过arm向单片机传4KB的数据。我用quartus里面提供的scfifo,时钟直接接20M,单片机写信号周期是100ns,arm写周期是70-80ns,单片机读出来的数据都是0。怎么加外围电路怎么让写信号或读信号里面只有一个时钟沿呢?如果用dcfifo由如何实现

出0入0汤圆

 楼主| 发表于 2013-8-10 10:51:47 | 显示全部楼层
gginhouse 发表于 2013-8-9 17:48
太耗资源了,如果数据太多,根本不能做别的。请教一下lz:我想通过arm向单片机传4KB的数据。我用quartus里 ...

通过arm向单片机传4KB的数据与QUARTUS有什么关系?

出0入0汤圆

发表于 2013-8-10 15:02:03 | 显示全部楼层
你没明白我的意思,我说quartus和modelsim联合仿真的时候我哪里设置错了,另外不知道异步两个时钟怎么接。原来LPM_FIFO读写是上升沿触发不是高电平触发,只要写的时钟够小就行,我读到数据的问题可能是别的引起的。你的程序写的很好,用modelsim独立仿真也没问题,如果设置深度太大太消耗LE。

出0入0汤圆

 楼主| 发表于 2013-8-11 10:14:05 | 显示全部楼层
gginhouse 发表于 2013-8-10 15:02
你没明白我的意思,我说quartus和modelsim联合仿真的时候我哪里设置错了,另外不知道异步两个时钟怎么接。 ...

我写的这个异步FIFO的两个时钟随便接,输入时钟接ien,输出时钟接oen就可以了,时钟下降沿置数和读数。

出0入0汤圆

发表于 2013-8-11 12:16:59 | 显示全部楼层
学习了 楼主好人  另外同步FIFO你在你的器件上能跑多快呢? 器件型号也报一下

出0入0汤圆

 楼主| 发表于 2013-8-11 17:40:25 | 显示全部楼层
sczh0001 发表于 2013-8-11 12:16
学习了 楼主好人  另外同步FIFO你在你的器件上能跑多快呢? 器件型号也报一下 ...

极限速度我没测试过,你可以测试一下,顺便给大家一个参考。

出0入0汤圆

发表于 2013-8-18 10:27:08 | 显示全部楼层
  1. `define BUF_WIDTH 3    // BUF_SIZE = 16 -> BUF_WIDTH = 4, no. of bits to be used in pointer
  2. `define BUF_SIZE ( 1<<`BUF_WIDTH )
  3. `define DATA_WIDTH 32

  4. module fifo32( clk, rst, buf_in, buf_out, wr_en, rd_en, buf_empty, buf_full, fifo_counter );

  5. input                 rst, clk, wr_en, rd_en;   
  6. // reset, system clock, write enable and read enable.
  7. input [`DATA_WIDTH-1:0]           buf_in;                  
  8. // data input to be pushed to buffer
  9. output[`DATA_WIDTH-1:0]           buf_out;                  
  10. // port to output the data using pop.
  11. output                buf_empty, buf_full;      
  12. // buffer empty and full indication
  13. output[`BUF_WIDTH :0] fifo_counter;            
  14. // number of data pushed in to buffer   

  15. reg[`DATA_WIDTH-1:0]              buf_out;
  16. reg                   buf_empty, buf_full;
  17. reg[`BUF_WIDTH :0]    fifo_counter;
  18. reg[`BUF_WIDTH -1:0]  rd_ptr, wr_ptr;           // pointer to read and write addresses  
  19. reg[`DATA_WIDTH-1:0]              buf_mem[`BUF_SIZE -1 : 0]; //  

  20. always @(fifo_counter)
  21. begin
  22.    buf_empty = (fifo_counter==0);
  23.    buf_full = (fifo_counter== `BUF_SIZE);

  24. end

  25. always @(posedge clk or posedge rst)
  26. begin
  27.    if( rst )
  28.        fifo_counter <= 0;

  29.    else if( (!buf_full && wr_en) && ( !buf_empty && rd_en ) )
  30.        fifo_counter <= fifo_counter;

  31.    else if( !buf_full && wr_en )
  32.        fifo_counter <= fifo_counter + 1;

  33.    else if( !buf_empty && rd_en )
  34.        fifo_counter <= fifo_counter - 1;
  35.    else
  36.       fifo_counter <= fifo_counter;
  37. end

  38. always @( posedge clk or posedge rst)
  39. begin
  40.    if( rst )
  41.       buf_out <= 0;
  42.    else
  43.    begin
  44.       if( rd_en && !buf_empty )
  45.          buf_out <= buf_mem[rd_ptr];

  46.       else
  47.          buf_out <= buf_out;

  48.    end
  49. end

  50. always @(posedge clk)
  51. begin

  52.    if( wr_en && !buf_full )
  53.       buf_mem[ wr_ptr ] <= buf_in;

  54.    else
  55.       buf_mem[ wr_ptr ] <= buf_mem[ wr_ptr ];
  56. end

  57. always@(posedge clk or posedge rst)
  58. begin
  59.    if( rst )
  60.    begin
  61.       wr_ptr <= 0;
  62.       rd_ptr <= 0;
  63.    end
  64.    else
  65.    begin
  66.       if( !buf_full && wr_en )    wr_ptr <= wr_ptr + 1;
  67.           else  wr_ptr <= wr_ptr;

  68.       if( !buf_empty && rd_en )   rd_ptr <= rd_ptr + 1;
  69.       else rd_ptr <= rd_ptr;
  70.    end

  71. end
  72. endmodule


复制代码
以上为同步FIFO 亲测可用。代码有点罗嗦,比方说else rd_ptr <= rd_ptr;完全可以省掉,但是没有影响,所以就没有修改。

出0入0汤圆

发表于 2013-8-18 12:12:43 | 显示全部楼层
其实,用现成的IP核,会仿真弄懂各种模式的时序(或熟读手册),还是挺简单实用的。FIFO和双口RAM折腾了一周,终于搞定了。

出0入0汤圆

 楼主| 发表于 2013-8-18 22:39:47 | 显示全部楼层
自己写代码实现可以学到更多东西。

出0入0汤圆

发表于 2013-8-21 11:31:31 | 显示全部楼层
楼主:
你好,编译的时候提示:found 3 instances of uninferred ram logic
这个是什么问题呢?谢谢

出0入0汤圆

 楼主| 发表于 2013-8-21 19:08:14 | 显示全部楼层
crydhw 发表于 2013-8-21 11:31
楼主:
你好,编译的时候提示:found 3 instances of uninferred ram logic
这个是什么问题呢?谢谢 ...

找到3个uninferred ram逻辑实例,有问题吗?

出0入0汤圆

发表于 2013-8-28 17:16:29 | 显示全部楼层
刚刚开始学习fpga,需要用到fifo功能,谢谢楼主的无私奉献

出0入0汤圆

发表于 2013-9-15 13:32:43 | 显示全部楼层
请教楼主一个问题。
使用altera的dcfifo,读出的时候依靠half full信号,一旦半满就读出8个。
现在问题是,在前端写数据结束后,fifo中还会残留接近fifo大小的一半的数据,这些数据要怎样才能读出来呢?

出0入0汤圆

发表于 2013-9-15 13:59:00 | 显示全部楼层
quanquan902222 发表于 2013-9-15 13:32
请教楼主一个问题。
使用altera的dcfifo,读出的时候依靠half full信号,一旦半满就读出8个。
现在问题是, ...

那位什么要用不半满读呢,直接用非空就读就可以了

出0入0汤圆

 楼主| 发表于 2013-9-15 14:55:38 | 显示全部楼层
quanquan902222 发表于 2013-9-15 13:32
请教楼主一个问题。
使用altera的dcfifo,读出的时候依靠half full信号,一旦半满就读出8个。
现在问题是, ...

半满开始读,读到空为止就行了。

出0入0汤圆

发表于 2013-9-15 16:20:51 | 显示全部楼层
嗯,感谢楼上两位的思路,我去试试。

出0入0汤圆

发表于 2013-9-17 16:32:14 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2013-9-20 16:54:39 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2013-9-22 10:53:39 | 显示全部楼层
学习中~~

出0入0汤圆

发表于 2013-11-20 03:54:04 | 显示全部楼层
问题在于:
wire [addrbits-1:0]delt = wraddr - rdaddr;
wraddr是由ien驱动的,而rdaddr是由oen驱动的,它们属于不同的时钟域,这样直接运算,存在亚稳态问题。
要是异步FIFO就是这么简单的话,也不会有人长篇大论写了好些篇论文了。
建议楼主去搜搜异步FIFO的论文,有个洋鬼子写了两篇经典的。

出0入8汤圆

发表于 2013-11-20 08:10:30 | 显示全部楼层

谢谢楼主奉献

出0入0汤圆

发表于 2013-11-20 13:46:00 | 显示全部楼层
嗯,谢谢楼主分享

出0入0汤圆

 楼主| 发表于 2013-11-20 20:02:19 | 显示全部楼层
stdio 发表于 2013-11-20 03:54
问题在于:
wire [addrbits-1:0]delt = wraddr - rdaddr;
wraddr是由ien驱动的,而rdaddr是由oen驱动的,它 ...

我这个异步FIFO没有考虑亚稳态,也是一个抛砖引玉的方案,这么多人看了贴子,只有你指出问题,说明你是认真研究了。

出0入0汤圆

 楼主| 发表于 2013-11-20 20:19:56 | 显示全部楼层
异步FIFO设计
http://wenku.baidu.com/link?url= ... x4pFmTOyNRXaVonuufO

出0入0汤圆

 楼主| 发表于 2013-11-20 20:47:51 | 显示全部楼层
异步FIFO及verilog原码
http://wenku.baidu.com/view/210f6dbef121dd36a32d8228.html

出0入0汤圆

发表于 2013-11-28 13:06:35 | 显示全部楼层
谢谢分享好资源

出0入24汤圆

发表于 2013-11-28 13:08:50 | 显示全部楼层
感谢分享,学习一下

出0入0汤圆

发表于 2013-11-28 22:17:14 | 显示全部楼层
其实这个fifo有点小问题

出0入0汤圆

发表于 2013-12-1 11:05:39 | 显示全部楼层
楼主大神啊,好厉害

出0入0汤圆

发表于 2013-12-14 10:46:01 | 显示全部楼层
谢谢楼主分享!!!

出0入0汤圆

发表于 2013-12-17 19:48:26 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2013-12-19 21:54:02 | 显示全部楼层
顶一个!!      

出0入0汤圆

发表于 2013-12-19 22:47:44 | 显示全部楼层
mark ,以后用得上

出0入0汤圆

发表于 2014-2-8 16:53:37 | 显示全部楼层
楼主好走位!!!1

出0入17汤圆

发表于 2014-2-8 20:16:06 | 显示全部楼层
为何不用现成的IP核?我一直用ALTERA的IP,很简单也很好用呀!

出0入0汤圆

 楼主| 发表于 2014-2-10 18:38:33 | 显示全部楼层
用IP核占用资源多

出0入0汤圆

发表于 2014-2-23 17:09:23 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2015-3-24 22:33:47 | 显示全部楼层
收藏了,想用cpld采集AD数据,写个深度大点的fifo不知是否可行

出0入0汤圆

发表于 2015-3-24 22:44:17 | 显示全部楼层
本帖最后由 NJ8888 于 2015-3-24 22:45 编辑
qianniao29 发表于 2015-3-24 22:33
收藏了,想用cpld采集AD数据,写个深度大点的fifo不知是否可行


CPLD没多少资源,想FIFO要么换FPGA要么外加SRAM 用CPLD做控制逻辑(不过也是资源紧张啊,还是用FPGA好),FPGA带FIFO的核,不用白不用,不占逻辑资源,不过深度上受芯片型号影响大小不一

出0入0汤圆

 楼主| 发表于 2015-3-24 23:20:03 | 显示全部楼层
qianniao29 发表于 2015-3-24 22:33
收藏了,想用cpld采集AD数据,写个深度大点的fifo不知是否可行

CPLD没有RAM,是用逻辑单元来做FIFO的,很占用资源,一般也就写个几十字节的FIFO。

出0入0汤圆

发表于 2015-3-28 17:04:31 | 显示全部楼层
请教一个问题:我现在有2个16位,20MSPS的AD,后级有一个USB3.0将数据传输至PC,通过FPGA控制AD采样及采样数据传入USB芯片(16位数据总线),那么我如何通过FIFO将这两路AD的数据缓存呢?

出0入0汤圆

 楼主| 发表于 2015-3-28 21:27:24 | 显示全部楼层
每一路AD接一个16位宽的FIFO,再用一个调度模块读取两个FIFO,打包通过USB上传到PC。

出0入0汤圆

发表于 2015-3-29 21:30:55 | 显示全部楼层
楼主程序存在读、写时钟的跨时钟域问题,比如读写地址由两个时钟分别作用下产生,两地址相减的值会不确定。
我也在寻找问题解决方法,未果。楼主如有方法,望不要保留。
所以,直到现在,我还是使用ISE自带的FIFO核。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 19:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表