ROM是一种重要的时序逻辑存储电路,它的逻辑功能是在地址信号的选择下,从指定存储单元中读取相应的数据。R0M只能进行数据的读取,而不能修改或写人新的数据,本节将以16×8的ROM为例,介绍ROM的设计方法。
Verilog HDL:
module ROM_ex1 (addr, data, en); input [:] addr;//地址选择信号
input en; //使能端
output reg [:] data;//数据输出端
reg[:] data1 [:]; always @(*)
begin
data1[] <= 'b1010_1001;
data1[] <= 'b1111_1101;
data1[] <= 'b1110_1001;
data1[] <= 'b1101_1100;
data1[] <= 'b1011_1001;
data1[] <= 'b1100_0010;
data1[] <= 'b1100_0101;
data1[] <= 'b0000_0100;
data1[] <= 'b1110_1100;
data1[] <= 'b1000_1010;
data1[] <= 'b1100_1111;
data1[] <= 'b1100_0001;
data1[] <= 'b1001_1111;
data1[] <= 'b1010_0101;
data1[] <= 'b0101_1100;
if (en)
begin
data[:] <= data1[addr];
end
else
begin
data[:] <= 'bzzzz_zzzz;
end
end endmodule
Testbench:
`timescale ps/ ps
module ROM_ex1_vlg_tst();
reg [:] addr;
reg en;
wire [:] data; ROM_ex1 i1 (
.addr(addr),
.data(data),
.en(en)
);
initial
begin
addr = 'd0;
en = 'b0;
# addr = 'd5;
en = 'b1;
# addr = 'd9;
# addr = 'd12;
# addr = 'd15;
$display("Running testbench");
end endmodule
仿真波形:
观察波形可知,当 en 为“1”时,data 输出数据,否则 data 为高阻态,addr 为地址选择信号,当其输入不同的值时,data 输出相应的存储的数据。