FPGA设计秘笈教学提纲.doc
Good is good, but better carries it.精益求精,善益求善。FPGA设计秘笈-第十章存储器一、前言如果我们考虑使用同步动态随机存取存储器(SDRAM),那么针对这种存储器我们需考虑的主要方面有:1. 这种类型的动态随机存取存储器(DRAM)依赖于存储数据关口的电容三极管;2. DRAM比静态随机存取存储器(SRAM)更加兼容;3. DRAM不能被合成,因此需要一个单独的DRAM芯片;4. SDRAM要求有一个同步时钟,这个时钟需与其余的硬件系统相一致,并且是由微处理器进行运作5. DRAM数据必须被刷新,因为DRAM是储存电荷且在一定时间后会衰变;6. DRAM较SRAM更慢些。SRAM可以看作是类似于只读存储器(ROM)芯片,它还有其他不同的特征:1. 存储单元格是以标准锁存器为基准;2. SRAM是快捷的存储方式。3. SRAM兼容性不如DRAM(或SDRAM);4. SRAM可以合成一个现场可编程门阵列(FPGA),因此它是小型、快速寄存器或内存块的最佳选择。SRAM从本质上来说是不同步的,但是可以修改为同步运转(如SDRAM的同步相当于DRAM),这通常被称为同步RAM。这时候,Flash存储器非常有用,尽管它的运作不同于其他存储器那样久远,仅仅是因为它易于使用且在FPGA开发板上经常用得到。Flash存储器本质上是电可擦只读存储器(EEPROM)的一种形式,可以用作是一种永久的RAM。只所以说是永久性的,是因为在Flash存储器中,存储装置即使在断电时仍能保存数据,因此它经常用作一种ROM,因为它可以用于存储FPGA程序,也可以用作RAM(动态)存储当前数据,因此普遍用于FPGA系统。二、用硬件描述语言(VHDL)对存储器进行建模当用VHDL对存储器进行建模时应非常小心,因为某些存储器不能合成,如果使用模块,即使是离片时,也必须能体现出正确的实际装置物理特征。这尤其适用于访问次数和时序扰乱情况。当时序扰乱时,所获得的数据最好的情况也许是可疑的,最坏的情况是完全无效的。设计师可以发现自己处于一个令人反感的处境,即仿真模块运行良好,而实际硬件完全不起作用。在此章节中,我们所使用的VHDL是在任何模型中都不会出现任何物理性延时,如果这些模块用于现实系统时,则会增加延时。三、只读存储器ROM本质上是一套在存储寄存器中预先定义的数值。这种存储器有2种定义,第一种是存储区数量,第二种是位元数量。比如,假如存储器各自有16个存储区和8个位元,那么这个存储器就可以定义为16×8ROM。基本的ROM有一个信息输入,可以存取地址的定义,还有一个信息输出,是一个存放数据的逻辑载体。设想在VHDL中的一个简单的ROM行为模块实体为:ENTITYROM16x8ISPORT(address:ININTEGERRANGE0TO15;dout:OUTstd_logic_vector(7DOWNTO0);ENDENTITYROM16x8;由此可以看到,地址已被定义为一个整数,但是数值范围局限于ROM范围中。ROM的架构定义为一个可以直接获取的固定数组元素。因此,一个带有一套样板数据元素的ROM范例可以定义如下:ARCHITECTUREexampleOFrom16x8ISTYPEromdataISARRAY(0TO15)OFstd_logic_vector(7DOWNTO0);CONSTANTromvals:romdata:=(“00000000”,“01010011”,“01110010”,“01101100”,“01110101”,“11010111”,“11011111”,“00111110”,“11101100”,“10000110”,“11111001”,“00111001”,“01010101”,“11110111”,“10111111”,“11101101”);BEGINdata<=romvals(address);ENDARCHITECTUREexample;如果我们采取这个范例,我们首先需要声明这个ROM是在一个VHDL测试台上的,然后制定地址使用一个整数信号。以下为一个testbench范例:libraryieee;useieee.std_logic_1164.all;entitytestromisendentitytestrom;architecturetestoftestromissignaladdress:integer:=0;signaldata:std_logic_vector(7downto0);beginrom16x8:entitywork.rom16x8(example)portmap(address,data);endarchitecturetest;需注意的是IEEE库中,std_logic_vector型号要求是std_logic_1164,数值取决于所选择的地址。四、随机存取存储器一个DRAM组件有一个二维结构的存储器被分离成一个网格结构,可以通过一个行地址和列地址进行访问。需要注意的是因为这是不同步的,所以不含有时钟。所谓不同步的含义是应必须注意存储器存取定时以确保数据在这个转移过程中的完整性。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;VHDL中的体系结构如下:architecturebehavofDRAM1MBisbeginprocess(RADDR,CADDR,RW)istypedramisarray(0to2*16-1)ofstd_logic_vector(15downto0);variableradd:INTEGERrange0to2*8-1;variablemadd:INTEGERrange0to2*16-1;variablememory:dram;begindata<=(others=>Z);iffalling_edge(RADDR)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;useieee.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,47after30ns,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模块不模拟任何在实际中出现的真实时滞,假如这对于功能性设计很重要,则必须在每模块中加入此项功能。图34DRAM模拟结果五、同步RAM在以上章节中我们可以观察到存储器是如何异步进行存取,而同步RAM则要求有一个时钟。在大多数的实际设计中,RAM在离片后可以用作一个独立的存储装置,但是有时对在FPGA上一个小的RAM区块用于快速访问或者是接近于硬件设备要求频繁访问一个相当小的内存块的本地存储进行定义是非常有用的。相对于其他可能性功能来说,通常的设计限制条件更适用于存储,因为使用触发寄存器来存储数据而没有太多地运用查找表(LUT)中的逻辑性的情况是区域密集的。一直用于FPGA设计的权衡是指权衡RAM板上提高性能和速度的潜能是否比增加区域更为重要。从设计的透视图可以看出,同步的RAMVHDL模块非常类似于先前验证的基本异步RAM模块。唯一的区别是异步RAM模块在取代申请地址后立即能获取数据,而在一个同步的RAM中的数据只能当出现时钟沿(上升沿或者下降沿取决于设计要求)时才可以访问。假如我们设想VHDL为一个SRAM的实体,可以看到以下实体要求有一个尺寸为2m的内存和一条2n的数据总线。VHDL模型有2个参数m和n。在默认的情况下,在RAM中,m值为10提供1024个地址字节,单位元n设定为8提供总共8K位元。很明显,规模是可以任意制定的,这说明这种计算方式要求有指定的内存块。需要注意有两个控制信号为计时器(clk)和允许写入(wr)。我们可以使存储卡同步写入。同步读取或者是一个更复杂的端口结构,但是在这种情况下,我们将可以体现在时钟的上升沿上进行同步读写。另外,当允许写入信号低时,我们用于允许写入状态的协议是积极主动的。同步RAM的VHDL结果如下:这个模块可以从几个方面考虑。第一个是存储器的访问,假如我们在VHDL中定义地址为std_logic_vector型号,然后我们不能简单地使用这个数值访问一个指定元素的数组。这要求有一个整数参数。我们也不能简单地直接计算一个std_logic_vector型号为一个整数型。首先我们必须做的的是转化std_logic_vector型号为一个无符号数字。这完成了将std_logic_vector型号转变为整数型步骤的一半,虽然我们可以使用变量做一个数字,但是却限制使用相同位元分辨率当做原始std_logic_vector。在这种情况下,这明显不是问题,因为地址不能比内存大否则会导致错误。最后一步是转化无符号型号为一个整数。这是通过使用转化整数功能完成,而且这是转化地址为需要访问单独元素数组的整数形式。考虑到此些数字功能使用的主要性,我们同样需要包含IEEE标准数字库在这种模式的报头,显示如下:Libraryieee;Useieee.std_logic_1164.all;Useieee.numeric_std.all;这也需要注意读写功能是相互排斥的,因为你不能从内存中读取和在同一时间进行写入,这是为了确保数据的完整性。同样读写功能都是时钟控制的,因此内存是读写同步的。六、Flash存储器如先前所提,Flash存储器本质上是EEPROM的一种。和标准RAM有点区别在于提供地址到存储器和依靠R/W信号,可以分别进行读取和写入数据。Flash存储器的一套标准的界面识别码包括以下元素:Pin功能激活状态CLE指挥锁存H,激活上升沿(WE)ALE地址锁存H,激活上升沿(WE)CE芯片启动LRE读取启动下降沿(RE)WE写入启动上升沿(WE)WP写入保护低信号Busy就绪/执行中L=执行中,H=就绪除了这些控制信号,当然还有地址总线和数据总线。我们可以使用类似的一个实体在VHDL的标准RAM内存块中实现这一点:在大多数情况下,我们不需要模拟Flash存储器本身,而更需要模拟的是与它的连接,因此,Flash存储器接口控制器的实体可以显示为:此设备的典型结构体系表示如下:这是Flash存储器控制器的基本略图,且会在设备间有明显的改变。七、总结此章节介绍了ROM存储类型、异步RAM、Flash存储器和同步RAM的重要性。非常主要的是应知道在大多数情况中,大内存块会包含有片外内存,因此可以完全使用这些模块进行模拟而不是使用合成物,但是假如在绝对要求的情况下,可以在FPGA本身保守地使用RAM。在这种情况下,加速和增加区域的权衡变得非常地尖锐,同样地,不能简单地认为可以增加大量的内存到FPGA上,因为这样会占据更多实用性的内存。第十章PS/2鼠标接口一、前言PS/2鼠标接口对于电脑和许多FPGA开发套件来说是标准的接口。该协议是一个双向同步串行协议,在本章节将回顾该协议的基础知识,另外,一个简单的VHDL接口代码使设计者可以使用鼠标,主要是用在一个标准的FPGA开发套件上。二、PS/2鼠标基础知识PS/2鼠标起源于二十世纪八十年代,并普遍应用于IBM个人电脑(PC)。它有一个通用的名字为“个人系统”,因此PS和第二版本就称为PS/2,而接口技术一直也根据此名称保留至今。PS/2接口本质上是带有一个定制串口的装置,用于支持每个连接器(不同于现在的USB可以在一个端口上连接多个装置)。数据传输率较慢为40kbps,设备供电电源为5V直流电源。与USB使用方法不同的是,USB设备通常是可热插拔的,即可以在任意时刻插上或拔掉,而PS/2设备不能移除除非电脑死机或当机。PS/2鼠标支持设备到主机和主机到设备间的通讯,且主机是通过一条5V电线供电给鼠标。三、PS/2鼠标命令PS/2鼠标有一套限制指令为按键指令或者鼠标移动指令。标准鼠标支持左键、中键和右键来读取指令、X(左右)位移和Y(上下)位移。X(左右)位移和Y(上下)位移是使用计数器跟踪,其数值本身相对于鼠标先前发出的数值不是绝对的位置。四、PS/2鼠标数据包PS/2鼠标沿着一条数据线以一连串数据包发送数据,而且与鼠标接口上的计时线同步。每个数据包包含3,8个字组,第一组字是带有一套带标志的配置字组,第二组字是供鼠标的X线移动,第三组字是供鼠标的Y线移动。鼠标位元组的描述如下表:每个移动字节为9位二进制补码,它的符号位在第一个字节里。位移可表示的值范围是-255到+255。五、PS/2操作模式PS/2鼠标有四种标准操作模式。当鼠标在通上电或者是受到“Reset”(OxFF)命令后进入Reset模式。在Reset模式执行完成后,则可以发送SetStreamMode(OxEA)命令给鼠标,让鼠标重新进入Stream模式。这两种模式时最常应用的操作模式,但是还有其他两种模式分别为Remote模式和Wrap模式。这两个模式对于鼠标与主机的连接测试非常有用。在Reset模式中。鼠标将自动重置且执行自检并设置如下缺省值:·采样速率为100采样点/秒·分辨率为4个计数值/毫米·缩放比例1:1·数据报告被禁止鼠标发送一个设备ID0x00到主机来区别设备是键盘还是处于扩展是中的鼠标,也就是PS/2鼠标。在Stream模式中,一旦鼠标检测到位移或发现一个活多个鼠标键的状态改变了就发送位移数据包。这意味着鼠标在没有收到任何命令之前不会发送任何位移数据包给主机。在遥控模式中,只有在主机请求数据的时候才报告给主机位移和按键状态,最终进入Wrap模式,这时鼠标会将每一条命令发回到主机,但是有两个例外“Reset”命令和“ResetWrapMode”命令不会发送回主机。六、PS/2滚轮鼠标带滚轮的鼠标是一种单独的设备,因此它有一个不同的ID为0x03。在这种情况下,完成复位后,鼠标发出ID,而至于滚轮鼠标,数据包现在为4个字节,且另外有一个字节来支持滚轮位移。这个字节值使用二进制制补码中意义最小的字组,因此,值范围是在-8到+7。七、基本PS/2鼠标处理模块VHDL代码VHDL处理器的最简单的形式可以将鼠标时钟信号当作系统时钟,然后对从鼠标输入的数据进行监控,如下所示:这种VHDL是非常简单的,在每一个时钟下降沿上,数据当前值可以读到数组(d)的下一个元素,当制补码为24位数据包被读入时(指数计为零),则数据包将此转录为3个字节。八、改良PS/2鼠标处理模块VHDL代码先前的鼠标处理模块所存在的问题是虽然它可以同步进行调整,但是在鼠标计时钟上会产生噪音,且数据信号会导致一个错误的时钟数据。因此另一种方法就是需要有一个更高频率的信号时钟,且可以当作一个可以监控PS/2时钟的信号。另外需要对PS/2时钟过滤进行检查,以便在存在一个相同的特定数值时,需考虑更改时钟。在这种情况中,改良鼠标处理模块等待FPGA中更高内置时钟速率的8个连续的高点号和低点,然后分别设置内置时钟的高点和低点。而鼠标处理器的相同日常任务是利用内部生成的时钟来管理数据的输入。九、总结本章节阐述了如何处理一个基本的PS/2鼠标信号,并以3字节的形式保存数据以便进一步处理。同时也介绍了两种收集数据的方法,一种是使用PS/2时钟。另一种是使用一个带有更快速内置时钟的样版。-