八、FPGA设计之FIFO

本文详细介绍了在FPGA设计中如何自定义FIFO,包括使用Verilog语言实现模块,参数化宽度和深度,以及读写地址和满空标志的管理。通过代码示例展示了FIFO的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FIFO的设计有两种:

                         第一种,调用系统自带的IP;

                        第二种,用户自行设计;

对于用户自行设计,这里本人给出了自行设计代码,自行设计包括的部分有:

module fifo_verilog(clk,rst_n,wren,rden,full,empty,data,q);
             
             parameter WIDTH=8;
             
             parameter DEPTH=8;
             parameter ADDR=3;
             
             
             input clk;
             input rst_n;
             input wren;
             input rden;


             input[WIDTH-1:0]data;
             output full;
             output empty;
             output[WIDTH-1:0]q;
             reg[WIDTH-1:0]q;
             
             
             reg[WIDTH-1:0]mem_data[DEPTH-1:0];
             reg[ADDR-1:0]waddr,raddr;
             
             reg full,empty;
             
             
             always@(posedge clk or negedge rst_n)
                      if(rst_n==1'b0)
                           waddr<=3'd0;
                       else if(wren==1'b1)
                           waddr<=waddr+1;
                           
                           
            always@(posedge clk)
                     if(wren==1'b1)
                          mem_data[waddr]<=data;
                          
            always@(posedge clk or negedge rst_n)
                     if(rst_n==1'b0)
                          raddr<=3'd0;
                     else if(rden==1'b1)
                          raddr<=raddr+1;
                          
                          
           always@(posedge clk )
                   if(rden==1'b1)
                       q<=mem_data[raddr];
                       
                       
           always@(posedge clk or negedge rst_n)
                     if(rst_n==1'b0)
                        full<=1'b0;
                     else if(((wren&!rden)&&(waddr==raddr-1))||((waddr==DEPTH-1)&&(raddr==1'b0)))
                        full<=1'b1;
                     else
                        full<=1'b0;
                        
                        
          always@(posedge clk or negedge rst_n)
                     if(rst_n==1'b0)
                         empty<=1'b1;
                     else if(((!wren&rden)&&(waddr==raddr+1))||((raddr==DEPTH-1)&&(waddr==1'b0)))
                         empty<=1'b0;
                     else
                         empty<=1'b1;
             
endmodule




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值