33.异步FIFO IP核的配置、调用与仿真

(1)异步FIFO的配置过程:

ps:异步fifo相比较同步fifo少一个实际深度

(2)异步FIFO的调用:

module dcfifo
(
    input               wr_clk          ,
    input               rd_clk          ,
    input       [7:0]   data_in         ,
    input               wr_en           ,
    input               rd_en           ,
    
    output      [15:0]  data_out        ,
    output              full            ,
    output              empty           ,
    output      [6:0]   rd_data_count   ,
    output      [7:0]   wr_data_count     
);

dcfifo_8x256_to_16x128 dcfifo_8x256_to_16x128_inst (
  .wr_clk                   (wr_clk         ),                // input wire wr_clk
  .rd_clk                   (rd_clk         ),                // input wire rd_clk
  .din                      (data_in        ),                      // input wire [7 : 0] din
  .wr_en                    (wr_en          ),                  // input wire wr_en
  .rd_en                    (rd_en          ),                  // input wire rd_en
  .dout                     (data_out       ),                    // output wire [15 : 0] dout
  .full                     (full           ),                    // output wire full
  .empty                    (empty          ),                  // output wire empty
  .rd_data_count            (rd_data_count  ),  // output wire [6 : 0] rd_data_count
  .wr_data_count            (wr_data_count  )  // output wire [7 : 0] wr_data_count
);

endmodule

(3)异步FIFP仿真文件代码:

`timescale 1ns / 1ps

module dcfifo_tb;

reg         wr_clk          ;
reg         rd_clk          ;
reg [7:0]   data_in         ;
reg         wr_en           ;
reg         rd_en           ;
reg         reset_n         ;
reg [1:0]   cnt             ;
reg         full_reg0       ;
reg         full_reg1       ;

wire [15:0] data_out        ;
wire        full            ;
wire        empty           ;
wire [6:0]  rd_data_count   ;
wire [7:0]  wr_data_count   ;

//50MHz读时钟
    initial wr_clk = 1'd1;
    always #10 wr_clk = ~wr_clk;
    
//25MHz写时钟   
    initial rd_clk = 1'd1;
    always #20 rd_clk = ~rd_clk;
    
//复位信号
    initial begin 
        reset_n <= 1'd0;
        #15;
        reset_n <= 1'd1;
        #100_000;
        $stop;
    end
    
//cnt信号    
    always@(posedge wr_clk or negedge reset_n)
        if(!reset_n)
            cnt <= 2'd0;
        else if(cnt == 2'd3)
            cnt <= 2'd0;
        else    
            cnt <= cnt + 2'd1;
            
//wr_en信号
    always@(posedge wr_clk or negedge reset_n)
        if(!reset_n)
            wr_en <= 1'd0;
        else if((cnt == 2'd3) && (rd_en == 1'd0))
            wr_en <= 1'd1;
        else 
            wr_en <= 1'd0;
            
//data_in信号
    always@(posedge wr_clk or negedge reset_n)
        if(!reset_n)
            data_in <= 8'd0;
        else if((data_in == 8'd255) && (wr_en == 1'd1))
            data_in <= 8'd0;
        else if(wr_en == 1'd1)
            data_in <= data_in + 8'd1;
        else    
            data_in <= data_in;
            
//full_reg0、full_reg1信号设计
    always@(posedge rd_clk or negedge reset_n)
        if(!reset_n)begin
            full_reg0 <= 1'd0;
            full_reg1 <= 1'd0;      
        end
        else begin
            full_reg0 <= full;
            full_reg1 <= full_reg0;
        end
            

//rd_en信号
    always@(posedge rd_clk or negedge reset_n)
        if(!reset_n)
            rd_en <= 1'd0;
        else if(full_reg1 && (wr_en == 1'd0))
            rd_en <= 1'd1;
        else if(empty)
            rd_en <= 1'd0;
        else 
            rd_en <= rd_en;
            
            
dcfifo dcfifo_inst
(
    .wr_clk          (wr_clk  ),
    .rd_clk          (rd_clk  ),
    .data_in         (data_in ),
    .wr_en           (wr_en   ),
    .rd_en           (rd_en   ),
    
    .data_out        (data_out     ),
    .full            (full         ),
    .empty           (empty        ),
    .rd_data_count   (rd_data_count),
    .wr_data_count   (wr_data_count)  
);



endmodule

(4)仿真波形:

异步FIFO IP核调用中,首先需要进行FIFO IP核的参数配置。然后,编写顶层模块的FIFO调用代码。这个代码示例如下: module fifo ( input wire sys_clk, input wire sys_clk2, input wire [7:0 pi_data, input wire rd_req, input wire wr_req, output wire empty, output wire full, output wire [7:0 po_data, output wire [7:0 usedw ); dcfifo_8x256 dcfifo_8x256_inst ( .clock1 (sys_clk), .clock2 (sys_clk2), .data (pi_data), .rdreq (rd_req), .wrreq (wr_req), .empty (empty), .full (full), .q (po_data), .usedw (usedw) ); endmodule 在这个顶层模块的FIFO调用代码中,我们使用了异步FIFO IP核,其中包括两个时钟信号:sys_clk和sys_clk2。同时,还有输入信号,如写请求信号(wr_req)、读请求信号(rd_req)和输入数据信号(pi_data),以及输出信号,如空状态信号(empty)、满状态信号(full)、输出数据信号(po_data)和已使用字节信号(usedw)。通过这个FIFO调用代码,可以实现对异步FIFO IP核调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [FIFO IP 核的调用](https://blog.csdn.net/ziyouruf/article/details/123862569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [FPGAFIFO IP核配置调用](https://blog.csdn.net/m0_72885897/article/details/128649678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值