题解主体
要实现ROM,首先要声明数据的存储空间,例如:[3:0] rom [7:0];变量名称rom之前的[3:0]表示每个数据具有多少位,指位宽;变量名称rom之后的[7:0]表示需要多少个数据,指深度,注意这里深度为8,应该是使用[7:0],而不是[2:0];
声明存储变量之后,需要对rom进行初始化,写入数据,然后将输入地址作为rom的索引值,将索引值对应的数据输出。
可以按照如下的方式开辟存储空间,并进行数据初始化:
reg [3:0] rom_data [7:0];
//保持ROM中的数据不变
always @(posedge clk or negedge rst_n)
if (!rst_n) //对ROM中的数据进行初始化
begin
rom_data[0] <= 4'd0;
rom_data[1] <= 4'd2;
rom_data[2] <= 4'd4;
rom_data[3] <= 4'd6;
rom_data[4] <= 4'd8;
rom_data[5] <= 4'd10;
rom_data[6] <= 4'd12;
rom_data[7] <= 4'd14;
end
else
begin //保持ROM中的数据不变
rom_data[0] <= 4'd0;
rom_data[1] <= 4'd2;
rom_data[2] <= 4'd4;
rom_data[3] <= 4'd6;
rom_data[4] <= 4'd8;
rom_data[5] <= 4'd10;
rom_data[6] <= 4'd12;
rom_data[7] <= 4'd14;
end
初始化完成之后的rom的形式如下,内部存在地址和数据的对应关系,通过输入相应的地址,可以得到相应的输出数据。
always @(posedge clk or negedge rst_n)
if (!rst_n)
data <= 4'd0;
else
data <= rom_data[addr];
参考答案
`timescale 1ns/1ns module rom( input clk, input rst_n, input [7:0]addr, output [3:0]data ); reg [3:0] rom_data [7:0]; assign data = rom_data[addr]; //保持ROM中的数据不变 always @(posedge clk or negedge rst_n) if (!rst_n) begin rom_data[0] <= 4'd0; rom_data[1] <= 4'd2; rom_data[2] <= 4'd4; rom_data[3] <= 4'd6; rom_data[4] <= 4'd8; rom_data[5] <= 4'd10; rom_data[6] <= 4'd12; rom_data[7] <= 4'd14; end else begin rom_data[0] <= rom_data[0]; rom_data[1] <= rom_data[1]; rom_data[2] <= rom_data[2]; rom_data[3] <= rom_data[3]; rom_data[4] <= rom_data[4]; rom_data[5] <= rom_data[5]; rom_data[6] <= rom_data[6]; rom_data[7] <= rom_data[7]; end endmodule