FPGA中通过按键控制异步FIFO 按一下按键 FIFO就读出一个数据

`timescale 1ns / 1ps



module fifo_crtl(
             input               sysclk        ,
             input               rst_n         ,
             input               key_flag           ,//按键消抖的有效信号
             input   [7:0]      rx_data         ,//rx发送过来的有效数据
             input              rx_done        ,//rx发送数据的信号  
             output             tx_start         , //给tx的开始信号                
             output    [7:0]     tx_data           //发送给tx的数据

    );
//             wire          key_flag;//按键有效信号
             wire              wr_en  ;//写使能
             wire              rd_en  ;//读使能    
            
             wire    valid         ; 
 
            // wr_en
            //写操作,时钟上升沿 当wr_en拉高,就能把数据写入FIFO中,一定确保full==0
         assign wr_en = (!full)?rx_done:0;
         
        
         //rd_en
         //读操作,时钟上升沿 当rd_en拉高,就能把数据读出FIFO中,一定确保empty=0
         assign rd_en = (!empty)?key_flag:0;
         assign tx_start=valid;   
        
            
    
 fifo_generator_1 your_instance_name (
  .clk(sysclk),                    // input wire clk
  .rst(~rst_n),                    // input wire rst
  .din(rx_data),                    // input wire [7 : 0] din
  .wr_en(wr_en),                // input wire wr_en
  .rd_en(rd_en),                // input wire rd_en
  .dout(tx_data ),                  // output wire [7 : 0] dout
  .full(full),                  // output wire full
  .almost_full(almost_full),    // output wire almost_full
  .wr_ack(wr_ack),              // output wire wr_ack
  .overflow(overflow),          // output wire overflow
  .empty(empty),                // output wire empty
  .almost_empty(almost_empty),  // output wire almost_empty
  .valid(valid),                // output wire valid
  .underflow(underflow),        // output wire underflow
  .wr_rst_busy(wr_rst_busy),    // output wire wr_rst_busy
  .rd_rst_busy(rd_rst_busy)    // output wire rd_rst_busy
);
       
 
    
    
endmodule

仿真程序

`timescale 1ns / 1ps


module tb_fifo(   );
       reg       sysclk   ;
       reg       rst_n    ;
       reg       key_flag      ;
       reg [7:0] rx_data   ;
       reg       rx_done  ;
       wire        tx_start;
       wire [7:0]     tx_data ;
    always #10 sysclk = ~sysclk;
       initial  begin
             sysclk   =0;
             rst_n   =0;
             key_flag     =0;
            rx_data  =0;
            rx_done=0;
         #101
         rst_n=1;
         
         #1000_000
        key_flag=1;
         #20
        key_flag=0;
         #500_000
        key_flag=1;
         #20
         key_flag=0;
       #500_000
         key_flag=1;
         #20
         key_flag=0;
       end
   reg  [31:0]  cnt;
   always@(posedge sysclk)
     if(!rst_n)
       cnt<=0;
    else if(cnt==50_000)
     cnt<=0;
   else  
   cnt<=cnt+1; 
    
    
    always@(posedge sysclk)
     if(!rst_n)
       rx_done<=0;
    else if(cnt==50_000)
     rx_done<=rx_done+1;
   else  
   rx_done<=rx_done; 
    always@(posedge sysclk)
     if(!rst_n)
       rx_data<=0;
    else if(cnt==50_000)
     rx_data<=rx_data+1;
   else  
   rx_data<=rx_data; 
    
 fifo_crtl  fifo_crtl_u(
             .  sysclk   ( sysclk  )    ,
             .  rst_n    ( rst_n   )    ,
             .  key_flag      ( key_flag    )    ,
             . rx_data   (rx_data  )     ,
             . rx_done   (rx_done  )    ,         
             . tx_start  (tx_start )      ,       
             
             .  tx_data      ( tx_data     )

    );   
    
    
endmodule

仿真结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值