VL23. ROM的简单实现
描述
实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。
接口信号图如下:
使用Verilog HDL实现以上功能并编写testbench验证。
输入描述
输出描述
data:4bit位宽的无符号数,从ROM中读出的数据Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06
`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
Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06
`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]; // 要实现ROM,首先要声明数据的存储空间, //变量名称rom之前的[3:0]表示每个数据具有多少位,指位宽;变量名称rom之后的[7:0]表示需要多少个数据,指深度 assign data = rom_data[addr]; //保持ROM中的数据不变 always @(posedge clk or negedge rst_n)//声明存储变量之后,需要对rom进行初始化,写入数据,然后将输入地址作为rom的索引值,将索引值对应的数据输出。 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
Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06
`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]; always @ (posedge clk or negedge rst_n) begin 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] <= 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 end assign data = rom_data[addr]; endmodule
Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06
`timescale 1ns/1ns module rom( input clk, input rst_n, input [7:0]addr, output [3:0]data ); reg [3:0] data_reg [7:0]; reg [3:0] data_out_reg; initial begin data_reg[0] = 4'd0; data_reg[1] = 4'd2; data_reg[2] = 4'd4; data_reg[3] = 4'd6; data_reg[4] = 4'd8; data_reg[5] = 4'd10; data_reg[6] = 4'd12; data_reg[7] = 4'd14; end assign data = data_reg[addr]; endmodule
Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06
`timescale 1ns/1ns module rom( input clk, input rst_n, input [7:0]addr, output [3:0]data ); reg [3:0] myROM [7:0]; always@(posedge clk or negedge rst_n) begin if(~rst_n) begin myROM[0] <= 0; myROM[1] <= 2; myROM[2] <= 4; myROM[3] <= 6; myROM[4] <= 8; myROM[5] <= 10; myROM[6] <= 12; myROM[7] <= 14; end else begin myROM[0] <= myROM[0]; myROM[1] <= myROM[1]; myROM[2] <= myROM[2]; myROM[3] <= myROM[3]; myROM[4] <= myROM[4]; myROM[5] <= myROM[5]; myROM[6] <= myROM[6]; myROM[7] <= myROM[7]; end end assign data = myROM[addr]; endmodule