ROM(只读存储器)
图给出了ROM的结构。因为它是只读存储器,所以不需要时钟信号和写使能信号。可以看出,电路内部包括预先存储的内容,并且由输入的地址(addr)来选择将哪个存储空间中的内容传送到输出端。对于这个设计,在一个寻址单元里可以存储一个8位的“字”。
实现ROM的代码如下所示。words(第7行)表示存储在ROM中的字的数量,而bits(第6行)表示每个字的大小。为了实现ROM,使用了一个常数数组(第15行~第22行)。代码中首先定义了一个新的类型vector_array(第14行),接着它被用来声明一个名为memory(第15行)的常量。这个例子展示的是一个8×8的R0M,下面的值(十进制):0,2,4,8,16,32,64和128分别被存储到地址0-7所选定的地址空间里(第15行-第22行)。第24行给出了使用ROM的例子。输出(data)等于memory存储在相应地址中的数据。当实现ROM时,由于没有使用时钟信号,所以没有占用寄存器资源。ROM是通过使用逻辑门构成查找表(LUT:Look Up Table)的方式来实现的。
-------------------------------------
library ieee;
use ieee.std_logic_1164.all;
-------------------------------------
entity rom is
generic (bits: integer := 8; --# of bits per word
words: integer := 8); --# of words in the memory
port (addr: in integer range 0 to words-1;
data: out std_logic_vector(bits-1 downto 0)
);
end rom;
--------------------------------------
architecture rom of rom is
type vector_array is array (0 to words-1) of std_logic_vector (bits-1 downto 0);
constant memory : vector_array := ("00000000",
"00000010",
"00000100",
"00001000",
"00010000",
"00100000",
"01000000",
"10000000");
begin
data <= memory(addr);
end rom;
ROM的仿真工作波形在下图中给出。可以看见,地址从0到7连续改变,存储在相应位置上的数据可以相应地连续正确输出。