利用ROM储存数据源,初始化存入1024个byte数据,然后读出数据如图所示:
`timescale 1ns / 1ps
module data_error_injector (
input clk, // 时钟信号,50MHz
input reset, // 复位信号,高有效
input DIN_EN, // 数据输入使能,高有效
output reg [7:0] DOUT, // 输出数据
output reg DOUT_EN // 数据输出使能,高有效
);
reg DOUT_EN_0;
// ROM的接口
reg [9:0] rom_addr; // ROM地址
wire [7:0] rom_dout; // ROM数据输出
reg ena;
// ROM实例化(通过Vivado生成的ROM IP核)
blk_mem_gen_0 rom (
.clka(clk), // 时钟信号
.ena(ena),
.addra(rom_addr), // 地址信号
.douta(rom_dout) // 数据输出
);
always @(posedge clk or posedge reset) begin
if (reset)begin
rom_addr<= 0;
DOUT<=0;
DOUT_EN<=0;
ena<=0;
end else begin
if(DIN_EN)
ena<=1;
else
ena<=0;
if(ena)begin
DOUT_EN_0<=1;
DOUT_EN<=DOUT_EN_0;
DOUT<=rom_dout;
if(rom_addr<1023)begin
rom_addr<=rom_addr+1;
end else begin
rom_addr<=0;
DOUT_EN<=0;
DOUT_EN_0<=0;
end
end else begin
DOUT<=0;
DOUT_EN<=0;
DOUT_EN_0<=0;
end
end
end
endmodule
源代码供大家一块学习,逻辑简单,之前就有模糊的印象,但是写一遍会有更深刻的理解!tb比较简单,自己尝试一下吧。如果需要tb,可以私聊