? 11 ?
第八章 使用VHDL语言来设计时序电路 时序电路是一种常用的电子电路,其和组合逻辑电路是完全不同的两种类型的电路,组合电路的输出仅仅和电路当时的输入有关,而时序电路的输出不仅仅和电路当前输入相关,还和电路过去输入相关,本章将介绍时序电路的基本原理和如何在VHDL语言中进行时序电路设计。 8.1 时序电路基础 由于时序电路的输出和其过去的状态也相关,所以时序电路中必然有记忆元件,用于记忆和过去输入信号相关的信息。 时序电路可以分为两大类: ● 同步时序电路:其所有电路都是用一个公共的时钟信号,电路中所有的记忆元件都受到这个时钟信号的同一控制,只有在该信号来到的时候记忆元件的状态才能发生变化,从而使时序电路的输入发生变化;而且每次时钟信号到来的时候,记忆元件的状态和电路的输出状态才会发生改变。 ● 异步时序电路:其电路中没有一个统一的时钟信号,各个记忆元件也不受到同一个时钟控制,电路状态的改变是因为输入信号引起的。 注意:绝大多数的实际应用电路,从宏观上看都是异步时序电路,而从微观(各个模块)上看都是同步时序电路,所以也可以认为同步时序电路是异步时序电路的基础。 时序逻辑电路在电路结构上有两个显著的特点。一是它通常包含组合电路和存储电路两个组成部分,而存储电路是必不可少的;二是存储电路的输出状态必须反馈到电路的输入端,与输入信号一起共同决定电路的输出。 由于任何时序逻辑电路都是以时钟为驱动信号的,时序电路只有在时钟信号的控制下其电路状态才会改变,时钟信号是时序电路的执行条件。另外由于时序逻辑电路有存储功能,因此它就具有初始状态,为了使时序电路正常工作,需要用复位信号使电路状态回归到一个确定的状态。 8.2 时序电路的时钟信号 时钟信号在时序逻辑电路中有着重要的作用,它将驱动时序逻辑电路状态的转移,根据时钟信号可以区分时序电路的原来状态和当前状态。 ? 12 ?
第九章 使用VHDL语言来设计存储器 存储器(Memory)是数字系统的重要的组成部分,因为数字系统的工作一般都会伴随着数据的存储。存储器实际上是一种时序逻辑电路。数字系统中存储器主要包括:只读存储器(ROM)、随机存储器(RAM)和先入先出存储器(FIFO),本章将介绍使用VHDL语言来设计这些存储器的方法。 9.1 只读存储器(ROM)设计 9.1.1 只读存储器(ROM)基础 ROM是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦写入数据就无法再将之改变或删除。通常用在不需经常变更数据的电子或电脑系统中,并且数据不会因为电源关闭而消失,简而言之ROM就是只能读不能写。 注意:ROM的“不能写”准确来说是是对写入数据要求的条件比较高,比如说要求更高的工作电压、紫外光照射等,并不是说完全不能再重写。 9.1.2 只读存储器(ROM)的VHDL语言实现 1. 单口只读存储器 单口只读存储器是指ROM只有一套数据总线,其同时只支持一个对ROM中地址单元的读操作。例9.1是一个256字节容量的8位单口ROM的VHDL语言实现实例,需要注意的是在实现中定义了一个文件用于将ROM中所有地址单元的数据内容都进行了初始化操作。 【例9.1】单口ROM的VHDL实现 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity single_port_rom is port ( addr : in natural range 0 to 255; clk q : in std_logic; --地址变量 --时钟变量 --八位输出 --库文件 --实体 : out std_logic_vector(7 downto 0) ? 13 ?
第十章 使用VHDL语言来设计状态机 状态机就是一组触发器的输出状态随着时钟和输入信号按照一定的规律变化的一种机制或过程,所有的时序电路从理论上都可以表示为有限状态机(Finite State Machine,FSM),有限状态机是实现高可靠逻辑控制的重要途径,是大型数字系统设计中的重要组成部分,尤其是进行复杂时序逻辑电路的实现。本章在基本时序逻辑电路描述的基础上,介绍采用VHDL进行有限状态机设计的方法和有限状态机设计中需要注意的一些问题。 10.1 状态机基础 数字系统一般可分为控制单元和数据通道,数据通道通常由组合逻辑电路构成,而控制单元通常由时序逻辑电路构成。控制单元的每一个控制态可以看作一种状态,而状态之间的转换条件指定了下一个状态和输出信号,因此采用有限状态机可以非常清楚的描述时序电路之间的状态转换模式和状态转换的条件。 10.1.1 状态机的分类 有限状态机根据输出信号与当前状态以及输入信号的关系来分,可以分为Moore型和Mealy型两种: ● 输出信号只和当前状态有关的状态机称为Moore型状态机,如图10.1所示。 ● 输出信号不仅和当前状态有关,而且也和输入信号有关的状态机称为Mealy型状态机,如图10.2所示。 input次态逻辑next_state状态寄存器clkresetcurrent_state输出逻辑output 图10.1 Moore型有限状态机 次态逻辑next_state状态寄存器clkresetcurrent_state输出逻辑output 图10.2 Mealy型有限状态机 ? 14 ?
第十一章 VHDL语言的层次化设计 在使用VHDL语言来进行大型数字系统设计的时候可以采用层次化结构设计的方法将系统拆分为几个层次进行,这样可以使得系统的体系更加清晰,降低设计难度。本章将详细介绍VHDL语言的层次化设计思想以及如何使用层次化设计思想来进行数字系统设计,包括库、程序包以及配置的使用方法。 11.1 层次化结构设计基础 任何复杂的数字系统最终都可以分解基本门电路和寄存器电路单元,根据这个思路,在采用VHDL语言进行数字系统设计过程中,也可以将设计目标进行层层分解,在各个层次上分别设计;或者将目标分解成一些模块,各个模块同时进行设计,最后进行组合联调,这就是层次化、结构化的设计方法。层次化的设计方法能使复杂的电子系统简化,并且在不同的层次上都能够进行仿真验证,及时发现错误并加以纠正。结构化的设计能够将复杂的系统划分成一些模块,各个模块同时进行设计,分别编译、仿真验证,最后组合成一个系统,这样便于一些子模块资源的共享,如可以利用已经完成的工程项目中设计好的模块。 对于一个数字系统来说,设计层次可以从两个不同的角度来划分:按照性能描述划分和按照结构描述划分,对应于第三章中VHDL程序设计的不同描述风格——行为描述和结构描述。 系统的性能描述主要关注系统的行为,即系统完成什么功能,它通常只表示系统的输入输出间的关系,以系统的功能为设计目标,以系统的输入信号、内部状态和输出信号的要求为设计中心,至于具体的逻辑电路实现则并不关注。 系统的结构描述主要关注于实现某一功能的系统的具体结构以及各组成模块之间的连接关系,包括各个功能单元的具体的端口定义。它不能直观的表示系统的逻辑功能,需要根据各组成单元的功能及其相互驱动关系来确定,它是系统功能的具体实现电路。 数字系统一般可以分为以下6个层次:系统级、芯片级、寄存器级、门级、电路级和版图级。与之相对应,系统的性能描述和结构描述也可以分为6个层次,表8.1是对不同设计风格和设计层次的对应关系。 表8.1 数字系统的层次关系 系统层次 系统级 芯片级 性能描述 自然语言描述的系统需求 系统的实现算法 系统结构框图 处理器、存储器、串行/并行接口、中断控制器 结构描述 ? 15 ?
第十二章 VHDL语言的仿真、综合和优化 在使用VHDL语言进行项目开发过程中,实现设计目标只是其中一部分的工作,此外还需要对该项目进行仿真、综合和优化工作,这些工作不仅仅可以提高芯片资源的利用效率,甚至可以提高设计正确性和设计效率。本章将介绍如何在VHDL语言开发过程中进行仿真、综合和优化。 12.1 VHDL语言的仿真 第二章介绍了在quartus中使用波形文件进行工程项目的仿真,在采用VHDL进行数字电路和数字系统的设计中,仿真是非常重要的一个步骤,要在设计的多个阶段进行多个层次的仿真如行为仿真、时序仿真和硬件仿真。它是对电路设计的一种检验方法,用VHDL描述的任何数字电路和数字系统是否正确,是否符合设计的目标和要求,都需要通过仿真来进行验证。仿真一般通过VHDL仿真器和具体的CPLD/FPGA芯片来完成。目前,各EDA公司和厂商为设计者提供了众多的仿真工具,如Synopsys公司的VCS,VEDA Desigan Automation公司的VULCAL等。仿真是利用VHDL语言进行数字电路设计的一个必不可少的步骤,它贯穿设计的整个过程。 在数字系统的设计过程中一般要进行三个层次仿真:行为级仿真、RTL级仿真和门级仿真,各级所要达到的目的是不一样的。 ● 行为仿真是针对设计进行系统级的仿真,主要用于对系统设计可行性进行评估和验证,可以快速的对多种系统设计方案进行比较和论证,以此获得正确的最佳设计方案。 ● RTL级仿真主要针对各个模块进行功能验证。 ● 而门级仿真则用于保证设计的电路针对具体器件的电气性能如延时等是满足设计需求的。 可以把用VHDL描述的系统或模块看作能完成某一个功能的整体,给定它一组输入信号(测试向量),它就会根据设计的内容给出对应的一组输出信号(响应),将设计模块或系统的输出信号与按照逻辑功能要求预期得到的输出信号进行比较就能够判断被测部分功能的正确性以及是否满足设计的要求。 无论是功能仿真还是时序仿真,仿真方法一般有两种:一种是在大多数EDA工具中的VHDL仿真器允许进行交互式的操作,允许直接通过设置输入信号波形的方式对输入信号进行赋值,指定仿真时间,并观察输出波形的方式来进行仿真过程,第二章中介绍的即为这种方法。 另一种仿真方法就是利用测试平台的方法,自动的对被测试模块输入信号测试向量,并且通过波形输出和文件记录输出等方式,或者与测试平台中的设定输出向量来进