版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、 绪论1.1 FPGA的发展及结构特点1.1.1 FPGA的含义及发展 自从1985年Xilinx公司推出第一片现场可编程逻辑门阵列(Field Programmable Gates Array, FPGA)至今1。FPGA已经成为当今电子设计市场上应用最广泛的可编程逻辑器件之一。可编程逻辑器件按集成度来区分,可大致分为简单PLD和复杂PLD2。如图1.1所示 ,它的发展大致经历了以下三个阶段3:(1) 早期的可编程逻辑器件:70年代初期的可编程逻辑器件(PLD)主要用于各种类型的存储设备,主要器件有可编程只读存储器(PROM)、紫外线可擦出只读存储器(EPROM)、和电可擦出只读存储器(
2、EEPROM),由于结构比较简单,它们只能完成简单的逻辑功能。 (2) 结构上稍微复杂的可编程芯片:70年代末到80年代初,AMD公司和Lattice公司先后推出了可编程逻辑器件(PLD)。产品主要有PAL(可编程逻辑阵列,Program- mable Array Logic)、GAL(通用阵列逻辑,Generic Array Logic)和PLA(可编程逻辑阵列,Programmable Logic Array)。这几类器件在设计上有很强的灵活性,可以实现速度特性较好的逻辑功能,但由于结构简单,它们只能实现规模较小的电路。 (3) 功能齐全、编程灵活的可编程逻辑器件:80年代中期,Alter
3、a公司和Xilinx公司同期推出了CPLD(复杂可编程逻辑门阵列,Complex Programmable Logic Device)和FPGA(现场可编程逻辑门阵列,Field Programmable Gates Array),它们都具有体系结构和逻辑单元灵活,集成度高以及适用范围宽等特点,可以实现较大规模的电路。图1.1 可编程逻辑器件分类进入90年代以后,可编程逻辑集成电路进入了飞速发展时期,在系统可编程技术ISP(InSystem Programmability)和世界扫描测试技术的出现,使得可编程逻辑器件在器件编程技术和器件测试技术方面也获得了划时代的进步。FPGA/CPLD已成为
4、当今应用最广泛的可编程集成电路之一1。工程师可在办公室和实验室进行设计。它还具有静态可重复编程和在系统重构特性,使硬件和软件一样,能够通过编程来修改。1.1.2 FPGA的结构特点一些基本的逻辑器件如GAL、CPLD之类都是基于乘积项的可编程结构,即由可编程的与阵列和固定的或阵列组成。而FPGA则是另一种可编程逻辑结构查找表(Look Up Table,LUT)结构4,如图1.2所示。查找表(LUT)是可编程的最小逻辑构成单元。大部分FPGA采用静态随机存储器(SRAM)的查找表逻辑来形成结构,用SRAM来构成逻辑函数发生器。Xilinx公司的XC4000系列、Spartan/3/3E系列,A
5、ltera公司的FLEX10K、ACEX、APEX、Cyclone、Cyclone、Stratix等系列都采用SRAM查找表构成,这些都是典型的FPGA器件5。图1.2 FPGA查找表结构通用FPGA包含3类可编程资源,分别是可编程逻辑功能块、可编程I/O功能模块和可编程内部互连4,如图1.3所示。Cyclone/Cyclone系列器件是 Altera 公司一款低成本,高性价比的FPGA,它的结构和工作原理在FPGA器件中具有典型性。Cyclone/Cyclone器件主要由逻辑阵列快LAB、嵌入式存储块、I/O单元、嵌入式硬件乘法器和PLL等模块组成,各模块之间存在着丰富的互联线和时钟网络。图
6、1.3 FPGA内部结构1.2 FIFO的基本概念及分类1.2.1 FIFO的基本概念及功能FIFO(First In First Out)是先进先出存储器的缩写,它是一种实现数据先进先出的存储器件,通常用作数据缓冲器6。它与普通存储器的主要区别在是FIFO不需要外部读写地址线,在使用中具有简单,方便的特点。FIFO一般用于不同时钟之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,在两个不同的时钟域间就可以采用FIFO作为数据缓冲。另外,对于不同宽度的数据接口也可以用FIFO,例如单片机为8位输出,DSP为16位输出,在单片机域DSP连接时就可以使用FIFO来达到数
7、据匹配的目的。在实际工作中,对FIFO的数据操作是靠其满/空标志来实现的。所谓满标志,指的是当对FIFO写数时,如果数据足够多,多到FIFO的内存已经装满了,此时便由FIFO内部状态电路送出一个表示内存已满的信号以阻止对FIFO的写操作。同理,所谓空标志,指的是当从FIFO读数时,如果数据被读完了,便有FIFO内部状态电路送出一个空标志信号以阻止对FIFO的读操作。总之,在控制FIFO的读写操作时,必须把握一个原则:写满不溢出,读空不多读7。1.2.2 FIFO存储器的分类 根据FIFO存储器工作的时钟域不同,可以将FIFO存储器分为同步FIFO存储器和异步存储器两大类。同步FIFO存储器是指
8、读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作;异步FIFO存取器是指读写时钟不一致,读写时钟是互相独立的。和同步时钟相比,特别是在网络接口、图像处理等方面,异步FIFO存储器应用空间更为广泛。1.3 硬件实验平台简介GW48EDA/SOPC实验系统是杭州康芯电子有限公司开发,一个对EDA/SOPC的基本实验平台。该系统拥有以下几个重要特点8:1. 多功能重配置结构电路结构(Multi-task Reconfiguration)。该电路结构能仅通过一个键,完成以纯电子切换的方式选择十余种不同的实验系统硬件电路连接结构,大大提高了实验系统的连接灵活性,同时又不影响整个系统的工作速度。
9、这里仅仅说明本文中所涉及到的电路模式,我们选择为模式NO.0。如图1.4所示。图1.4 模式NO.0连接结构2. FPGA/CPLD万能插口 图1.6是一块插于主系统板上的目标芯片适配座,对于不同的目标芯片可有不同的适配座。可用的目标芯片包括目前世界上最大的六家FPGA/CPLD厂商几乎所有的CPLD/FPGA和所有的ispPAC等模拟EDA器件。每个脚本公司已经将定义标准化,各种芯片对应关系可以在实验说明中查到8。图1.6 芯片与引脚对应关系3. ByteBlasterMV编程配置口:此口由两个用途(1) 在对适配板FPGA/CPLD进行编程时,用十芯线板口和适配板的JTAG口连。(2) 如
10、果进行独立的电子系统、应用系统开发等开发实践活动,首先应该将系统板上的目标芯片适配座拔下(对于Cyclone器件不用拔),用配置的10芯编程线将ByteBlasterMV口和独立系统上适配板的JTAG10芯相接,进行在系统编程,进行调试。1.4 Quarters特点及开发流程1.4.1 EDA的设计流程简单地说,电子设计自动化(EDA,Electronic Design Automation)技术可以概括为以大规模可编程逻辑器件CPLD/FPGA为设计载体,通过硬件描述语言输入给相应开发软件,经过编译和仿真处理,最终下载到设计载体中,从而完成系统电路设计任务的一门新技术。图1.7 EDA设计流
11、程利用EDA技术进行电路设计的大部分工作是在EDA软件工作平台上进行的,EDA设计流程如图1.7所示。EDA的标准设计流程采用自上而下(UP-DOWN)的模式,包括设计准备、设计输入、设计处理、器件编译和设计完成5个步骤,以及相应的功能仿真、时序仿真和器件测试等三个设计验证过程9。相对于以前自下而上的设计方式,EDA设计方式有很多优点,例如它可以先编程、仿真。知道最终测试通过后才开始具体的硬件实现,这样就大大地节约了设计成本,同时也提高了设计的效率。1.4.2 Quarters特点 Quarters是Altera公司推出的目前应用非常广泛的一款EDA开发系统。它是一个完整的多平台设计环境。它可
12、以轻松满足特定设计的需要,并且提供可编程片上系统(SOPC)设计的综合开发平台,是SOPC设计的基础。Quarters 将设计、综合、布局、仿真验证、和编程下载以及第三方EDA工具集成在一个无缝的环境中,可以进行系统级设计、嵌入式系统级设计和可编程逻辑器件设计10。Quarters开发工具提供了完全集成,且与电路结构无关的数字逻辑设计环境,以及SOPC设计的嵌入式系统开发平台。主要特点如下:1. 可利用原理图、结构图、VerilogHDL、VHDL、AHDL等硬件描述语言完成逻辑电路的描述和编辑,以及芯片(电路)平面布局连线的编辑。2. 功能强大的逻辑综合工具,并提供RTL级查看器(原理图视图
13、和层次结构列表)。3. 完备的电路功能描述和时序逻辑仿真工具。4. 自动定位编译错误,提供高效的器件编程与验证工具。5. RTL-to-Gate形式验证。此外,Quarters还将默认安装SOPC Builder,自动添加、参数化和连接IP核,包括嵌入式处理器、协处理器。外设和用户自定义逻辑,从而为嵌入式的开发提供方便。1.4.3 Quarters设计流程 Quarters提供了完全集成且与电路结构无关的数字逻辑设计环境,拥有图1.8 Quarters设计流程CPLD/FPGA各个开发阶段对应得开发工具。图1.8是Quarters的开发流程示意图,Quarters为开发流程的每个阶段提供Qua
14、rters图形用户界面。EDA工具界面11。大大方便了用户的开发工作,提高开发效率。2、 同步FIFO存储器设计2.1 同步FIFO软件设计流程同步FIFO存储器通常是指FIFO存储器的读写时钟频率相同、来源相同,这种FIFO存储器的设计较为简单而且传输数据也很快速,因为它避免了由于异步时钟逻辑产生的在许多设计中具有挑战性的难题。同步FIFO存储器通常用在读写时钟相同的接口部分,这种FIFO存储器相比较而言,逻辑较为简单,时延较小,传输数据的速度比较快。此外,同步FIFO存储器还具有深度可扩展性12。同步FIFO存储器的整个系统可分为写地址产生逻辑、读地址产生逻辑、双端口存储器、满/空标志产生
15、逻辑4大部分。其中,同步FIFO存储器的存储介质为一块双端口RAM,可以同时进行读写操作。在写地址产生逻辑部分,由写地址产生逻辑产生写控制信号和写地址;在读地址产生逻辑部分,由读地址产生逻辑产生读控制信号和读地址。在满/空标志产生部分,由读写地址相互比较产生满/空标志。具体模块结构如图2.1所示:读数据写数据双端口存储器写控制信号写地址读控制信号读地址满/空标志产生逻辑满标志空标志时钟输入写地址产生逻辑读地址产生逻辑图2.1 同步FIFO存储器逻辑结构图2.2 同步FIFO的VHDL语言描述及仿真2.2.1同步FIFO存储器VHDL语言描述 根据FIFO的深度可扩展性,我们以采用宽度为8,深度
16、为64为设计目标。由于同步FIFO存储器各个模块描述相对来说比较容易,我们采用一个结构体,多个进程的方式进行描述7。下面给出同步FIFO存储器源程序及相关说明: LIBRARY IEEE; 设计中相关库的说明;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;定义实体FIFO,其逻辑结构及相应端口如图2.2所示。ENTITY FIFO ISPORT ( clk : IN STD_LOGIC; FIFO的时钟输入 write_en : IN STD_LOGIC; FIF
17、O的写使能信号 read_en : IN STD_LOGIC; FIFO的读使能信号 rst : IN STD_LOGIC; FIFO的复位信号 din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 8位数据输入 dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);8位数据输出 empty : OUT STD_LOGIC; 空标志信号 full : OUT STD_LOGIC); 满标志信号END FIFO;rstWrite_ennenRead_en clk dinemptyfulldout实体FIFO图2.2 同步FIFO存储器端口示意图下
18、面是同步FIFO存储器的结构体描述:ARCHITECTURE Behavioral OF FIFO ISTYPE fifo_array IS ARRAY(0 TO 63) OF STD_LOGIC_VECTOR(7 DOWNTO 0); 定义长为64宽为8的数组类型 SIGNAL fifo_memory : fifo_array; 定义FIFO的储存介质; SIGNAL full_flag : STD_LOGIC; 内部满标志信号;SIGNAL empty_flag : STD_LOGIC; 内部空标志信号SIGNAL read_addr : STD_LOGIC_VECTOR(5 DOWNTO
19、 0); 读地址SIGNAL write_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); 写地址SIGNAL counter : STD_LOGIC_VECTOR(5 DOWNTO 0); 计数器BEGINP1进程的功能是:在时钟信号和写使能信号的共同作用下,实现对FIFO的写操作。这里必须注意的是,FIFO存储器只有在非满的情况下。才能进行写操作。否则会引起益出的情况。P1:PROCESS(clk) P1进程由时钟触发BEGINIF(clkEVENT AND clk=1)THEN 当时钟上升沿来临时IF(rst=1 AND write_en=1 AND full_f
20、lag=0)THEN 复位后写使能信号有效且非满fifo_memory(CONV_INTEGER(write_addr)=din; 将数据由输入端口写入相应地址;END IF;END IF;END PROCESS;P2进程的功能是:在时钟信号和写使能信号的共同作用下,实现对FIFO写数地址的加一操作。这里必须注意的是,FIFO只有在非满的情况下,才能进行地址加一操作,否则会引起益处。P2:PROCESS(rst,clk) P2进程由复位信号与时钟信号触发BEGINIF(rst=0)THEN 复位前,地址初始化为0 write_addr=;ELSIF(clkevent AND clk=1 AND
21、 full_flag=0)THEN 在RAM非满情况下,当时钟上升沿来临,写地址加1 rite_addr=write_addr+1;END IF;END PROCESS;P1、P2两个进程综合起来,实现了FIFO存储器对数据的写操作,复位后,在RAM非满且写使能信号有效条件下,当时钟上升沿来临时,写地址产生逻辑产生写地址并送入RAM中,同时RAM将数据从输入端口写入到相应的写地址中去,实现了写地址逻辑模块与RAM的写操作。P3进程的功能是:在时钟信号和读使能信号的共同作用下,实现对FIFO的读数操作。这里必须注意的是FIFO只有在非空的情况下,才能进行操作,否则会引起错读的情况。P1:PROC
22、ESS(rst,clk) P1进程由复位信号与时钟信号触发BEGIN IF(rst=0) THEN 复位高电平有效; dout=ZZZZZZZZ;ELSIF(clkEVENT AND clk=1) THEN 时钟上升沿来临;IF(read_en=1 AND empty_flag=0) THEN 读使能信号有效且非空条件下 dout=fifo_memory(CONV_INTEGER(read_addr);将RAM内相应地址的数据送到输出端口END IF;END IF;END PROCESS;P4进程的功能是:在时钟信号和读使能信号的共同作用下,实现对FIFO读数地址加1操作。这里必须注意的是,F
23、IFO只有在非空的情况下,才能进行地址加一操作,否则会引起错读。P4:PROCESS(rst,clk) P4进程由复位信号和时钟信号触发BEGINIF(rst=0)THEN 复位前,设置读地址初始值为0 read_addr=;ELSIF(clkevent AND clk=1) THEN 复位后,当时钟上升沿来临时,读地址加1 read_addr=read_addr+1;END IF;END PROCESS;P3、P4两个进程综合起来,实现了FIFO存储器对数据的读操作,复位后,在RAM非空且读使能信号有效条件下,当时钟上升沿来临时,读地址产生逻辑产生读地址并送入RAM中,同时RAM将数据从相应
24、的读地址中读出到输出端口。,实现了读地址逻辑模块与RAM的读操作。P5进程的功能是:通过设计计数器,协调读写操作。当读写使能信号无效时,计数值索存当前值,当读写信号有效时。计数器也应该索存当前值。也就是说,读写操作是分时进行的。P5:PROCESS(clk,rst) P5进程由复位信号和时钟信号触发VARIABLE temp:STD_LOGIC_VECTOR(1 DOWNTO 0); 定义地址变量BEGINIF(rst=0)THEN 复位前,RAM不计数 counter 读写时钟信号都无效,不读不写,锁存当前值 counter 仅写使能信号有效,只写不读,RAM内数据增加,计数加1 IF(co
25、unter/=)THEN 在非满前提下 counter 仅读使能信号有效,制度不写,RAM内数据减少,计数减1 IF(counter/=)THEN 在非空前提下 counter 读写使能信号都有效,边读边写,RAM内数据不变,锁存当前值 counter counter=counter;END CASE; END IF;END PROCESS;P6进程的功能是:产生正确的空标志符号(只有计数器为0时,空信号才有效)P6:PROCESS(counter) P6进程是由计数器来触发的BEGINIF(counter=)THEN empty_flag=1; ELSEempty_flag=0;END IF
26、;END PROCESS;empty=empty_flag; 输出空标志信号P7进程的功能是:产生正确的满标志信号(只有计数器的值为63时,满信号才有效)P7:PROCESS(counter)BEGINIF(counter=)THEN full_flag=1;ELSE full_flag=0;END IF;END PROCESS;full=full_flag; 输出满标志信号END Behavioral;在P5,P6,P7进程中,通过设计一个和读写操作同步的计数器,记录了FIFO当前读写地址,并对临界情况做了正确控制,有效的协调了读写操作。从而解决了产生正确的满空信号的难点。 2.2.2 同步
27、FIFO存储器时序仿真及分析程序在Quarters软件中编好并经调试运行成功后,新建波形仿真文件,然后把所设计的同步FIFO存储器实体中所有的输入/输出端口放到文件中,设置相应的输入端口并开始仿真。下面是同步FIFO的仿真图,其中图2.3和图2.4的控制时钟周期是100ns,写使能信号固定在高电平,读使能信号开始在低电平,而后到高电平。图2.3 时钟100ns仿真前半部分从图2.3中可以看出,复位后,开始往同步FIFO存储器中写数,空标志信号转为非空,当写读使能信号有效后,FIFO存储器开始往外读数,但是由于开始写进的数据没有填满存储器,所以输出”。符合设计要求。图2.4 时钟100ns仿真后
28、半部分从图2.4中可以看出,每过一个时钟周期,同步FIFO存储器往RAM内写一个数,经过大概64个时钟周期后,同步FIFO储存器内数据已经写满。开始往外依次读数,并且每当每个周期时钟上升沿到来时,边写边读。实现了FIFO存储器同步读写和数据缓冲的作用。其他设置不变,我们输入端控制时钟信号的周期增大到200ns,仿真结果如图2.5所示。同样我们可以看出,当控制时钟信号周期为200ns时,信号频率减小一倍,FIFO存储器数据写入速度减小一倍。所以到经历了大概12us多,才有输出。即同样写入64个数据后才开始往外读数。并且当每个控制时钟信号上升沿来临时,同时读写,仍然实现了同步FIFO存储器的功能要
29、求。这里要说明的是,仿真图中时间可能不是严格意义上的正确。这是因为时序仿真时存在延时造成的。图2.5时钟200ns时序仿真2.3 硬件实现 2.3.1引脚设置与下载程序仿真成功后,开始进行引脚设置和下载。在Quarters开发环境下,选择tool菜单中的Assignments项,进入Assignments Editor 编辑窗,在Category栏中选择pin按钮。 单击new选择本工程要锁定的端口信号名,添加到引脚列表中。我们选择模式NO.0模式,因采用的是ALTERA公司生产的Cyclone系列中的EP1C12Q240C8芯片,图2.6 同步FIFO存储器引脚配置表经过查阅相应的“芯片引脚
30、对照表”将相应引脚编号添加到地址栏中。由于下载到实验台上需要手工来操作,不可能达到读写数据的时钟频率,本文通过实验平台仅仅能检验出其功能的可行性。这里将键3设置为时钟控制。键8设置为复位。如图2.5所示。具体的引脚配置表。2.3.2配置文件下载将编译产生的SOF文件配置进FPGA中,具体步骤如下:(1) 打开编程窗和配置选项。在菜单tool中选择Programmer,在Mode栏中选择JTAG模式,并选择打钩下载文件右侧的第一小框。如图2.7所示。(2) 设置编程器。将试验箱和电脑相连接,然后打开Quarters中的Hardware Setup对话框,选择ByteBlasterMV之后,点击C
31、lose按钮关闭对话框即可。图2.7 编程下载对话框(3) 硬件测试。成功下载FIFO.sof后,选择实验电路模式NO.0,将复位键、读写使能键均置高位,手动触发时钟信号键,每写一个数,触发一次,输入64个数之后,在同步时钟控制下,开始输出第一个输入的数,符合同步FIFO的设计原理。3、 异步FIFO存储器设计3.1 异步FIFO工作原理异步FIFO存储器相当于一个双端口的RAM,一个端口只能写数据,另一个端口只能读数据。同时读写数据必须按照存储器地址的递增或者递减顺序进行13。如图3.1,是异步FIFO存储器的原理图。它由四部分组成,目前其内部存储器一般采用双端口RAM,输入输出具有两套数据
32、线,独立的读写地址指针在读写时钟的控图3.1 异步FIFO存储器原理图制下顺序地从双口RAM读写数据。用写时钟把数据放入双口RAM,用读时钟从中读取。同时根据FIFO存储器中的空/满标志信号来判断何时可以把数据写入FIFO或从FIFO中读出。这样就可以把写数据和读数据分开,使整个系统分为完全独立的时钟域,实现异步FIFO的功能13。3.2 异步FIFO设计关键问题设计异步FIFO存储器有两个关键问题,一是如何使不同系统间异步信号同步,使触发器不产生亚稳态;二是如何正确地设计满/空标志信号的电路。下面将阐述解决问题的具体方法。3.2.1 亚稳态问题的解决 在数字集成电路中,触发器要满足建立时间(
33、set up)和保持时间(hold)的限制要求。当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。这个过程称为亚稳态( Metastabihty )。图3.2所示为异步时钟和亚稳态,cIka和clkb为异步时钟14。图3.2异步时钟和亚稳态图3.3 两级时钟同步消除亚稳态亚稳态必定会发生在异步FIFO存储器中。因为在异步FIFO中,读写时钟是完全独立的。虽然亚稳态问题不可避免,但是使用以下两种方法,可以使其发生的概率降到一个可以接受的地步14。(1) 对写地址/读地址采用格雷码。由实践可知,同步多个异步输入信号出现亚稳态的概
34、率远远大于同步一个异步信号的概率。对多个触发器的输出所组成的写地址/读地址可以采用格雷码。由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。(2) 采用触发器来同步异步输入信号。如图3.4中两级触发器可以将出现的亚稳态降到很小程度,但是同时也带来了一定的延时。需在设计中加以注意。3.2.2 满/空标志信号的产生满/空标志信号的产生是异步FIFO存储器设计的核心部分。是否能正确设计此部分逻辑,将直接影响到FIFO得性能。满/空标志产生的原则是:写满不溢出,读空不多读。无论在什么时候,都不应出现读写地址同时对一个存储器地址操作的情况15。我们可以通过设置额外的状态位的办法来判断满/空
35、状态。读写指针由地址位和状态位组成,地址位随着相应的操作递增,指针由内存的最后位置回到初始位置的时候状态取反。因此,当读写指针的地址位和状态位全部吻合时,读写指针经历了相同次数的循环移动,由此可知判断满/空标志的公式:Empty=(读指针=写指针)Full=(读指针最高位/=写指针最高位)AND(读指针其他位=写指针其他位)3.3异步FIFO存储器的设计流程3.3.1 格雷码计数器的设计 根据以上原理,在设计异步FIFO存储器之前,我们需先进行格雷码计数器的设计。二进制指针是由一位状态位和若干二进制编码的地址位组成。如果在不同时钟域内直接同步二进制指针,有可能产生问题。例如,当读指针从0111
36、向1000变化的时候,指针所有的位都要变化,如果写时钟恰好在读指针的变化时刻采样,那么得到的读指针值有可能从0000到1111的任何一个,所以二进制不宜被直接同步。为了在不同时钟域内可以同步指针,可以采用格雷码编码方式,即指针每次移动只变化一位,这样就避免了由于指针多位同时变化而无法直接同步的问题13。格雷码计数器是通过同步相应的二进制计数器,将对应的二进制码转换成格雷码来实现的,由于SRL运算的对象只能是BIT数据类型,因而在转码逻辑运算中调用了TO_BITVECTOR和TO_STDLOGICVECTOR数据类型的转换。格雷码计数器源程序如下:LIBRARY IEEE;USE IEEE.ST
37、D_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY graycounter IS PORT( clk : IN STD_LOGIC; rst: IN STD_LOGIC; ennable : IN STD_LOGIC; -使能信号; gray_out: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); 格雷码输出 bin_addr: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); 二进制码输出END graycounter;格雷码计数器的主
38、要功能为,当时钟上升沿来临时,在使能信号有效前提下,地址位加1,然后再将地址转化成格雷码,最后一起输出。ARCHITECTURE behavioral OF graycounter ISSIGNAL bin : STD_LOGIC_VECTOR(6 DOWNTO 0); 格雷码产生所需内部信号BEGINPROCESS(clk,rst)BEGINIF(rst=0) THEN bin=; gray_out=;ELSIF(clkevent and clk=1) THEN IF(ennable=1)THEN bin=bin+1; 二进制计数器 gray_out=(to_stdlogicvector(t
39、o_bitvector(bin)srl 1)xor bin;通过SRL和XOR实现二进制码向格雷码的转变; END IF; END IF;END PROCESS;bin_addr(5 DOWNTO 0)=bin(5 DOWNTO 0);END behavioral;将源程序在Quarters上运行后仿真图如图3.4,其中时钟周期为100ns,复位置高位,当使能信号有效后,开始输出二进制和格雷码。由图可知,二进制每加一,格雷码则变换一位。实现了由二进制向格雷码的转换。与二进制码相比,格雷码计数器实现了状态的最少翻转,大大降低了亚稳态出现的几率。3.4格雷码计数器的仿真图3.3.2 异步FIFO存
40、储器的整体设计本节设计一个宽为8,深度为64的异步FIFO存储器,并应用上述方法解决设计中遇到的亚稳态和满/空标志信号问题。并对其进行行为级时序仿真。异步FIFO源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;异步FIFO存储器有两个时钟输入和两个读写使能信号输入端口复位后,在这几个信号的共同作用下,控制数据的输入输出。ENTITY FIFO_64 ISPORT( clk_read : IN STD_LOGIC; -FIFO读时
41、钟信号; clk_write : IN STD_LOGIC; -写时钟信号; write_en : IN STD_LOGIC; -写使能信号; read_en : IN STD_LOGIC; -读使能信号; rst : IN STD_LOGIC; -复位信号; din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -数据输入端; dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -数据输出端; empty : OUT STD_LOGIC; -空标志信号; full : OUT STD_LOGIC); -满标志信号;END FIFO_64;
42、ARCHITECTURE behav OF FIFO_64 ISTYPE FIFO_ARRAY IS ARRAY(0 TO 63) OF STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL FIFO_MEMORY : FIFO_ARRAY; 定义异步FIFO储存介质;SIGNAL write_enable : STD_LOGIC; FIFO内部写使能控制信号;SIGNAL read_enable : STD_LOGIC; FIFO内部读使能控制信号;SIGNAL full_flag : STD_LOGIC; FIFO内部满标志信号;SIGNAL empty_flag : S
43、TD_LOGIC; FIFO内部空标志信号;SIGNAL read_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); 读地址SIGNAL write_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); 写地址;SIGNAL read_ptr : STD_LOGIC_VECTOR(6 DOWNTO 0); 读时针;SIGNAL write_ptr : STD_LOGIC_VECTOR(6 DOWNTO 0); 写时针;SIGNAL read_ptr_meta : STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL read_ptr
44、_write_synch : STD_LOGIC_VECTOR(6 DOWNTO 0); 定义计数器格雷码的二级触发读信号;SIGNAL write_ptr_meta : STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL write_ptr_read_synch : STD_LOGIC_VECTOR(6 DOWNTO 0); 定义计数器格雷码的二级触发写信号;COMPONENT GrayCounter 格雷码计数器件声明;PORT( clk : IN STD_LOGIC; -时钟信号; rst : IN STD_LOGIC; ennable: IN STD_LOGIC;
45、gray_out: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); bin_addr: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END COMPONENT;BEGINP1进程的功能是:在读时钟信号和读控制信号的共同作用下,实现对FIFO存储器的读操作。这里需要注意的是:为了提高数据线的利用率,应当在读操作之外将数据线置为高阻来释放数据线。P1:PROCESS(clk_read)BEGINIF(clk_readevent AND clk_read=1) THEN 当读时钟上升沿来临IF(read_enable=1) THEN 且读控制信号有效 dou
46、t=FIFO_MEMORY(CONV_INTEGER(read_addr); RAM内相应读地址标志的数据被送到输出端口ELSE dout=ZZZZZZZZ;END IF;END IF;END PROCESS;P2进程的功能是:在写时钟信号和写控制信号的共同作用下,实现对FIFO的写操作P2:PROCESS(clk_write)BEGINIF(clk_writeevent AND clk_write=1) THEN 当写时钟上升沿来临时,IF(write_enable=1)THEN 在写使能信号有效的前提下 FIFO_MEMORY(CONV_INTEGER(write_addr)=din;待输
47、入数据从输入端口被写到相应的写地址中去END IF;END IF;END PROCESS;P3进程的功能是:通过写使能信号和满标志信号产生内部写控制信号,只有在写使能信号有效并且FIFO的当前状态不为满的情况下,才允许写控制信号有效。P3:PROCESS(write_en,full_flag)BEGINIF(write_en=1 AND full_flag=0) THEN 在写使能信号有效且RAM非满条件下 write_enable=1; 写控制信号才有效ELSE write_enable=0;END IF;END PROCESS;P4进程的功能是:通过读使能信号和空标志信号产生读控制信号,只
48、有在读使能信号有效并且FIFO的当前状态不为空的情况下,才允许读控制信号有效。P4:PROCESS(read_en,empty_flag)BEGINIF(read_en=1 AND empty_flag=0) THEN 读使能信号有效且RAM非空时条件下 read_enable=1; 读控制信号有效ELSE read_enableclk_write, rst=rst, ennable=write_enable, gray_out=write_ptr, bin_addr=write_addr);Clk_writeclkrstrstWrite_ennableeeennableGray_outWri
49、te_ptrBin_addrWrite_addr图3.5 格雷码计数器连线示意图对异步FIFO存储器的读状态调用格雷码计数器,目的是产生可靠的FIFO读指针,其具体功能同写状态格雷码计数器相同。GrayCounter_read:GrayCounter PORT MAP( clk=clk_read, rst=rst, ennable=read_enable, gray_out=read_ptr, bin_addr=read_addr);P5进程的功能是:通过两级触发器消除亚稳态产生出来被写时钟同步了的读时针P5:PROCESS(clk_write,rst)BEGINIF(rst=0) THEN read_ptr_meta=; read_ptr_write_synch=;ELSIF(clk_writeevent AND clk_write=1)THEN read_ptr_meta=read_ptr; 级触发 read_ptr_write_synch=read_ptr_meta; 二
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产经营经济考核制度
- 权益部对干事考核制度
- 苏江传媒运营考核制度
- 企业外包人员考核制度
- 消防车辆中队考核制度
- 生产员工每日考核制度
- 在线客服人员考核制度
- 中国电信绩效考核制度
- 加工中心技师考核制度
- 干部培训 挂职考核制度
- 乳牙根管治疗护理配合
- 机械设计基础(第二版)课件全套 李春明 绪论、1.1 平面机构及自由度 - 5.1 机械系统方案设计概述
- 创新医疗供应链管理模式提升医疗服务水平
- 防性侵课件主题班会
- 2025-2030中国保健醋行业市场运发展分析及竞争形势与投资战略研究报告
- 糖尿病科护理组长岗位竞聘
- 中国古代科学技术与自然观
- 新苏教版五年级下册科学全册习题一课一练(含答案)
- 明代马一龙《重修广惠庵碑记》碑刻
- 矿井通风系统调整方案实用文档
- 列尾作业员必知必会
评论
0/150
提交评论