异步FIFO的verilog实现与简单验证(调试成功)
最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误。
于是自己写了一个调试成功的代码,放上来供大家参考。
非原创 原理参考下面:
原文 https://www.cnblogs.com/SYoong/p/6110328.html
上代码:
module Asyn_FIFO_tb;
parameter WIDTH = ;
reg clk_wr;
reg clk_rd;
reg rst_n_rd;
reg rst_n_wr;
reg [WIDTH-:] data_wr;
reg wr_en;
wire wr_full;
wire [WIDTH-:] data_rd;
reg rd_en;
wire rd_empty;
Asyn_FIFO fifo_inst(
.clk_wr(clk_wr),
.rst_n_rd(rst_n_rd),
.rst_n_wr(rst_n_wr),
.wr_en(wr_en),
.data_wr(data_wr),
.clk_rd(clk_rd),
.rd_en(rd_en),
.data_rd(data_rd),
.rd_empty(rd_empty),
.wr_full(wr_full)
);
initial begin
rst_n_rd = ;
rst_n_wr = ;
clk_wr = ;
clk_rd = ;
wr_en = ;
rd_en = ;
#
rst_n_rd = ;
rst_n_wr = ;
#
wr_en = ;
rd_en = ;
#
wr_en = ;
rd_en = ;
end
always # clk_wr = ~clk_wr;
always # clk_rd = ~clk_rd;
/* always @(posedge clk_rd)
rd_en <= ($random) % 2;
always @(posedge clk_wr)
wr_en <= ($random) % 2; */
always @(posedge clk_wr)
data_wr <= ($random) % ;
endmodule
Asyn_FIFO_tb.v
module Asyn_FIFO
#(
parameter WIDTH = ,
parameter DEPTH =
)
(
input clk_wr,
input clk_rd,
input rst_n_rd,
input rst_n_wr,
input wr_en,
input rd_en,
input [WIDTH-:] data_wr,
output [WIDTH-:] data_rd,
output reg rd_empty,
output reg wr_full
); //defination
reg [WIDTH- : ] mem [ : (<<DEPTH)-]; //2^DEPTH numbers
reg [DEPTH : ] wp, rp;
reg [DEPTH : ] wr1_rp, wr2_rp, rd1_wp, rd2_wp;
reg [DEPTH : ] wbin, rbin; wire [DEPTH- : ] waddr, raddr;
wire [DEPTH : ] wbin_next, rbin_next; //bincode
wire [DEPTH : ] wgray_next, rgray_next; //graycode wire rd_empty_val, wr_full_val; //output
assign data_rd = (rd_en && !rd_empty) ? mem[raddr] : ; //clear "xx" state //input
always@(posedge clk_wr)
if(wr_en && !wr_full)
mem[waddr] <= data_wr; /*----------generate waddr and raddr-------------------------*/
//gen raddr and read gray code
always@(posedge clk_rd or negedge rst_n_rd)
if(!rst_n_rd)
{rbin, rp} <= ;
else
{rbin, rp} <= {rbin_next, rgray_next}; assign raddr = rbin[DEPTH- : ];
assign rbin_next = rbin + (rd_en & ~rd_empty);
assign rgray_next = rbin_next ^ (rbin_next >> ); //gen waddr and write gray code
always@(posedge clk_wr or negedge rst_n_wr)
if(!rst_n_wr)
{wbin, wp} <= ;
else
{wbin, wp} <= {wbin_next, wgray_next}; assign waddr = wbin[DEPTH- : ];
assign wbin_next = wbin + (wr_en & ~wr_full);
assign wgray_next = wbin_next ^ (wbin_next >> ); /*---------------synchro rp and wp--------------------------*/
//synchro rp
always@(posedge clk_wr or negedge rst_n_wr)
if(!rst_n_wr)
{wr2_rp, wr1_rp} <= ;
else
{wr2_rp, wr1_rp} <= {wr1_rp, rp}; //delay two clock //synchro wp
always@(posedge clk_rd or negedge rst_n_rd)
if(!rst_n_rd)
{rd2_wp, rd1_wp} <= ;
else
{rd2_wp, rd1_wp} <= {rd1_wp, wp}; /*---------------empty and full flags--------------------------*/
//gen rd_empty
assign rd_empty_val = (rd2_wp == rgray_next);
always@(posedge clk_rd or negedge rst_n_rd)
if(!rst_n_rd)
rd_empty <= 'b1;
else
rd_empty <= rd_empty_val; //gen wr_full, two high bit do not equal
assign wr_full_val = ({~wr2_rp[DEPTH : DEPTH-], wr2_rp[DEPTH- : ]} == wgray_next);
always@(posedge clk_wr or negedge rst_n_wr)
if(!rst_n_wr)
wr_full <= 'b0;
else
wr_full <= wr_full_val; endmodule
Asyn_FIFO.v
注意wire、reg类型的赋值。
异步FIFO的verilog实现与简单验证(调试成功)的更多相关文章
- 异步FIFO及verilog原码
这几天看了Clifford E. Cummings的两篇大作<Simulation and Synthesis Techniques for Asynchronous FIFO Design&g ...
- 异步FIFO总结+Verilog实现
异步FIFO简介 异步FIFO(First In First Out)可以很好解决多比特数据跨时钟域的数据传输与同步问题.异步FIFO的作用就像一个蓄水池,用于调节上下游水量. FIFO FIFO是一 ...
- 异步fifo的Verilog实现
一.分析 由于是异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题,如何解决? 跨时钟域的问题:由于读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO ...
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- 基于FPGA的异步FIFO验证
现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...
- Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...
- 怎么用Verilog语言描述同步FIFO和异步FIFO
感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...
- Verilog设计异步FIFO
转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...
- 异步fifo的设计
本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据) ...
随机推荐
- leetcode 890. 查找和替换模式 Python
用模式的每个字母去当做key对应单词列表的每个字母value, 如果放进dict之前检测到key已经存在,就检测Word[i][j]是否是和已经存在的value一致,不一致就代表不匹配,break检查 ...
- Java邮件发送
Java中发送邮件的方法之一,需要用到spring框架集成的JavaMailSenderImpl.SimpleMailMessage两个实现类. 一,创建一个service,代码如下: public ...
- c#+cad2010+MQ接收消息
cad2015+版本可以使用TrayItem气泡显示消息 static TrayItem trayItem = new TrayItem(); public static void testtrayi ...
- 乘法DAC一点知识
在应用电路中发现乘法DAC,以前没有用过所谓的乘法DAC.查过资料发现,其实所有的DAC都可以看作是个“乘法器”-------将输入数字量与基准电压相乘. 一般DAC的输出是VOUT=VREF*D/M ...
- CSS3之3D立方体效果
下面代码可实现3D立方体,比较好理解,就是让每个面先平移到指定位置,然后旋转90度 <!DOCTYPE html> <html lang="en"> < ...
- LayaAir疑难杂症之三:1.7版本click()、execCommand('copy')函数不生效
问题描述 在使用Laya1.7引擎开发H5游戏时,引入Js原生函数click( ),模拟一次点击事件,发现无效.在使用Laya1.7引擎开发H5游戏时,引入Js原生函数execCommand('cop ...
- 2018-2019-2 网络对抗技术 20164313 杜桂鑫 Exp1 PC平台逆向破解
实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 实践的目标就是运行程序中另一代码片段ge ...
- 编译APR包报错 rm: cannot remove `libtoolT': No such file or directory
centos 6 编译APR包报错 在当前apr 目录 : #Vi configure +31880 ,注释掉此行 再次编译即可.
- 【学习】数据规整化:清理、转换、合并、重塑(续)【pandas】
@合并重叠数据 还有一种数据组合问题不能用简单的合并或连接运算来处理.比如说,你可能有索引全部或部分重叠的两个数据集 使用numpy的where函数,它用于表达一种矢量化的if - else a = ...
- spring命名空间
作为一名入门级菜鸟的我,在刚开始学spring框架的时候,对于命名空间不是很理解,只是在跟着老师敲代码.随着后来学习的深入,慢慢了解到命名空间的意义.如果你没有引入相应的命名空间,就不能引用相应的标签 ...