#154. ROM

    ID: 154 Type: Default 1000ms 256MiB

ROM

题目描述

在数字电路中,不可避免的需要对数据进行存储和访问,虽然寄存器能够实现数据的存储功能,但使用寄存器进行大量数据的存储并不现实,这是因为:第一,寄存器实现成本过高;第二,寄存器结构复杂,难以提高集成度。因此,一般使用存储器进行大段数据的存储,常见的存储器有ROM(只读存储器)、RAM(随机访问存储器)和FIFO(先进先出队列)。ROM顾名思义,该存储器里面的数据是预选设置好的,在使用时只能读取,不能写入,在使用FPGA作为硬件平台时,一般是通过EDA工具中的IP生成工具来生成的。此外,我们也可以通过使用Verilog定义一个数组来实现,并由EDA工具自动例化成相应的IP核,这样做对于开发者来说简单了很多,但性能多少会受些影响。

对于存储器,其内部数据的初始化有两种方式:(1)在Verilog代码中指定初始内容(2)在外部文件中指定初始内容。在实际中,一般采用第二种方式。

对于存储器来说,有两个非常重要的参数:地址位宽和数据位宽,地址位宽与存储器的存储深度(即存储单元数量)相关,如地址宽度为N,则存储器深度为2N,数据位宽则表示每个存储单元所包含的bit数。

下例是一个4*8bit的ROM实例,该ROM通过在Verilog代码中指定内容进行初始化

module rom_4x8bit(

input [1:0] addr

output [7:0] q);

reg [7:0] mem [3:0];

initial

begin

mem[0] = 8’h00;

mem[1] = 8’h00;

mem[2] = 8’h00;

mem[3] = 8’h00;

end

assign q = mem[addr];

endmodule

试根据上述示例,设计一个8*4bit的ROM,并对其进行初始化,使其初始化数据为“0,1,2,3,…”

输入格式

3'b000

输出格式

4'd0

示例代码

module top(
    input   [2:0] addr,
    output  [3:0]   q
);

endmodule