您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > VHDL存储器的设计
存储器的设计寻址存储器(RAM和ROM)ROM和RAM属于通用大规模器件,一般不需要自行设计,特别是采用PLD器件进行设计时;但是在数字系统中,有时也需要设计一些小型的存储器件,用于特定的用途:临时存放数据,构成查表运算等。此类器件的特点为地址与存储内容直接对应,设计时将输入地址作为给出输出内容的条件;RAM随机存储器RAM的用途是存储数据,其指标为存储容量和字长;RAM的内部可以分为地址译码和存储单元两部分;外部端口为:wr写读控制cs片选d数据端口adr地址端口例16x8位RAM的设计设计思想:将每个8位数组作为一个字(word);总共存储16个字;将ram作为由16个字构成的数组,以地址为下标;通过读写控制模式实现对特定地址上字的读出或写入;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitykramisport(clk,wr,cs:instd_logic;d:inoutstd_logic_vector(7downto0);adr:instd_logic_vector(3downto0));endkram;architecturebehofkramissubtypewordisstd_logic_vector(7downto0);typememoryisarray(0to15)ofword;signaladr_in:integerrange0to15;signalsram:memory;beginadr_in=conv_integer(adr);process(clk)beginif(clk'eventandclk='1')thenif(cs='1'andwr='1')thensram(adr_in)=d;endif;if(cs='1'andwr='0')thend=sram(adr_in);endif;endif;endprocess;endbeh;RAM的数据端口通常为inout模式,设置仿真输入时只能在写入时将信号加到该输入端口上,在其他时候输入应设置为高阻态;RAM设计时需要注意器件的大小,一个16x8位的RAM大约占用200个门,而256x16的RAM则需要6200门以上,因此大规模RAM不适合于采用PLD设计,最好采用通用器件;ROM只读存储器ROM的内容是初始设计电路时就写入到内部的,通常采用电路的固定结构来实现存储;ROM只需设置数据输出端口和地址输入端口;例1简单ROM的设计(16x8位ROM)设计思想:采用二进制译码器的设计方式,但将每个输入组态对应的输出与一组存储数据对应起来;libraryieee;useieee.std_logic_1164.all;entityromisport(dataout:outstd_logic_vector(7downto0);addr:instd_logic_vector(3downto0);ce:instd_logic);endrom;architecturedofromisbegindataout=00001111whenaddr=0000andce='0'else11110000whenaddr=0001andce='0'else11001100whenaddr=0010andce='0'else00110011whenaddr=0011andce='0'else10101010whenaddr=0100andce='0'else01010101whenaddr=0101andce='0'else10011001whenaddr=0110andce='0'else01100110whenaddr=0111andce='0'else00000000whenaddr=1000andce='0'else11111111whenaddr=1001andce='0'else00010001whenaddr=1010andce='0'else10001000whenaddr=1011andce='0'else10011001whenaddr=1100andce='0'else01100110whenaddr=1101andce='0'else10100110whenaddr=1110andce='0'else01100111whenaddr=1111andce='0'elseXXXXXXXX;endd;对于较大的ROM,可以采用结构设计的方法,直接调用参数化模块进行设计;例ROM的LPM设计(256x8位ROM)libraryieee;useieee.std_logic_1164.all;librarylpm;uselpm.lpm_components.all;entityromlpmisport(address:instd_logic_vector(7downto0);inclock:instd_logic;q:outstd_logic_vector(7downto0));endromlpm;architecturestrofromlpmissignalsub_wire0:std_logic_vector(7downto0);beginq=sub_wire0(7downto0);lpm_rom_component:lpm_romgenericmap(lpm_width=8,lpm_widthad=8,lpm_address_control=registered,lpm_outdata=unregistered,lpm_file=krom2.mif)portmap(address=address,inclock=inclock,q=sub_wire0);endstr;ROM的初始化在ROM的设计中,必须要预先设置好数据存储文件,这是一种以.mif为后缀的文本文件,在任何文本编辑器中,按如下文件格式写入:DEPTH=16;字线数量WIDTH=4;位线数量ADDRESS_RADIX=HEX;地址与数据的表达类型DATA_RADIX=HEX;可以选择:HEXOCTDECBINCONTENT存储内容地址:数据;BEGIN[0..F]:3;2:4567;8:FE5;END;文件写完后,保存为.mif即可。例:4位查表式乘法器设计功能:将两个4位二进制数A和B相乘,输出乘积结果C(8位二进制数);设计方案:采用256x8位ROM实现,8位地址输入(高4位为A,低4位为B),256个存储字;8位数据输出;数据存储文件(krom2.mif):填写相应的乘法表即可depth=256;width=8;address_radix=hex;data_radix=hex;contentbegin[00..0f]:00;10:000102030405060708090a0b0c0d0e0f;20:00020406080a0c0e10121416181a1c1e;30:000306090c0f1215181b1e2124272a2d;40:0004080c1014181c2024282c3034383c;50:00050a0f14191d23282d32373c41464b;60:00060c12181e242a30363c42484e545a;70:00070e151c232a31383f464d545b6269;80:00081018202830384048505860687078;90:0009121b242d363f48515a636c757e87;a0:000a141e28323c46505a646e78828c96;b0:000b16212c37424d58636e79848f9aa5;c0:000c1824303c4854606c7884909ca8b4;d0:000d1a2734414e5b6875828f9ca9b6c3;e0:000e1c2a38465462707e8c9aa8b6c4d2;f0:000f1e2d3c4b5a66788796a5b4c3d2e1;end;该乘法器ROM设计完毕后,将其设置为符号文件,将来就可以在VHDL程序中用component语句调用了。在maxplus2的仿真器窗口内,也可以直接生成ROM的初始化文件,其步骤如下:选择Initialize/InitializeMemory…;按ROM地址输入数据;存盘即可生成指定的mif文件(文件名已经在结构体内指明);顺序存储器(堆栈和FIFO)顺序存储器的特点是不设置地址,所有数据的写入和读出都按顺序进行;数据写入或读出时通常会进行移位操作;在设计时必须考虑各存储单元的存储状态;堆栈(后进先出存储器)要求:存入数据按顺序排放,存储器全满时给出信号并拒绝继续存入;读出时按后进先出原则;存储数据一旦读出就从存储器中消失;设计思想:将每个存储单元设置为字(word);存储器整体作为由字构成的数组;为每个字设置一个标记(flag),用以表达该存储单元是否已经存放了数据;每写入或读出一个数据时,字的数组内容进行相应的移动,标记也做相应的变化;程序示例:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_signed.all;entitystackisport(datain:instd_logic_vector(7downto0);push,pop,reset,clk:instd_logic;stackfull:outstd_logic;dataout:bufferstd_logic_vector(7downto0));endstack;architecturebofstackistypearraylogicisarray(15downto0)ofstd_logic_vector(7downto0);signaldata:arraylogic;signalstackflag:std_logic_vector(15downto0);beginstackfull=stackflag(0);process(clk,reset,pop,push)variableselfunction:std_logic_vector(1downto0);beginselfunction:=push&pop;ifreset='1'thenstackflag=(others='0');dataout=(others='0');foriin0to15loopdata(i)=00000000;endloop;elsifclk'eventandclk='1'thencaseselfunctioniswhen10=ifstackflag(0)=’0’thendata(15)=datain;stackflag='1'&stackflag(15downto1);foriin0to14loopdata(i)=data(i+1);endloop;endif;when01=dataout=data(15);stackflag=stackflag(14downto0)&'0';foriin15downto1loopdata(i)=data(i-1);endloop;whenothers=null;endcase;endif;endprocess;endb;以上程序是基于移位寄存器的设计思想;若基于存储器的设计思想,则可以设置一个指针(point),表示出当前写入或读出单元的地址,使这种地址进行顺序变化,就可以实现数据的顺序读出或写入;程序示例library说明和entity设计与上面程序完全相同;architecturebofstackistypearraylogicisarray(15downto0)ofstd_logic_vector(7downto0);signaldata:
本文标题:VHDL存储器的设计
链接地址:https://www.777doc.com/doc-4286444 .html