Verilog中的异步时钟FIFO(输入8*256,输出16*128)

1. 调用vavido中的IP核

IP核中说明了写的真实位宽为255,读的真实位宽为127
其他设置为默认,但是接出了一个 wr_data_count[7:0] 引脚
在这里插入图片描述
在这里插入图片描述

2. fifo_8to16.v 文件

module  fifo_8to16
(
    input   wire            wr_clk      ,
    input   wire            srst        ,
    input   wire            wr_en       ,
    input   wire    [7:0]   wr_data     ,
    input   wire            rd_clk      ,
    input   wire            rd_en       ,
    
    output  wire    [15:0]  rd_data     ,
    output  wire            full     ,
    output  wire            empty    ,
    output  wire    [7:0]   wr_data_count     
);



fifo_8x256to16x128 fifo_8to16_inst (
    .rst    (srst    ),      // input wire rst
    .wr_clk (wr_clk ),      // input wire wr_clk
    .rd_clk (rd_clk ),      // input wire rd_clk
    .din    (wr_data    ),      // input wire [7 : 0] din
    .wr_en  (wr_en  ),      // input wire wr_en
    .rd_en  (rd_en  ),      // input wire rd_en
    .dout   (rd_data   ),      // output wire [15 : 0] dout
    .full   (full   ),      // output wire full
    .empty  (empty  ),       // output wire empty
    .wr_data_count(wr_data_count)  // output wire [7 : 0] wr_data_count
);


endmodule

3. tb_fifo_8to16.v 文件

always@(posedge rd_clk or posedge srst)
    if(srst == 1'b1)
        begin
            wr_full_reg0 <= 1'b0;
            wr_full_reg1 <= 1'b0;
        end
    else
        begin
            wr_full_reg0 <= full;
            wr_full_reg1 <= wr_full_reg0;
        end

这里的 wr_full_reg0 和 wr_full_reg1 主要为了同步时钟

`timescale  1ns/1ns
module  tb_fifo_8to16();

reg             wr_clk      ;
reg             wr_en       ;
reg             rd_clk      ;
reg             rd_en       ;
reg     [7:0]   wr_data     ;
reg             srst        ;

wire    [15:0]  rd_data     ;
wire            full        ;
wire            empty       ;
wire    [7:0]   wr_data_count    ;

reg     [1:0]   cnt         ;

reg             wr_full_reg0;
reg             wr_full_reg1;


initial
    begin
        wr_clk = 1'b1;
        rd_clk = 1'b1;
        srst <= 1'b1;
        #100
        srst <= 1'b0;
    end

always #10 wr_clk = ~wr_clk;
always #20 rd_clk = ~rd_clk;

//cnt
always@(posedge wr_clk or posedge srst)
    if(srst == 1'b1)
        cnt <= 2'd0;
    else    if(cnt == 2'd3)
        cnt <= 2'd0;
    else
        cnt <= cnt + 1'b1;

//wr_en
always@(posedge wr_clk or posedge srst)
    if(srst == 1'b1)
        wr_en <= 1'b0;
    else    if(cnt == 2'd3 && rd_en == 1'b0 && wr_full_reg1 == 1'b0)
        wr_en <= 1'b1;
    else
        wr_en <= 1'b0;

//wr_data
always@(posedge wr_clk or posedge srst)
    if(srst == 1'b1)
        wr_data <= 8'd0;
    else    if(wr_data == 8'd255 && wr_en == 1'b1)
        wr_data <= 8'd0;
    else    if(wr_en == 1'b1)
        wr_data <= wr_data + 1'b1;

always@(posedge rd_clk or posedge srst)
    if(srst == 1'b1)
        begin
            wr_full_reg0 <= 1'b0;
            wr_full_reg1 <= 1'b0;
        end
    else
        begin
            wr_full_reg0 <= full;
            wr_full_reg1 <= wr_full_reg0;
        end


//rd_en
always@(posedge rd_clk or posedge srst)
    if(srst == 1'b1)
        rd_en <= 1'b0;
    else    if(wr_full_reg1 == 1'b1)
        rd_en <= 1'b1;
    else    if(empty == 1'b1)
        rd_en <= 1'b0;

fifo_8to16  fifo_8to16_inst
(
    .wr_clk     (wr_clk  ),
    .srst       (srst    ),
    .wr_en      (wr_en   ),
    .wr_data    (wr_data ),
    .rd_clk     (rd_clk  ),
    .rd_en      (rd_en   ),

    .rd_data    (rd_data ),
    .full    (full ),
    .empty   (empty),
    .wr_data_count(wr_data_count)
);

endmodule

4. vavido 仿真波形

当 full 信号复位后开始写数据,写入的第一个数据为0
在这里插入图片描述
当写入254时,full信号置1,延迟3个 rd_clk 周期后,读使能信号 rd_en 置1
1个 rd_clk 周期后,读取到16位数据 hex01,即1;
又1个 rd_clk 周期后,读取到16位数据 hex23,即515
在这里插入图片描述
最后的读取有一点问题
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值