`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
仿真结果