存储器的设计 寻址存储器(RAM和ROM) ROM和RAM属于通用大规模器件,一般不需要自行设 计,特别是采用PLD器件进行设计时 但是在数字系统中,有时也需要设计一些小型的存储器 件,用于特定的用途:临时存放数据,构成查表运算等。 此类器件的特点为地址与存储内容直接对应,设计时将 输入地址作为给出输出内容的条件; RAM随机存储器 RAM的用途是存储数据,其指标为存储容量和字长; RAM的内部可以分为地址译码和存储单元两部分 外部端口为:wr写读控制cs片选 d数据端口adr地址端口 例16x8位RAM的设计 设计思想 将每个8位数组作为一个字(word);总共存储16个字; 将ram作为由16个字构成的数组,以地址为下标 通过读写控制模式实现对特定地址上字的读出或写入; library ieee Ise ieee std logic 1164. all; use ieee std logic unsigned. all
存储器的设计 寻址存储器(RAM 和 ROM) ROM 和 RAM 属于通用大规模器件,一般不需要自行设 计,特别是采用 PLD 器件进行设计时; 但是在数字系统中,有时也需要设计一些小型的存储器 件,用于特定的用途:临时存放数据,构成查表运算等。 此类器件的特点为地址与存储内容直接对应,设计时将 输入地址作为给出输出内容的条件; RAM 随机存储器 RAM 的用途是存储数据,其指标为存储容量和字长; RAM 的内部可以分为地址译码和存储单元两部分; 外部端口为: wr 写读控制 cs 片选 d 数据端口 adr 地址端口 例 16x8 位 RAM 的设计 设计思想: 将每个 8 位数组作为一个字(word);总共存储 16 个字; 将 ram 作为由 16 个字构成的数组,以地址为下标; 通过读写控制模式实现对特定地址上字的读出或写入; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity kram is port( clk, wr, cs: in std logic; d inout std log 0); adr in std logic vector(3 downto O)) end kram architecture beh of kram i subtype word is std logic vector(7 downto 0) type memory is array(0 to 15)of word signal adr in integer range0 to 15 gnal sram memory dr in<=conv integer(adr) process(clk) if(clk'event and clk='I)then if(cs=I'and wr=")then sram(adr in)<=d end if if(cs=I'and wr0')then end if nd if end process, RAM的数据端口通常为 Inout模式,设置仿真输入时只 能在写入时将信号加到该输入端口上,在其他时候输入应设 置为高阻态 RAM设计时需要注意器件的大小,一个16x8位的RAM 大约占用200个门,而256x16的RAM则需要6200门以上
entity kram is port ( clk,wr,cs: in std_logic; d: inout std_logic_vector(7 downto 0); adr: in std_logic_vector(3 downto 0)); end kram; architecture beh of kram is subtype word is std_logic_vector(7 downto 0); type memory is array (0 to 15) of word; signal adr_in:integer range 0 to 15; signal sram:memory; begin adr_in<=conv_integer (adr); process(clk) begin if(clk'event and clk='1') then if (cs='1'and wr='1') then sram (adr_in)<=d; end if; if (cs='1'and wr='0' ) then d<=sram (adr_in); end if; end if; end process; end beh; RAM 的数据端口通常为 inout 模式,设置仿真输入时只 能在写入时将信号加到该输入端口上,在其他时候输入应设 置为高阻态; RAM 设计时需要注意器件的大小,一个 16x8 位的 RAM 大约占用 200 个门,而 256x16 的 RAM 则需要 6200 门以上
因此大规模RAM不适合于采用PLD设计,最好采用通用器 ROM只读存储器 ROM的内容是初始设计电路时就写入到内部的,通常采 用电路的固定结构来实现存储;ROM只需设置数据输出端口 和地址输入端口 例1简单ROM的设计(16x8位ROM) 设计思想:采用二进制译码器的设计方式,但将每个输入组 态对应的输出与一组存储数据对应起来; library ieee use ieee std logic 1164. all entity rom Is port(dataout: out std logic vector( 7 downto 0) addr: in std logic vector(3 downto o) ce: in std logic) end rom architecture d of rom is dataout <=00001111 when addr=0000 "and ce=o else 11110000 "when addr =0001"and ce=o' else 11001100" when addr=0010" and ce=o' else 00110011" when addr=0011"and ce=o' else 10101010 when addr=0100"and ce=o' else 01010101 when addr=0101"and ce=o' else 1001 1001"when addr =0110" and ce=o' else
因此大规模 RAM 不适合于采用 PLD 设计,最好采用通用器 件; ROM 只读存储器 ROM 的内容是初始设计电路时就写入到内部的,通常采 用电路的固定结构来实现存储;ROM 只需设置数据输出端口 和地址输入端口; 例 1 简单 ROM 的设计(16x8 位 ROM) 设计思想:采用二进制译码器的设计方式,但将每个输入组 态对应的输出与一组存储数据对应起来; library ieee; use ieee.std_logic_1164.all; entity rom is port(dataout: out std_logic_vector(7 downto 0); addr: in std_logic_vector(3 downto 0); ce: in std_logic); end rom; architecture d of rom is begin dataout <= "00001111" when addr ="0000" and ce='0' else "11110000" when addr ="0001" and ce='0' else "11001100" when addr ="0010" and ce='0' else "00110011" when addr ="0011" and ce='0' else "10101010" when addr ="0100" and ce='0' else "01010101" when addr ="0101" and ce='0' else "10011001" when addr ="0110" and ce='0' else
" 01100110" when addr=0111" and ce= o' else 00000000"when addr="1000"and ce=o' else 11111111"when addr=1001" and ce=o' else "00010001"when addr=1010"and ce=o' else 10001000"when addr=1011"and ce=0 else 10011001"when addr ="1100"and ce=o' else 01100110" when addr=1101"and ce=o' else 10100110"when addr=1110" and ce=o' else 01100111" when addr="1111"and ce=o else XXXXXXXX 对于较大的ROM,可以采用结构设计的方法,直接调用 参数化模块进行设计 例ROM的LPM设计(256x8位ROM library ieee, use ieee std logic 1164. all library lpm use lpm Ipm components.all; port(address in std logic vector(7 downto 0); clock in std logic. g: out std logic vector(7 downto O)); d ron architecture str of romlpm is signal sub wireD: std logic vector(7 downto 0) q<=sub wire(7 downto O) lpm rom generic map( Ipm width=>8 m w
"01100110" when addr ="0111" and ce='0' else "00000000" when addr ="1000" and ce='0' else "11111111" when addr ="1001" and ce='0' else "00010001" when addr ="1010" and ce='0' else "10001000" when addr ="1011" and ce='0' else "10011001" when addr ="1100" and ce='0' else "01100110" when addr ="1101" and ce='0' else "10100110" when addr ="1110" and ce='0' else "01100111" when addr ="1111" and ce='0' else "XXXXXXXX"; end d; 对于较大的 ROM,可以采用结构设计的方法,直接调用 参数化模块进行设计; 例 ROM 的 LPM 设计 (256x8 位 ROM) library ieee; use ieee.std_logic_1164.all; library lpm; use lpm.lpm_components.all; entity romlpm is port(address: in std_logic_vector(7 downto 0); inclock: in std_logic; q: out std_logic_vector(7 downto 0)); end romlpm; architecture str of romlpm is signal sub_wire0:std_logic_vector(7 downto 0); begin q<=sub_wire0(7 downto 0); lpm_rom_component:lpm_rom generic map( lpm_width =>8, lpm_widthad =>8
Ipm address control=>"registered Ipm outdata=>"unregistered pm file→>"krom2mif") port map( address=>address inclock->inclock q=>sub wire) end str: ROM的初始化 在ROM的设计中,必须要预先设置好数据存储文件,这 是一种以mf为后缀的文本文件,在任何文本编辑器中,按如 下文件格式写入: DEPTH=16;字线数量 WIDT 位线数量 ADDRESS RADIX=HEX;地址与数据的表达类型 DATA RADIX=HEX;可以选择: HEX OCT DEC BIN CONTENT 存储内容地址:数据 BEGIN [0.F] 4567; FE5 END 文件写完后,保存为mif即可。 例:4位查表式乘法器设计 功能:将两个4位二进制数A和B相乘,输出乘积结果 C(8位二进制数) 设计方案:采用256x8位ROM实现,8位地址输入(高 4位为A,低4位为B),256个存储字;8位数据输出 数据存储文件(krom2.mif):填写相应的乘法表即可 depth=256; width=8
lpm_address_control=>"registered", lpm_outdata => "unregistered", lpm_file=> "krom2.mif") port map( address=>address, inclock=>inclock, q =>sub_wire0); end str; ROM 的初始化 在 ROM 的设计中,必须要预先设置好数据存储文件,这 是一种以.mif 为后缀的文本文件,在任何文本编辑器中,按如 下文件格式写入: DEPTH = 16; 字线数量 WIDTH = 4; 位线数量 ADDRESS_RADIX = HEX; 地址与数据的表达类型 DATA_RADIX = HEX; 可以选择:HEX OCT DEC BIN CONTENT 存储内容 地址 :数据; BEGIN [0..F] : 3; 2 : 4 5 6 7; 8 : F E 5; END ; 文件写完后,保存为.mif 即可。 例:4 位查表式乘法器设计 功能:将两个 4 位二进制数 A 和 B 相乘,输出乘积结果 C(8 位二进制数); 设计方案:采用 256x8 位 ROM 实现,8 位地址输入(高 4 位为 A,低 4 位为 B),256 个存储字;8 位数据输出; 数据存储文件(krom2.mif): 填写相应的乘法表即可 depth = 256; width = 8;