题解 | #ROM的简单实现#
ROM的简单实现
https://www.nowcoder.com/practice/b76fdef7ffa747909b0ea46e0d13738a
好家伙,只要初始化了rom的值,addr一变data立刻变化,不是等clk上升沿才变化的,所以data的表达式一定是个组合逻辑且不能放在always+clk里。
在always 时序电路里对rom进行初始化后数值就不变了 (如果改成ram可以根据时钟写入数据,相同一个addr要在写入新数据后data才会发生变化--> data 的变化是配合时钟来的; 不同的addr 变化立刻发生--> 表现出来data未配合时钟)
`timescale 1ns/1ns module rom( input clk, input rst_n, input [7:0]addr, output [3:0]data ); reg [3:0] rom [7:0]; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin rom[0] <= 4'd0; rom[1] <= 4'd2; rom[2] <= 4'd4; rom[3] <= 4'd6; rom[4] <= 4'd8; rom[5] <= 4'd10; rom[6] <= 4'd12; rom[7] <= 4'd14; end else begin rom[0] <= rom[0]; rom[1] <= rom[1]; rom[2] <= rom[2]; rom[3] <= rom[3]; rom[4] <= rom[4]; rom[5] <= rom[5]; rom[6] <= rom[6]; rom[7] <= rom[7]; end end assign data = rom[addr]; endmodule