FPGA学习:基于FPGA的异步FIFO设计

异步FIFO相比与同步FIFO,其实用性更为广泛,因其可以解决不同时钟域之间的数据传输。

 编译代码:

 

 Testbench:

`timescale  1ns / 1ps

module tb_FIFO;

// FIFO Parameters
parameter PERIOD = 10;
parameter WIDTH = 8;
parameter DEPTH = 16;
// FIFO Inputs
reg   sys_clk                              = 0 ;
reg   sys_rst                              = 0 ;
reg   [WIDTH-1:0]  data_in                 = 0 ;
// FIFO Outputs
wire  [WIDTH-1:0]  data_out                ;
wire  wr_en                                ;
wire  rd_en                                ;
wire  [$clog2(DEPTH)-1:0]  rd_addr         ;
wire  [$clog2(DEPTH)-1:0]  wr_addr         ;
wire  empty                                ;
wire  full                                 ;
wire  clk                                  ;
wire  [$clog2(DEPTH):0]  wr_addr1          ;
wire  [$clog2(DEPTH):0]  wr_addr2          ;
wire  [$clog2(DEPTH):0]  rd_addr1          ;
wire  [$clog2(DEPTH):0]  rd_addr2          ;

initial
begin
    forever #(PERIOD/2)  sys_clk=~sys_clk;
end

initial
begin
    #(PERIOD*2) sys_rst  =  1;
end

test  u_test (
    .sys_clk                 ( sys_clk                       ),
    .sys_rst                 ( sys_rst                       ),
    .data_in                 ( data_in   [WIDTH-1:0]         ),

    .clk                     ( clk                           ),
    .data_out                ( data_out  [WIDTH-1:0]         ),
    .wr_en                   ( wr_en                         ),
    .rd_en                   ( rd_en                         ),
    .rd_addr                 ( rd_addr   [$clog2(DEPTH)-1:0] ),
    .wr_addr                 ( wr_addr   [$clog2(DEPTH)-1:0] ),
    .empty                   ( empty                         ),
    .full                    ( full                          ),
    .wr_addr1                ( wr_addr1  [$clog2(DEPTH):0]   ),
    .wr_addr2                ( wr_addr2  [$clog2(DEPTH):0]   ),
    .rd_addr1                ( rd_addr1  [$clog2(DEPTH):0]   ),
    .rd_addr2                ( rd_addr2  [$clog2(DEPTH):0]   )
);

initial
begin
    #20 
    data_in = 8'b 11101010;
    #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101110;    
        #20 
    data_in = 8'b 10101010;
        #20 
    data_in = 8'b 11001010;
        #20 
    data_in = 8'b 01101010;
        #20 
    data_in = 8'b 10001010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101011;
        #20 
    data_in = 8'b 11111111;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101010;
    #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101110;    
        #20 
    data_in = 8'b 10101010;
        #20 
    data_in = 8'b 11001010;
        #20 
    data_in = 8'b 01101010;
        #20 
    data_in = 8'b 10001010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101011;
        #20 
    data_in = 8'b 11111111;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101010;
    #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101110;    
        #20 
    data_in = 8'b 10101010;
        #20 
    data_in = 8'b 11001010;
        #20 
    data_in = 8'b 01101010;
        #20 
    data_in = 8'b 10001010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101011;
        #20 
    data_in = 8'b 11111111;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101010;
    #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11101110;    
        #20 
    data_in = 8'b 10101010;
        #20 
    data_in = 8'b 11001010;
        #20 
    data_in = 8'b 01101010;
        #20 
    data_in = 8'b 10001010;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101110;
        #20 
    data_in = 8'b 11101010;
        #20 
    data_in = 8'b 11111010;
        #20 
    data_in = 8'b 11101011;
        #20 
    data_in = 8'b 11111111;
        #20 
    data_in = 8'b 11101010;
    $finish;
end

endmodule

仿真结果:

 

 总结:读时钟是写时钟的一半,使能信号可根据自己需求进行更改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值