FPGA设计秘笈教学提纲.doc
《FPGA设计秘笈教学提纲.doc》由会员分享,可在线阅读,更多相关《FPGA设计秘笈教学提纲.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。FPGA设计秘笈-第十章存储器一、前言如果我们考虑使用同步动态随机存取存储器(SDRAM),那么针对这种存储器我们需考虑的主要方面有:1. 这种类型的动态随机存取存储器(DRAM)依赖于存储数据关口的电容三极管;2. DRAM比静态随机存取存储器(SRAM)更加兼容;3. DRAM不能被合成,因此需要一个单独的DRAM芯片;4. SDRAM要求有一个同步时钟,这个时钟需与其余的硬件系统相一致,并且是由微处理器进行运作5. DRAM数据必须被刷新,因为DRAM是储存电荷且在一定时间后会衰变;6. DRAM
2、较SRAM更慢些。SRAM可以看作是类似于只读存储器(ROM)芯片,它还有其他不同的特征:1. 存储单元格是以标准锁存器为基准;2. SRAM是快捷的存储方式。3. SRAM兼容性不如DRAM(或SDRAM);4. SRAM可以合成一个现场可编程门阵列(FPGA),因此它是小型、快速寄存器或内存块的最佳选择。SRAM从本质上来说是不同步的,但是可以修改为同步运转(如SDRAM的同步相当于DRAM),这通常被称为同步RAM。这时候,Flash存储器非常有用,尽管它的运作不同于其他存储器那样久远,仅仅是因为它易于使用且在FPGA开发板上经常用得到。Flash存储器本质上是电可擦只读存储器(EEPR
3、OM)的一种形式,可以用作是一种永久的RAM。只所以说是永久性的,是因为在Flash存储器中,存储装置即使在断电时仍能保存数据,因此它经常用作一种ROM,因为它可以用于存储FPGA程序,也可以用作RAM(动态)存储当前数据,因此普遍用于FPGA系统。二、用硬件描述语言(VHDL)对存储器进行建模当用VHDL对存储器进行建模时应非常小心,因为某些存储器不能合成,如果使用模块,即使是离片时,也必须能体现出正确的实际装置物理特征。这尤其适用于访问次数和时序扰乱情况。当时序扰乱时,所获得的数据最好的情况也许是可疑的,最坏的情况是完全无效的。设计师可以发现自己处于一个令人反感的处境,即仿真模块运行良好,
4、而实际硬件完全不起作用。在此章节中,我们所使用的VHDL是在任何模型中都不会出现任何物理性延时,如果这些模块用于现实系统时,则会增加延时。三、只读存储器ROM本质上是一套在存储寄存器中预先定义的数值。这种存储器有2种定义,第一种是存储区数量,第二种是位元数量。比如,假如存储器各自有16个存储区和8个位元,那么这个存储器就可以定义为168ROM。基本的ROM有一个信息输入,可以存取地址的定义,还有一个信息输出,是一个存放数据的逻辑载体。设想在VHDL中的一个简单的ROM行为模块实体为:ENTITYROM16x8ISPORT(address:ININTEGERRANGE0TO15;dout:OUT
5、std_logic_vector(7DOWNTO0);ENDENTITYROM16x8;由此可以看到,地址已被定义为一个整数,但是数值范围局限于ROM范围中。ROM的架构定义为一个可以直接获取的固定数组元素。因此,一个带有一套样板数据元素的ROM范例可以定义如下:ARCHITECTUREexampleOFrom16x8ISTYPEromdataISARRAY(0TO15)OFstd_logic_vector(7DOWNTO0);CONSTANTromvals:romdata:=(“00000000”,“01010011”,“01110010”,“01101100”,“01110101”,“11
6、010111”,“11011111”,“00111110”,“11101100”,“10000110”,“11111001”,“00111001”,“01010101”,“11110111”,“10111111”,“11101101”);BEGINdata=romvals(address);ENDARCHITECTUREexample;如果我们采取这个范例,我们首先需要声明这个ROM是在一个VHDL测试台上的,然后制定地址使用一个整数信号。以下为一个testbench范例:libraryieee;useieee.std_logic_1164.all;entitytestromisendenti
7、tytestrom;architecturetestoftestromissignaladdress:integer:=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;d
9、ata:OUTstd_logic_vector(15DOWNTO0);ENDENTITYDRAM1MB;VHDL中的体系结构如下: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
10、)thenradd:=address;elsiffalling_edge(CADDR)thenmadd:=radd*2*18+Address;ifRADDR=0andRW=0thenmemory(madd):=data;endif;elsifCADDR=0andRADDR=0andRW=1thendata=memory(madd);endif;endprocess;endarchitecturebehav;要使用这个模块,可以使用一个简单的测试验证来读取一个数值为一个地址,然后另一个数值为另一个地址,然后返回读取原始数值。以下VHDL中所体现出来的测试验证:libraryieee;useiee
11、e.std_logic_1164.all;entitytestramisendentitytestram;architecturetestoftestramissignaladdress: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,47aft
12、er30ns,23after90ns;rw=0after0ns,1after90ns;c=1after0ns,0after20ns,1after50ns,0after70ns,1after90ns,0after100ns;r=1after0ns,0after10ns,1after40ns,0after60ns,1after80ns,0after100ns;data=X”1234”after0ns,X”5678”after40ns;endarchitecturetest;这种模块的测试结果可以在波形图(图34)中查看,此图显示了地址、数据和控制线的正常特性。需非常需要注意的是RAM模块不模拟任何
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 设计 秘笈 教学 提纲
限制150内