写与读异步时钟,复位共用一个srst
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
最后的读取有一点问题