用Verilog实现一个同步FIFO,深度16,数据位宽8bit

module syn_fifo(
    input clk,
    input rst_n,
    input [7:0] din,
    input wr_en,
    input rd_en,
    output [7:0] dout,
    output full,
    output empty
    );
    
    reg wr_en_r;
    reg rd_en_r;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) wr_en_r <= 0;
        else wr_en_r <= wr_en;
    end
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) rd_en_r <= 0;
        else rd_en_r <= rd_en;
    end    
    reg [3:0] status_cnt;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) status_cnt <= 0;
        else if(wr_en_r && !rd_en && status_cnt != 4'd15 )
            status_cnt <= status_cnt + 1'b1;
        else if(rd_en_r && !wr_en && status_cnt != 0 )
            status_cnt <= status_cnt - 1'b1;
         else status_cnt <= status_cnt;
    end
    wire full_r1;
    reg full_r2;
    assign full_r1 = (status_cnt == 15)?1'b1:1'b0;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) full_r2 <= 0;
        else full_r2 <= full_r1;
    end
    assign full = full_r1 && full_r2;    
        
    wire empty_r1;
    reg empty_r2;
    assign empty_r1 = (status_cnt == 0)?1'b1:1'b0;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) empty_r2 <= 1;
        else empty_r2 <= empty_r1;
    end
    assign empty = empty_r1 && empty_r2;
            
    reg [3:0] wr_cnt;
    reg [3:0] rd_cnt;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) wr_cnt <= 0;
        else if (wr_en && !full)begin
            if(wr_cnt < 15) wr_cnt <= wr_cnt + 1'b1;
            else wr_cnt <= 0;
        end
        else wr_cnt <= wr_cnt;
    end   
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) rd_cnt <= 0;
        else if (rd_en && !empty)begin
            if(rd_cnt < 15) rd_cnt <= rd_cnt + 1'b1;
            else rd_cnt <= 0;
        end
        else rd_cnt <= rd_cnt;
    end
//write    
    reg [7:0] DATA [15:0];
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) begin
            DATA[0] <= 0;
            DATA[1] <= 0;
            DATA[2] <= 0;
            DATA[3] <= 0;
            DATA[4] <= 0;
            DATA[5] <= 0;
            DATA[6] <= 0;
            DATA[7] <= 0;
            DATA[8] <= 0;
            DATA[9] <= 0;
            DATA[10] <= 0;
            DATA[11] <= 0;
            DATA[12] <= 0;
            DATA[13] <= 0;
            DATA[14] <= 0;
            DATA[15] <= 0;
        end
        else if(wr_en && !full)
            DATA[wr_cnt] <= din;
    end
//READ
    reg [7:0] data_r;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) data_r <= 0;
        else if(rd_en_r && !empty)
            data_r <= DATA[rd_cnt];
//        else data_r <= 0;
        else data_r <= data_r;
    end
    assign dout = data_r;
endmodule

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
可以,下面是一个简单的Verilog代码实现异步FIFO的例子: ``` module async_fifo ( input clk, input rst, input wr_en, input rd_en, input [31:0] wr_data, output reg [31:0] rd_data, output reg full, output reg empty ); parameter DEPTH = 1024; reg [31:0] mem [0:DEPTH-1]; reg [9:0] wr_ptr = 0; reg [9:0] rd_ptr = 0; reg [31:0] wr_data_reg = 0; reg [1:0] count = 0; always @(posedge clk or negedge rst) begin if (!rst) begin wr_ptr <= 0; rd_ptr <= 0; wr_data_reg <= 0; count <= 0; full <= 0; empty <= 1; end else begin if (wr_en) begin mem[wr_ptr] <= wr_data; wr_ptr <= wr_ptr + 1; if (wr_ptr == DEPTH) begin wr_ptr <= 0; end count <= count + 1; if (count == DEPTH) begin full <= 1; empty <= 0; end end if (rd_en) begin rd_data <= mem[rd_ptr]; rd_ptr <= rd_ptr + 1; if (rd_ptr == DEPTH) begin rd_ptr <= 0; end count <= count - 1; if (count == 1) begin full <= 0; empty <= 1; end end end end endmodule ``` 这个代码实现一个深度为1024、数据宽度为32位的异步FIFO。它有两个输入端口:`wr_en`和`rd_en`,用于控制写入和读出;一个输入端口`wr_data`,用于输入数据一个输出端口`rd_data`,用于输出数据;还有两个输出端口`full`和`empty`,表示FIFO是否已满或为空。 当`wr_en`为1时,将数据写入FIFO;当`rd_en`为1时,从FIFO中读出数据数据的写入和读出都是异步的,即不需要时钟同步。 这个代码中使用了一个基本的循环队列实现FIFO,使用`wr_ptr`和`rd_ptr`指向下一个写入和读出的位置。`count`表示当前FIFO中的数据个数。当FIFO满时,`full`为1,当FIFO为空时,`empty`为1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值