题解 | 基础版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循环使用可参考:

全部评论

相关推荐

评论
2
收藏
分享
牛客网
牛客企业服务