描述
实现一个深度为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中的数据进行初始化beginrom_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;endelsebegin //保持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;elsedata <= 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) beginrom_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;endelse beginrom_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)beginif(~rst_n)beginrom[0] <= 0;rom[1] <= 2;rom[2] <= 4;rom[3] <= 6;rom[4] <= 8;rom[5] <= 10;rom[6] <= 12;rom[7] <= 14;endelsebeginrom[0] <= 0;rom[1] <= 2;rom[2] <= 4;rom[3] <= 6;rom[4] <= 8;rom[5] <= 10;rom[6] <= 12;rom[7] <= 14;endendassign data = rom[addr];
endmodule
注:解题分析来源于网友,如有侵权,请告删之。