题解 | 基础版23#ROM的简单实现#
ROM的简单实现
http://www.nowcoder.com/practice/b76fdef7ffa747909b0ea46e0d13738a
1. 代码
`timescale 1ns/1ns module rom( input clk, input rst_n, input [7:0]addr, output [3:0]data ); reg [3:0] romreg[7:0]; integer i; always @ (posedge clk&nbs***bsp;negedge rst_n) begin if( ~rst_n ) begin romreg[0] <= 4'd0; romreg[1] <= 4'd2; romreg[2] <= 4'd4; romreg[3] <= 4'd6; romreg[4] <= 4'd8; romreg[5] <= 4'd10; romreg[6] <= 4'd12; romreg[7] <= 4'd14; end else begin // romreg[0] <= romreg[0]; // ... // romreg[7] <= romreg[7]; for(i = 0; i < 8; i = i+1) begin : rom_i romreg[i] <= romreg[i]; end end end assign data = romreg[addr]; endmodule
2. 解析
初始化时(复位时):装载初始数据,有同学也用initial赋值来初始化,这里需要注意,对于xilinx的综合工具Vivado,initial的这种赋值可综合,能够赋值,但是不代表所有的综合工具都支持这种方式,在最初的Verilog语法中initial是不支持综合的。
正常赋值:for循环实现,节省代码量。
实际上是和写8个非阻塞赋值效果一样。
具体fo循环使用可参考:
for和generate...for的解析 https://blog.nowcoder.net/n/421b1cd6dadb4c9db35c562c3e39da24