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)仿真波形:

相关推荐

  1. 仿真】verilog调用creference module

    2024-07-14 15:38:04       65 阅读
  2. 轻量脚本语言Lua配置c++调用

    2024-07-14 15:38:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 15:38:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 15:38:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 15:38:04       58 阅读
  4. Python语言-面向对象

    2024-07-14 15:38:04       69 阅读

热门阅读

  1. Leetcode【最长回文子串】

    2024-07-14 15:38:04       20 阅读
  2. Matlab中产生高斯白噪声信号的方法和其功率计算

    2024-07-14 15:38:04       27 阅读
  3. 大模型日报 2024-07-12

    2024-07-14 15:38:04       23 阅读
  4. 代码随想录刷题day10

    2024-07-14 15:38:04       23 阅读
  5. Rust编程-I/O

    2024-07-14 15:38:04       17 阅读
  6. Lua协程(同步的多线程)

    2024-07-14 15:38:04       18 阅读
  7. 如何利用Gunicorn的日志记录监控Web应用

    2024-07-14 15:38:04       18 阅读
  8. AMD CPU加 vega 显卡运行ollama本地大模型

    2024-07-14 15:38:04       22 阅读