描述
实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。
接口信号图如下:
使用Verilog HDL实现以上功能并编写testbench验证。
输入描述
clk:系统时钟
rst_n:异步复位信号,低电平有效
addr:8bit位宽的无符号数,输入到ROM的地址
输出描述
data:4bit位宽的无符号数,从ROM中读出的数据
解题分析
要实现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];
只需要将地址作为rom的索引,即可得到相应的数据
参考代码
`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
方法二
`timescale 1ns/1ns
module rom(
input clk,
input rst_n,
input [7:0]addr,
output [3:0]data
);
reg [3:7] rom [7:0];
always @(posedge clk or negedge rst_n)
begin
if(~rst_n)
begin
rom[0] <= 0;
rom[1] <= 2;
rom[2] <= 4;
rom[3] <= 6;
rom[4] <= 8;
rom[5] <= 10;
rom[6] <= 12;
rom[7] <= 14;
end
else
begin
rom[0] <= 0;
rom[1] <= 2;
rom[2] <= 4;
rom[3] <= 6;
rom[4] <= 8;
rom[5] <= 10;
rom[6] <= 12;
rom[7] <= 14;
end
end
assign data = rom[addr];
endmodule
注:解题分析来源于网友,如有侵权,请告删之。