网站上怎样做超链接东莞 营销网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:28
当前位置: 首页 > news >正文
网站上怎样做超链接,东莞 营销网站,国际域名注册管理机构,外贸自建网站前言 FIFO功能模块分两篇文章#xff0c;本篇为同步FIFO#xff0c;另一篇为异步FIFO#xff0c;传送门#xff1a;
Verilog功能模块——异步FIFO-CSDN博客
同步FIFO实现起来是异步FIFO的简化版#xff0c;所以#xff0c;本博文不再介绍FIFO实现原理#xff0c;感兴趣… 前言
FIFO功能模块分两篇文章本篇为同步FIFO另一篇为异步FIFO传送门
Verilog功能模块——异步FIFO-CSDN博客
同步FIFO实现起来是异步FIFO的简化版所以本博文不再介绍FIFO实现原理感兴趣的同学可以去看我异步FIFO的文章基本看懂了异步FIFO同步FIFO自然就懂了。 二. 模块功能框图与信号说明 信号说明
分类信号名称输入/输出说明参数DATA_WIDTH–数据位宽ADDR_WIDTH–地址位宽FIFO深度2*ADDR_WIDTHFWFT_EN–First word fall-through输出模式使能高电平有效FIFO写端口dininputFIFO数据输入wr_eninputFIFO写使能fulloutputFIFO满信号almost_fulloutputFIFO快满信号FIFO剩余容量1时置高FIFO读端口doutoutputFIFO数据输出rd_eninputFIFO读使能emptyoutputFIFO空信号almost_emptyoutputFIFO快空信号FIFO内数据量1时置高时钟与复位clkinputFIFO读时钟rstinputFIFO读复位
注意
信号的命名与Vivado中的FIFO IP核完全一致复位均为高电平复位与Vivado中的FIFO IP核保持一致复位为异步复位FIFO深度通过ADDR_WIDTH来设置所以FIFO的深度必然是2的指数如2、4、8、16等 三. 部分代码展示
// 生成读写指针
reg [ADDR_WIDTH:0] rptr;
always (posedge clk or posedge rst) beginif (rst)rptr 0;else if (rd_en ~empty)rptr rptr 1b1;
endreg [ADDR_WIDTH:0] wptr;
always (posedge clk or posedge rst) beginif (rst)wptr 0;else if (wr_en ~full)wptr wptr 1b1;
endwire [ADDR_WIDTH-1:0] raddr rptr[ADDR_WIDTH-1:0];
wire [ADDR_WIDTH-1:0] waddr wptr[ADDR_WIDTH-1:0];wire [ADDR_WIDTH:0] rptr_p1 rptr 1b1;
wire [ADDR_WIDTH:0] wptr_p1 wptr 1b1;
//– 生成读写指针 ————————————————————// 生成empty与almost_empty信号
always () beginif (rst)empty 1b1;else if (rptr wptr)empty 1b1;elseempty 1b0;
endalways () beginif (rst)almost_empty 1b1;else if (rptr_p1 wptr || empty)almost_empty 1b1;elsealmost_empty 1b0;
end
//– 生成empty与almost_empty信号 ————————————————————// 生成full与almost_full信号
always () beginif (rst)full 1b1;else if ((wptr[ADDR_WIDTH] ! rptr[ADDR_WIDTH]) (wptr[ADDR_WIDTH-1:0] rptr[ADDR_WIDTH-1:0]))full 1b1;elsefull 1b0;
endalways (*) beginif (rst)almost_full 1b1;else if (((wptr_p1[ADDR_WIDTH] ! rptr[ADDR_WIDTH]) (wptr_p1[ADDR_WIDTH-1:0] rptr[ADDR_WIDTH-1:0]))|| full)almost_full 1b1;elsealmost_full 1b0;
end
//– 生成full与almost_full信号 ————————————————————三. 功能仿真
比较以下情形中的fifo行为是否与FIFO IP核一致
情形一单次写单次读
情形二写满后再读空
情形三在读的过程中写在写的过程中读
判断模块功能正常的依据
写入数据是否按顺序正常读出空信号和满信号是否正常输出。
为方便比较编写了顶层文件实例化了FIFO IP核与自编模块部分代码如下
vivado_sync_fifo vivado_sync_fifo_u0 (.clk (clk ), // input wire clk.rst (rst ), // input wire rst.din (din ), // input wire [7 : 0] din.wr_en (wr_en ), // input wire wr_en.rd_en (rd_en ), // input wire rd_en.dout (vivado_fifo_dout ), // output wire [7: 0] dout.full (vivado_fifo_full ), // output wire full.almost_full (vivado_fifo_almost_full ), // output wire almost_full.empty (vivado_fifo_empty ), // output wire empty.almost_empty (vivado_fifo_almost_empty)// output wire almost_empty
);syncFIFO # (.DATA_WIDTH (DATA_WIDTH),.ADDR_WIDTH (ADDR_WIDTH),.FWFT_EN (FWFT_EN )
) syncFIFO_inst (.din (din ),.wr_en (wr_en ),.full (full ),.almost_full (almost_full ),.dout (dout ),.rd_en (rd_en ),.empty (empty ),.almost_empty (almost_empty),.clk (clk ),.rst (rst )
);testbench部分代码如下
// 生成时钟
localparam CLKT 2;
initial beginclk 0;forever #(CLKT / 2) clk ~clk;
end// 读写使能控制
initial beginrst 1;#(CLKT * 2)rst 0;wr_en 0;rd_en 0;#(CLKT * 2)wait(~full ~vivado_fifo_full); // 两个FIFO都从复位态恢复时开始写// 写入一个数据wr_en 1;#(CLKT * 1)wr_en 0;// 读出一个数据wait(~empty ~vivado_fifo_empty);// 两个FIFO都非空时开始读比较读数据和empty信号是否有差异rd_en 1;#(CLKT * 1)rd_en 0;// 写满wr_en 1;wait(full vivado_fifo_full); // 两个FIFO都满时停止写如果两者不同时满则先满的一方会有写满的情况发生但对功能无影响// vivado FIFO IP在FWFT模式时, 设定深度16时实际深度为17, 但仿真显示full会在写入15个数据后置高, 过几个时钟后后拉低,// 再写入一个数据, full又置高; 然后过几个时钟又拉低, 再写入一个数据置高, 如此才能写入17个数据// 所以这里多等待12个wclk周期, 就是为了能真正写满vivado FWFT FIFO#(CLKT * 12)wr_en 0;// 读空wait(~empty ~vivado_fifo_empty);rd_en 1;wait(empty vivado_fifo_empty); // 两个FIFO都空时停止读如果两者不同时空则先空的一方会有读空的情况发生但对功能无影响rd_en 0;#(CLKT * 10)\(stop;
end// 使用以下代码时先注释掉上面的读写使能控制initial
// 同时读写
// initial begin
// #(CLKT * 30)
// \)stop;
// end// assign wr_en ~full || ~vivado_fifo_full; // 未满就一直写
// assign rd_en ~empty || ~vivado_fifo_empty; // 未空就一直读always (posedge clk) beginif (rst)din 0;else if (wr_en ~full ~vivado_fifo_full)din din 1;
endendmodule8bit16深度FWFT FIFO仿真波形如下 可以看到模块输出的自编fifo与vivado fwft fifo的写端口和读端口行为是一致的只是可能会超前或滞后一定的clk周期。 可以看到empty拉低时数据已经有效了所以自编模块实现了FWFT功能Vivado FIFO的实际深度为17所以它多读出了一个数据空信号更晚拉高。
因篇幅问题其它条件下的仿真不再展示感兴趣的同学可通过更改testbench自行验证。
FWFT_EN改为0注意同步修改Vivado FIFO的配置 四. 工程分享
Verilog功能模块——同步FIFOVivado 2021.2工程。
欢迎大家关注我的公众号徐晓康的博客回复以下四位数字获取。
8302
建议复制过去不会码错字
或者在我的码云仓库获取传送门
徐晓康/Verilog功能模块 - 码云 - 开源中国 (gitee.com) 徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识软件工具等内容欢迎大家关注。
- 上一篇: 网站上怎么做推广html5 网站正在建设中
- 下一篇: 网站上资源截图怎么做友情链接有用吗
相关文章
-
网站上怎么做推广html5 网站正在建设中
网站上怎么做推广html5 网站正在建设中
- 技术栈
- 2026年03月21日
-
网站上用的字体windows优化软件
网站上用的字体windows优化软件
- 技术栈
- 2026年03月21日
-
网站上线注意织梦设置中英文网站
网站上线注意织梦设置中英文网站
- 技术栈
- 2026年03月21日
-
网站上资源截图怎么做友情链接有用吗
网站上资源截图怎么做友情链接有用吗
- 技术栈
- 2026年03月21日
-
网站上做公司宣传网站优化的链接建设
网站上做公司宣传网站优化的链接建设
- 技术栈
- 2026年03月21日
-
网站设计 app开发宿迁软件开发公司
网站设计 app开发宿迁软件开发公司
- 技术栈
- 2026年03月21日
