《FPGA设计秘笈》由会员分享,可在线阅读,更多相关《FPGA设计秘笈(22页珍藏版)》请在金锄头文库上搜索。
1、.第十章存储器一、前言如果我们考虑使用同步动态随机存取存储器(SDRAM),那么针对这种存储器我们需考虑的主要方面有:1. 这种类型的动态随机存取存储器(DRAM)依赖于存储数据关口的电容三极管;2. DRAM比静态随机存取存储器(SRAM)更加兼容;3. DRAM不能被合成,因此需要一个单独的DRAM芯片;4. SDRAM要求有一个同步时钟,这个时钟需与其余的硬件系统相一致,并且是由微处理器进行运作5. DRAM数据必须被刷新,因为DRAM是储存电荷且在一定时间后会衰变;6. DRAM较SRAM更慢些。SRAM可以看作是类似于只读存储器(ROM)芯片,它还有其他不同的特征:1. 存储单元格是
2、以标准锁存器为基准;2. SRAM是快捷的存储方式。3. SRAM兼容性不如DRAM(或SDRAM);4. SRAM可以合成一个现场可编程门阵列(FPGA),因此它是小型、快速寄存器或内存块的最佳选择。SRAM从本质上来说是不同步的,但是可以修改为同步运转(如SDRAM的同步相当于DRAM),这通常被称为同步RAM。这时候,Flash存储器非常有用,尽管它的运作不同于其他存储器那样久远,仅仅是因为它易于使用且在FPGA开发板上经常用得到。Flash存储器本质上是电可擦只读存储器(EEPROM)的一种形式,可以用作是一种永久的RAM。只所以说是永久性的,是因为在Flash存储器中,存储装置即使在
3、断电时仍能保存数据,因此它经常用作一种ROM,因为它可以用于存储FPGA程序,也可以用作RAM(动态)存储当前数据,因此普遍用于FPGA系统。二、用硬件描述语言(VHDL)对存储器进行建模当用VHDL对存储器进行建模时应非常小心,因为某些存储器不能合成,如果使用模块,即使是离片时,也必须能体现出正确的实际装置物理特征。这尤其适用于访问次数和时序扰乱情况。当时序扰乱时,所获得的数据最好的情况也许是可疑的,最坏的情况是完全无效的。设计师可以发现自己处于一个令人反感的处境,即仿真模块运行良好,而实际硬件完全不起作用。在此章节中,我们所使用的VHDL是在任何模型中都不会出现任何物理性延时,如果这些模块
4、用于现实系统时,则会增加延时。三、只读存储器ROM本质上是一套在存储寄存器中预先定义的数值。这种存储器有2种定义,第一种是存储区数量,第二种是位元数量。比如,假如存储器各自有16个存储区和8个位元,那么这个存储器就可以定义为168ROM。基本的ROM有一个信息输入,可以存取地址的定义,还有一个信息输出,是一个存放数据的逻辑载体。设想在VHDL中的一个简单的ROM行为模块实体为:ENTITYROM16x8ISPORT(address:ININTEGERRANGE0TO15;dout:OUTstd_logic_vector(7DOWNTO0);ENDENTITYROM16x8;由此可以看到,地址已
5、被定义为一个整数,但是数值范围局限于ROM范围中。ROM的架构定义为一个可以直接获取的固定数组元素。因此,一个带有一套样板数据元素的ROM范例可以定义如下:ARCHITECTUREexampleOFrom16x8ISTYPEromdataISARRAY(0TO15)OFstd_logic_vector(7DOWNTO0);CONSTANTromvals:romdata:=(“00000000”,“01010011”,“01110010”,“01101100”,“01110101”,“11010111”,“11011111”,“00111110”,“11101100”,“10000110”,“1
6、1111001”,“00111001”,“01010101”,“11110111”,“10111111”,“11101101”);BEGINdata=romvals(address);ENDARCHITECTUREexample;如果我们采取这个范例,我们首先需要声明这个ROM是在一个VHDL测试台上的,然后制定地址使用一个整数信号。以下为一个testbench范例:libraryieee;useieee.std_logic_1164.all;entitytestromisendentitytestrom;architecturetestoftestromissignaladdress:int
7、eger:=0;signaldata:std_logic_vector(7downto0);beginrom16x8:entitywork.rom16x8(example)portmap(address,data);endarchitecturetest;需注意的是IEEE库中,std_logic_vector型号要求是std_logic_1164,数值取决于所选择的地址。四、随机存取存储器一个DRAM组件有一个二维结构的存储器被分离成一个网格结构,可以通过一个行地址和列地址进行访问。需要注意的是因为这是不同步的,所以不含有时钟。所谓不同步的含义是应必须注意存储器存取定时以确保数据在这个转移过
8、程中的完整性。VHDL模块由一个单独的地址输入和2个控制信号RADDR和CADDR,是分别用于指定行地址和列地址的。它也有一个RW信号是指在高信号时可以写,而在低信号时可以读。最后,将数据输到定义为一个INOUT(双向)信号的DATA信号上。在VHDL中所产生的实体如下所示。在这个例子中,行数是28,列数是28,得出的一个总的数据是以1Mbit中的16位存储。ENTITYDRAM1MBISPORT(address:ININTEGERRANGE0TO2*8-1;RW:std_logic;data:OUTstd_logic_vector(15DOWNTO0);ENDENTITYDRAM1MB;VH
9、DL中的体系结构如下:architecturebehavofDRAM1MBisbeginprocess(RADDR,CADDR,RW)istypedramisarray(0to2*16-1)ofstd_logic_vector(15downto0);variableradd:INTEGERrange0to2*8-1;variablemadd:INTEGERrange0to2*16-1;variablememory:dram;begindataZ);iffalling_edge(RADDR)thenradd:=address;elsiffalling_edge(CADDR)thenmadd:=r
10、add*2*18+Address;ifRADDR=0andRW=0thenmemory(madd):=data;endif;elsifCADDR=0andRADDR=0andRW=1thendata=memory(madd);endif;endprocess;endarchitecturebehav;要使用这个模块,可以使用一个简单的测试验证来读取一个数值为一个地址,然后另一个数值为另一个地址,然后返回读取原始数值。以下VHDL中所体现出来的测试验证:libraryieee;useieee.std_logic_1164.all;entitytestramisendentitytestram;a
11、rchitecturetestoftestramissignaladdress:integerrange0to2*8-1:=0;signalrw:std_logic;signalc:std_logic;signalr:std_logic;signaldata:std_logic_vector(15downto0);begindram:entitywork.dram1mb(behav)portmap(address,rw,c,r,data);address=23after0ns,47after30ns,23after90ns;rw=0after0ns,1after90ns;c=1after0ns
12、,0after20ns,1after50ns,0after70ns,1after90ns,0after100ns;r=1after0ns,0after10ns,1after40ns,0after60ns,1after80ns,0after100ns;data=X”1234”after0ns,X”5678”after40ns;endarchitecturetest;这种模块的测试结果可以在波形图(图34)中查看,此图显示了地址、数据和控制线的正常特性。需非常需要注意的是RAM模块不模拟任何在实际中出现的真实时滞,假如这对于功能性设计很重要,则必须在每模块中加入此项功能。图34DRAM模拟结果五、
13、同步RAM在以上章节中我们可以观察到存储器是如何异步进行存取,而同步RAM则要求有一个时钟。在大多数的实际设计中,RAM在离片后可以用作一个独立的存储装置,但是有时对在FPGA上一个小的RAM区块用于快速访问或者是接近于硬件设备要求频繁访问一个相当小的内存块的本地存储进行定义是非常有用的。相对于其他可能性功能来说,通常的设计限制条件更适用于存储,因为使用触发寄存器来存储数据而没有太多地运用查找表(LUT)中的逻辑性的情况是区域密集的。一直用于FPGA设计的权衡是指权衡RAM板上提高性能和速度的潜能是否比增加区域更为重要。从设计的透视图可以看出,同步的RAMVHDL模块非常类似于先前验证的基本异
14、步RAM模块。唯一的区别是异步RAM模块在取代申请地址后立即能获取数据,而在一个同步的RAM中的数据只能当出现时钟沿(上升沿或者下降沿取决于设计要求)时才可以访问。假如我们设想VHDL为一个SRAM的实体,可以看到以下实体要求有一个尺寸为2m的内存和一条2n的数据总线。VHDL模型有2个参数m和n。在默认的情况下,在RAM中,m值为10提供1024个地址字节,单位元n设定为8提供总共8K位元。很明显,规模是可以任意制定的,这说明这种计算方式要求有指定的内存块。需要注意有两个控制信号为计时器(clk)和允许写入(wr)。我们可以使存储卡同步写入。同步读取或者是一个更复杂的端口结构,但是在这种情况
15、下,我们将可以体现在时钟的上升沿上进行同步读写。另外,当允许写入信号低时,我们用于允许写入状态的协议是积极主动的。同步RAM的VHDL结果如下:这个模块可以从几个方面考虑。第一个是存储器的访问,假如我们在VHDL中定义地址为std_logic_vector型号,然后我们不能简单地使用这个数值访问一个指定元素的数组。这要求有一个整数参数。我们也不能简单地直接计算一个std_logic_vector型号为一个整数型。首先我们必须做的的是转化std_logic_vector型号为一个无符号数字。这完成了将std_logic_vector型号转变为整数型步骤的一半,虽然我们可以使用变量做一个数字,但是却限制使用相同位元分辨率当做原始std_logic_vector。在这种情况下,这明显不是问题,因为地址不能比内存大否则会导致错误。最后一步是转化无符号型号为一个整数。这是通过使用转化整数功能完成,而且这是转化地址为需要访问单独元素数组的整数形式。考虑到此些