异步FIFO(verilog简单实现)_verilog 简单fifo-程序员宅基地

技术标签: fpga开发  面试  fifo  芯片  数字IC/FPGA  verilog  

对其他网友的代码进行了改进纠正,使代码更加完整,并用vivado2020.1进行了仿真测试

源代码(不到100行):

`timescale 1ns/1ps
module test #(parameter  data_width =4,depth =8,addr_width=3)(
    wclk,rst_w,w_en,din,w_ptr,
    rclk,rst_r,r_en,dout,r_ptr,
    fifo_empty,fifo_full
);
input wclk,rst_w,w_en;
input rclk,rst_r,r_en;
input [data_width-1:0]din;
output fifo_empty,fifo_full;
output reg[data_width-1:0]dout;
output reg [addr_width:0]w_ptr,r_ptr;//读写指针

wire [addr_width:0] w_ptr2gray, r_ptr2gray;
reg [addr_width:0] w_ptr2gray1,w_ptr2gray2;
reg [addr_width:0] r_ptr2gray1,r_ptr2gray2;

wire [addr_width-1:0] w_addr,r_addr;//读写地址

reg [data_width-1:0]ram[depth-1:0];//ram存储器
//地址与指针的关系
assign w_addr=w_ptr[addr_width-1:0];
assign r_addr=r_ptr[addr_width-1:0];

//二进制码->格雷码
assign w_ptr2gray=w_ptr^(w_ptr>>1);
assign r_ptr2gray=r_ptr^(r_ptr>>1);

//格雷码同步,w_ptr同步到rclk时钟域
always @(posedge rclk or negedge rst_r) begin
    if(!rst_r)begin
        w_ptr2gray1<=0;
        w_ptr2gray2<=0;
    end
    else begin
        w_ptr2gray1<=w_ptr2gray;
        w_ptr2gray2<=w_ptr2gray1;
    end   
end

//格雷码同步,r_ptr同步到wclk时钟域
always @(posedge wclk or negedge rst_w) begin
    if(!rst_w)begin
        r_ptr2gray1<=0;
        r_ptr2gray2<=0;
    end
    else begin
        r_ptr2gray1<=r_ptr2gray;
        r_ptr2gray2<=r_ptr2gray1;
    end   
end

//写FIFO
always @(posedge wclk or negedge rst_w) begin
    if(!rst_w)begin
        w_ptr<=0;
    end
    else if(w_en && !fifo_full) begin
        ram[w_addr]<=din;
        w_ptr<=w_ptr+1;
    end
    else begin
        w_ptr<=w_ptr;
        ram[w_addr]<=ram[w_addr];
    end
end

//读FIFO
always @(posedge rclk or negedge rst_r) begin
    if(!rst_r)begin
        r_ptr<=0;
        dout<=0;
    end
    else if(r_en && !fifo_empty) begin
        dout<=ram[r_addr];
        r_ptr<=r_ptr+1;
    end
    else begin
        r_ptr<=r_ptr;
    end
end

//产生fifo_empty、fifo_full
assign fifo_empty=(w_ptr2gray2 == r_ptr2gray);
assign fifo_full=({
    ~w_ptr2gray[addr_width:addr_width-1],w_ptr2gray[addr_width-2:0]} == r_ptr2gray2 );

endmodule

仿真测试:

`timescale 1ns / 1ps

module test_sim;
parameter  data_width =4,depth =8,addr_width=3;
reg wclk,rst_w,w_en;
reg rclk,rst_r,r_en;
reg [data_width-1:0]din;
wire fifo_empty,fifo_full;
wire[data_width-1:0]dout;
wire [addr_width:0]w_ptr,r_ptr;//读写指针

always #10 wclk=~wclk;
always #4 rclk=~rclk;
always @(posedge wclk) begin
    din<={
    $random%16};   
end
initial begin
    wclk=0;rclk=0;
    rst_w=1;rst_r=1;
    din=0;
    {
    w_en,r_en}=2'b00;
    #4 rst_w=0;rst_r=0; 
    #10 rst_w=1;rst_r=1;

    #200 {
    w_en,r_en}=2'b10;
    #200 {
    w_en,r_en}=2'b01;
    #100 {
    w_en,r_en}=2'b11;
  //  #200 $stop;
end

test m1(
   .wclk(wclk),
   .rst_w(rst_w),
   .w_en(w_en),
   .din(din),
   .w_ptr(w_ptr),
   .rclk(rclk),
   .rst_r(rst_r),
   .r_en(r_en),
   .dout(dout),
   .r_ptr(r_ptr),
   .fifo_empty(fifo_empty),
   .fifo_full(fifo_full)
);
endmodule

vivado2020仿真结果

在这里插入图片描述
在这里插入图片描述

理论讲解请参考:

异步FIFO—Verilog实现
同步FIFO与异步FIFO
【FPGA——基础篇】同步FIFO与异步FIFO——Verilog实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42443400/article/details/120477326

智能推荐

python模块requests测试接口时Session传递_requests将session传递给函数-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏13次。在测试接口时需要有些接口需要登录后方可操作,这时需要将登录的session进行传递,可以直接获取登录后的cookie,也可以使用requests.Session():1. 直接获取登录的cookie进行传递,如下代码:2. 通过方法Session()进行传递:通过对比可以知道:方法一:最主要的缺点是当接口用例很多的时候,都需要带上login(),那么就意味着每调用一个接口都得必须执行login()..._requests将session传递给函数

Qt 调用动态库_qt pro plugin 动态库 一个-程序员宅基地

文章浏览阅读930次。在.pro文件中修改//添加相关头文件INCLUDEPATH += /home/will/Projects/pluginTest/ //添加动态库LIBS += -L/home/will/Projects/build-pluginTest-Desktop-Debug -lpluginTest_qt pro plugin 动态库 一个

用python进行分析电信行业的用户流失预测(二)--数据可视化_电信用户流失预测案例(2)-程序员宅基地

文章浏览阅读6.5k次,点赞5次,收藏92次。文章目录前言四、数据可视化呈现1、查看流失客户占比2、性别、老年人、配偶、亲属对流客户流失率的影响3、提取特征4、构造相关性矩阵5、使用热地图显示相关系数6、使用one-hot编码7、电信用户是否流失与各变量之间的相关性8、网络安全服务、在线备份业务、设备保护业务、技术支持服务、网络电视、网络电影和无互联网服务对客户流失率的影响前言这篇文章紧跟用python进行分析的用户流失预测实操,以电信行业为例的后续内容,聚焦可视化操作。四、数据可视化呈现1、查看流失客户占比##数据可视化分析# #1,查看_电信用户流失预测案例(2)

[1057]VMware安装的虚拟机窗口如何自适应屏幕大小_vmware虚拟机窗口自适应-程序员宅基地

文章浏览阅读1.5w次,点赞11次,收藏30次。vmware是一款非常好用的虚拟机,大部分用户都会用vmware安装各种操作系统,安装后可能会出现一个问题,就是主机屏幕太小,无法完整显示VMware虚拟机界面,这时候就可以设置让VMware自动适应主机窗口,一起来了解下。设置步骤如下:1、首先需要开启需要设置的虚拟机;2、然后点击虚拟机—安装VMware Tools,如果显示重新安装,则表示已经安装完成,直接看下一步;3、点击查看,可以选择立即适应客户机和立即适应窗口,没有安装VMware时,这些选项是灰色不可选;4、也可以直接选择自动调_vmware虚拟机窗口自适应

对Unity3D 中Quaternion一些整理_unity quaternion. eularangle-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏8次。Quaternion 中文是四元数。记得计算机图形学中,在X,Y,Z的基础上添加了新的一个W。这样算是所谓的四元数。具体的解释可以参考,百科等。Quaternion.AngleAxis ,AngleAxis角轴 绕Axis轴,旋转Angle角度。例如:绕Y轴旋转30度。 transform.rotation = Quaternion.AngleAxis(30,Vector3.up);//_unity quaternion. eularangle

从源码编译 skywalking 8.x_skywalking8.x jdk版本-程序员宅基地

文章浏览阅读1k次。emmm,之前没搞过,花了不少时间踩坑。 第一个坑是安装 jdk,以前都是在 linux 下,直接安装 openjdk 就可以使用了,但是在 windows 下找起来就麻烦了。 oracle 官网能下载,但是它需要登录之后才能下载。中途绕了很多路,我就只记录一下正确的过程。 搭建环境 从 oracle 官网下载jdk8。注意,官网下载是需要账号的。这里提供一个网站,上面有共享账号。而且记得要设置环境变量,安装好 jdk 之后,测试一下java和javac两个命令是否都可以..._skywalking8.x jdk版本

随便推点

中国图书分类法--计算机与数学_算法属于图书的什么类别-程序员宅基地

文章浏览阅读1w次。计算机TP 自动化技术、计算机技术 [TP-9] 自动化技术经济 TP1 自动化基础理论 TP11 自动化系统理论 TP13 自动控制理论 TP14 自动信息理论 TP15 自动模拟理论(自动仿真理论) TP17 开关电路理论 TP18 人工智_算法属于图书的什么类别

mui开发注意事项_mui h5开发注意点-程序员宅基地

文章浏览阅读182次。出自:https://blog.csdn.net/hbcui1984/article/details/42156409mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验;这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文;想了解mui更详细的信息,请访问mui官网DOM结构关于mui页面的dom,你需要知道如下规则。固定栏靠前所谓的固定栏,也就是带有.mui-bar属..._mui h5开发注意点

vue使用vconsole调试页面_vue 通过 vconsole的控制器打开一个新页面-程序员宅基地

文章浏览阅读5.9k次,点赞3次,收藏5次。安装cnpm i vconsolesrc/main.js引用import Vconsole from 'vconsole';const vConsole = new Vconsole();Vue.use(vConsole)ojbk_vue 通过 vconsole的控制器打开一个新页面

如何将网页保存成mhtml格式-程序员宅基地

文章浏览阅读1.2k次。如何将网页保存成mhtml格式网页归档(英语:MIME HTML或MIME Encapsulation of Aggregate HTML Documents,又..._保存网页为mhtml

python 找到符合条件的索引_numpy中实现ndarray数组返回符合特定条件的索引方法...-程序员宅基地

文章浏览阅读1.7k次。下面为大家分享一篇numpy中实现ndarray数组返回符合特定条件的索引方法,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引很有用,对于返回一定区间内值的索引不是很有效,至少我没有弄明白应该如何操作尴尬。下面先说一下where函数的用法吧。(1)wh..._python array中满足条件的元素索引

JDK源码阅读:源码阅读环境准备_jdk 源码 环境-程序员宅基地

文章浏览阅读158次。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFRQuk1y-1680535535385)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke//image_1617714402312.png)]关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(这个时候再debug,发现就能看到变量了。_jdk 源码 环境