页数:84页文件大小:1.86 MB来源: EDA技术及数字系统的应用ppt课件
本课件系统讲解VHDL语言,从硬件描述语言概述入手,介绍VHDL基本结构与实体结构体、文字与数据类型等语法规则、顺序语句与并行语句、子程序调用、状态机的设计方法,并配套触发器、计数器、分频器与寄存器等完整设计实例。
目录一.硬件描述语言概述二. VHDL基本结构三. VHDL语法规则四. VHDL中的顺序语句六.子程序及其调用七.状态机的VHDL设计五. VHDL中的并行语句
一.硬件描述语言概述硬件描述语言(Hardware Description Language)是一种用形式化方法来描述数字电路和设计数字逻辑关系的语言,其中包括布尔方程方式、真值表和状态图描述方式。它可以利用这种语言来描述设计者的逻辑设计思想,然后通过EDA工具进行仿真,自动优化综合,生成门级电路,再用ASIC或可编程逻辑器件实现其功能。硬件描述语言的发展至今已有20年的历史,现在主要硬件描述语言有VHDL、Verilog HDL、ABEL-HDL和AHDL。 ; ABEL-HDL和AHDL语言这两种硬件描述语言是由相应的EDA开发软件所限定使用的语言,还没有成为IEEE标准。它们适合于寄存器传输级(RTL)和门电路级的描述,ABEL和AHDL语言是从可编程逻辑器件的设计中发展而来,具有使用灵活、格式简洁、编译要求宽松等特点。
ABEL语言是由Data I/O公司开发的,虽然有不少EDA软件支持,但提供ABEL-HDL综合器的EDA公司仅Data I/O一家。AHDL语言完全集成于Altera公司的软件开发系统中,它只能在该开发软件中进行编译和调试。 ; VHDL语言英文全名是Very-High-Speed Integrated Circuit HDL(超高速集成电路硬件描述语言),它源于美国国防部提出的超高速集成电路计划,其目的是为了在各个承担国防部订货的集成电路厂商之间建立一个统一的设计数据和文档交换格式。1987年底,VHDL被IEEE(The Institute ofElectrical and Electronics Engineers电气和电子工程师协会)采纳为硬件描述语言标准IEEE1076。VHDL是一种全方位的硬件描述语言,包括从系统到电路的所有设计层次,主要用于描述数字系统的结构、行为、功能和接口。VHDL的语言形式和描述风格十分类似于一般的计算机高级语言。其特点如下:
①VHDL具有很强的行为(功能)描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑功能上描述和设计大规模系统的重要保证。②具有层次结构性。VHDL的程序结构特点是将一项工程设计,或称设计实体(一个元件、电路模块或一个系统)分成外部(即端口)和内部,外部描述系统输入输出接口和有关参数;内部描述系统内部的结构和行为状态,并且可形成功能模块,以备其它设计调用。这种分开描述有助于层次化的设计。③VHDL语言是一种并行语言,其编程思想与传统顺序执行的计算机语言(如c、Pascal语言)有很大的区别。④VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。⑤由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻易改变设计的规模和结构。
; Verilog HDL语言Verilog HDL是在1983年由GDA((Gate Way Design Automation)公司的Phil Moorby首创的。1986年Moorby提出了用于快速门级仿真的Verilog XL算法,促使Verilog HDL语言得到迅速发展。1989年Cadence公司收购了GDA公司,Verilog HDL成为Cadence公司的私有财产。1990年Cadence公司公开Verilog HDL语言。基于Verilog HDL优越性,IEEE于1995年制定了Verilog HDL的IEEE标准,即Verilog HDL 1364-1995。近年来,关于VHDL语言和Verilog HDL语言在EDA界一直争论不休。这两种语言各有所长,市场占有量也相差不多。Verilog HDL是专门为ASIC设计而开发的,通常适于寄存器传输级(RTL)和门电路级的描述,是一种较低级的描述语言。而VHDL语言通常适于行为(功能)级和寄存器传输级(RTL)的描述,是一种高级描述语言,最适合于描述系统功能,但几乎不能直接控制门电路的生成。大多数EDA软件都支持这两种硬件描述语言。
二. VHDL基本结构一个完整的VHDL设计文件,或者说设计实体,通常要求最低能为VHDL综合器所支持,并能作为一个独立的设计单元(模块),即元件的形式而存在的VHDL描述。这里的所谓元件,既可以被高层次的系统所调用,成为该系统的一部分;也可以作为一个电路功能块而独立存在和独立运行。在VHDL源文件中,通常包含实体(ENTITY)、结构体(ARCHITECTURE)、配置(CONFIGURATION)、和库(LIBRARY)程序包(PACKAGE)4个部分,其中实体和结构体这两个基本结构是必需的。设计实体库、程序包说明实体(ENTITY)结构体配置GENERIC类属说明PORT端口说明结构体说明功能描述VHDL基本结构
1.实体(Entity)VHDL语言描述的对象称为实体。实体代表什么几乎没有限制,可以将任意复杂的系统抽象成一个实体,也可以将一块电路板、一个芯片、一个电路单元甚至一个门电路看作一个实体。如果设计时对系统自顶向下分层、划分模块,那么各层的设计模块都可以看作为实体。顶层的系统模块是顶级实体,低层次的设计模块是低级实体。描述时,高级实体可将低级实体当作元件来调用。至于该元件内部的具体结构或功能可在低一级实体的描述中再详细给出。实体语句的书写格式如下:ENTITY实体名IS[ GENERIC(类属表);]PORT(端口表);END ENTITY实体名;注:在MAX+PLUSII和QUARTUSII开发工具中实体名与保存该实体的VHDL源文件名必须是一样的。
; 端口(PORT )说明语句在电路图上,端口对应于元件符号的外部引脚。端口说明语句是对基本设计实体(单元)与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述。端口说明语句的书写格式如下:PORT(端口名:端口模式数据类型;… …端口名:端口模式数据类型);--注意最后语句的分号在括号外端口名是设计者为实体的每一个对外通道所取的名字,端口模式是指这些通道上的数据流动方式,如输入或输出等。数据类型是指端口上流动的数据的表达格式。由于VHDL是一种强类型语言,它对语句中的所有操作数的数据类型有严格的规定。一个实体通常有一个或多个端口。端口类似于原理图部件符号上的管脚。实体与外界交流的信息必须通过端口通道流人或流出。
; 端口模式:在IEEE1076标准包中定义了4种常用的端口模式:输入(IN)、输出(OUT)、双向(INOUT)和输出缓冲(BUFFER)端口模式示意图2.结构体(ARCHITECTURE又叫构造体),结构体描述了基本设计单元(实体)的结构、行为、元件及内部连接关系,也就是说它定义了设计实体的功能,规定了设计实体的数据流程,制定了实体内部元件的连接关系。一个完整的结构体一般由两大部分组成:结构体的说明(可选项)和结构体功能描述,
说明语句:对数据类型、常数、信号、子程序和元件等因素进行说明的部分;结构体说明语句功能描述语句常数说明数据类型信号说明例化元件子程序说明块语句进程语句信号赋值元件例化子程序调用结构体的基本组成功能描述语句:描述实体的逻辑行为、以各种不同的描述风格表达的功能描述语句,包括各种顺序语句和并行语句。结构体语句的书写格式如下:ARCHITECTURE结构体名OF实体名IS[说明语句]BEGIN功能描述语句;ENDARCHITECTURE结构体名;
LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY dff1 IS--实体名为dff1PORT ( clk : IN STD_LOGIC ;d : IN STD_LOGIC ;q : OUT STD_LOGIC ) ;END ENTITY dff1;ARCHITECTURE a OF dff1 ISSIGNAL q1 : STD_LOGIC;--信号说明语句BEGINPROCESS ( clk )--进程语句BEGINIF (clk'EVENT AND clk ='1')--上升沿触发THEN q1<= d;END IF ;q<=q1;--赋值语句END PROCESS;END ARCHITECTURE a ;结构体:描述D触发器功能IEEE库使用说明实体:D触发器外部接口; 库、程序包及配置一个可综合的VHDL描述的设计文件中,一般不可缺少的三个部分是库的说明、实体和结构体。根据VHDL语法规则,在VHDL语言中使用的文字、数据对象、数据类型都需要预先定义。可以将预先定义好的数据类型、元件调用声明及一些常用子程序汇集在一起,形成程序包,供VHDL设计实体共享和调用,若干个程序包则构成库。配置用来从库中选取所需要的各个模块来完成硬件电路的描述。在VHDL语言中,库的说明语句与C语言中的头文件一样,总是放在设计文件的最前面。使用库的方法是在设计项目的开头声明选用的库名,用use语句声明选中的程序包。VHDL语言中常用的库有IEEE库、STD库和WORK库一个实体可以有几个结构体,设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。目前配置语句不被综合所支持,主要在前期仿真中使用。
三. VHDL语法规则VHDL具有计算机编程语言的一般特性,其语法规则是编程语句的基本要求,反映了VHDL语言的特征。VHDL的语言规则主要有VHDL文字规则、数据对象、数据类型和各类操作数及运算操作符。1.文字规则数字型文字、字符文字、标识符、下标名、段名数字型文字:可以有多种表达方式:可以是十进制数,也可以表示为二进制、八进制或十六进制等为基数的数,可以是整数,也可以是含有小数点的浮点数。字符和字符串:字符是用单引号引起来的ASCⅡ字符,可以是数值,也可以是符号或字母。字符串是一维的字符数组,需放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。
标识符:最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。定义标识符需要遵循以下书写规则:
下标名:用于指示数组型变量或信号的某一元素,下标段名:用于指示数组型变量或信号的某一段元素(数组),其书写格式如下:信号名或变量名(表达式1TO/DOWNTO表达式2);
例如:下面是下标名和下标段名使用示例。SIGNAL a,b,c:BIT _VECTOR(0 TO 7);SIGNAL s:INTEGER RANGE 0 TO 3;SIGNAL x,y:BIT;x <= a (s);y <= b (3);c( 0 TO 3 )<= a( 2 TO 5);--以段的方式进行赋值c( 4 TO 7)<= b(7 DOWNTO 4);--以段的方式进行赋值上例中,a (s)为下标语句,s是不可计算的下标名,只能在特定情况下进行综合;b (3)的下标为3,可以进行综合。c(0 TO 3)、a( 2 TO 5)、c( 4 TO 7)和b(7 DOWNTO 4)为下标段语句。
2.数据对象在VHDL中,数据对象(Data objects)类似于一种容器,它接受不同数据类型的赋值。VHDL的数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。前两种数据对象与传统的高级语言中的变量和常量十分相似。但信号这一数据对象比较特殊,它具有更多的硬件特征,是VHDL中最有特色的语言要素之一。常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在设计实体中不能再改变,因而具有全局性意义。常量的定义形式如下:CONSTANT常量名:数据类型:=表达式;变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出它做出定义的当前进程和子程序中。变量常用在实现某种算法的赋值语句中,主要作用是在进程中作为临时的数据存储单元,不具有实际电路的物理意义。
信号是描述硬件系统的基本特征,它类似于电子电路内部的连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系,因此它十分类似于AHDL语言中节点NODE的功能,只是不必注明信号上数据流动的方向。信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。信号的赋值可以出现在一个进程中,也可以直接出现在结构体中,但它们运行的含义是不一样的。在进程中,只能将信号列入敏感表,而不能将变量列人敏感表。可见进程只对信号敏感,而对变量不敏感。信号与实体的端口(PORT)概念是一致的。对于端口来说,其区别只是输出端口不能读入数据,输入端口不能被赋值。信号可以看成是实体内部的端口,既可以读数据,也可以被赋值。反之,实体的端口只是一种隐形的信号定义,并附加了数据流动的方向。信号本身的定义是一种显式的定义,因此在实体中定义的端口,在其结构体中都可以看成是一个信号,并加以使用而不必另作定义。
3.数据类型VHDL是一种强类型语言。VHDL对每一个常数、变量、信号、函数及设定的各种参量的数据类型都有严格要求,相同数据类型的量才能互相传递和作用。VHDL作为强类型语言好处是使VHDL编译或综合工具很容易找出设计中的各种常见错误。 ; VHDL的预定义数据类型VHDL的预定义的数据类型都在VHDL标准程序包STANDARD中定义了,在实际使用中,自动包含进VHDL的源文件。因此不需要再用USE语句以显式说明。a.整数(INTEGER)数据类型整数与数学中整数的定义相似,可以使用预定义运算操作符,如加"+"、减"-"、乘"×"、除"÷"进行算术运算。
在实际应用中,VHDL仿真器通常将INTEGER类型作为有符号数处理,而VHDL综合器则将INTEGER作为无符号数处理。在使用整数时,VHDL综合器要求用RANGE子句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数,因为VHDL综合器无法综合未限定范围的整数数据类型的信号和变量。如下面语句:S1GNAL data1:INTEGER RANGE 0 T0 15;规定信号data1为整数,其取值范围是0~15共16个值,可用4位二进制数来表示,可被综合成四条信号线。b.位(BIT)数据类型表示数字系统中的信号值,为逻辑数据类型。位值只能是字符'0'或者'1'(将值放在引号中)表示。与整数中的1和0不同,'1'和'0'仅仅表示一个位的两种取值。可以参与逻辑运算,其结果仍是位的数据类型。
c.位矢量(BIT_VECTOR)数据类型位矢量是用双引号括起来的一组数据。例如:"001100",X"00bb"。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线状态是最形象也最方便的。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:表示信号a中有8个元素SIGNAL a:BIT_VECTOR(7 DOWNTO 0);d.布尔量(BOOLEAN)数据类型一个布尔量具有两种状态,"TRUE(真)"或者"FALSE(假)"。布尔量是二值枚举量,但它和位类型不同,没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在if语句中被测试,测试结果产生一个布尔量TRUE或者FALSE,综合器将其变为1或0信号值。目前综合器不支持的数据类型:物理类型、浮点型、实数(REAL)型、Access(存取)型型、File(文件)型。
; IEEE预定义标准逻辑位与矢量在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_LOGIC和标准逻辑矢量STD_LOGIC_VECTOR。a.标准逻辑位STD_LOGIC数据类型在IEEE库程序包STD_LOGIC_1164中的STD_LOGIC数据类型定义如下:TYPE std_logic IS ( 'U','X','0','1','Z','W','L','H','-');其含义为:末初始化的、强未知的、强0、强1、高阻态、弱未知的,弱0,弱1,忽略等。STD_LOGIC是标准BIT数据类型的扩展,共定义了九种值,这意味着,对于定义为数据类型是标准逻辑位STD_LOGIC的数据对象,其可能的取值已非传统的BIT那样只有逻辑0和逻辑1两种取值,而是如上定义的那样有九种可能的取值。对于综合器而言,STD_LOGIC型数据能够在数字器件中实现的只有其中的四种值,即-、0、1和Z。当然这并不表明其余的五种值不存在。这九种值对于VHDL的行为仿真都有重要意义。
b.标准逻辑矢量STD_LOGIC_VECTOR数据类型STD_LOGIC_VECTOR是定义在STD_LOGIC_1164程序包中的标准一维数组,数组中的每一个元素的数据类型都是以上定义的标准逻辑位STD_LOGIC。 ; 其它预定义标准数据类型VHDL综合工具配带的扩展程序包中,定义了—些有用的类型。如:Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义的数据类型有:无符号型(UNSIGNED)、有符号型(SIGNED)、小整型(SMALL_INT)Synopsys公司在IEEE库中加入的程序包STD_LOGIC_UNSIGNED中已定义了多种可供不同数据类型间操作的算符重载函数,只要引用这程序包,INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之间即可以混合运算。
例八位二进制全加器行为描述如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY adder8 ISPORT( A : IN STD_LOGIC_VECTOR(7 DOWNTO 0);B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);Cin : IN STD_LOGIC;Co : OUT STD_LOGIC;Sum : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END adder8;ARCHITECTURE behave OF adder8 ISSIGNAL Sint : STD_LOGIC_VECTOR( 8 DOWNTO 0 );SIGNAL AA , BB : STD_LOGIC_VECTOR( 8 DOWNTO 0 );BEGINAA <='0'& A(7 DOWNTO 0);--将8位加数矢量扩展为9位,为进位提供空间BB <='0'& B(7 DOWNTO 0);--将8位被加数矢量扩展为9位,为进位提供空间Sint <= AA + BB + Cin;Sum <= Sint(7 DOWNTO 0);Co <= Sint(8);END behave;4. VHDL操作符VHDL的各种表达式是由操作数和操作符组成,其中操作数是各种运算的对象,而操作符则规定运算的方式。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。在VHDL语言中共有如下4类操作符:逻辑运算符:可以对"STD_LOGIC "和"BIT"等逻辑型数据、"STD_LOGIC _VECTOR"逻辑型数组及布尔数据进行逻辑运算。VHDL综合器将逻辑运算直接生成组合逻辑电路。并置运算符&:用于将位或一维数组组合起来,形成新的数组。例如"VH"&"DL"的结果为"VHDL"; "10"&"01"的结果是"1001"。算术运算符:只有加、减、乘运算符在VHDL综合时才生成逻辑电路,对于较长数据位的数据应慎重使用乘法运算,以免综合时电路规模于过庞大。关系运算符:是将相同数据类型的数据对象进行比较判断,并将结果以BOOLEAN类型的数据表示出来,即为TRUE或FALSE两种。
操作数数据类型功能运算符运算类型操作数数据类型功能运算符运算类型任何数据类型等于=关系运算BIT、BOOLEAN、STD_LOGIC非NOT逻辑运算任何数据类型不等于/=整数绝对值ABS算术运算枚举、整数、一维数组大于>整数乘方**小于<整数取余REM大于等于>=整数求模MOD小于等于<=整数和实数除法/BIT、BOOLEAN、STD_LOGIC与AND逻辑运算整数和实数乘法*或OR整数减法-与非NAND整数加法+或非NOR一维数组位连接&并置运算异或XOR整数负号-算术运算异或非XNOR整数正号+VHDL操作符
四. VHDL中的顺序语句VHDL的描述语句分为并行语句和顺序语句两大类。并行语句是指语句的执行顺序与语句的书写顺序无关,所有语句都是并发执行的;顺序语句是指语句的执行(指仿真执行)顺序是按照语句的书写顺序依次执行的。抽象地说,并行语句就是用于表示算法模块间的连接关系的语句;而顺序语句则是用于实现模型的算法部分的语句。VHDL有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。其中主要包括:WAIT语句、IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句、RETURN语句、NULL语句等。顺序语句的特点:是每一条顺序语句的执行顺序是与它们的书写顺序基本一致的。顺序语句只能出现在进程(Process)和子程序,子程序包括函数(Function)和过程(Procedure)。
Process(sel,x1,x2)Beginf<=x1;Ifsel=1thenf<=x2;endif;Endprocess;Process(sel,x1,x2)BeginIfsel=1thenf<=x2;endif;f<=x1;Endprocess;在右边的进程中,无论什么情况,f都为x1,而在左边的进程中,只要信号sel /=1时,f为x1。因此,语句的排列顺序很重要,会影响信号的输出结果。区别
赋值语句的功能就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号或变量,或由此组成的数组。VHDL设计实体内的数据传递以及对端口界面外部数据的读写都必须通过赋值语句来实现。1.赋值语句赋值语句有两种,即信号赋值语句和变量赋值语句。VHDL规定,赋值目标与赋值源的数据类型必须严格一致。信号赋值语句和变量赋值语句的格式如下:信号赋值目标<=赋值源;变量赋值目标:=赋值源;需要注意,在同一进程信号赋值中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值。。
Variable a , b : std_logic;Signal c : std_logic_vector(1 to 4);a: = '1'; b: = '0';c <="1100"; c(3) <='1';一位值用单引号,多位值用双引号例如:对信号和变量赋值Signal a,b,c,d : std_logic;Signal s : std_logic_vector(1 to 4);s <= "0100" ;(a,b,c,d) <= s ;位置关联
流程控制语句通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。流程控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。2.流程控制语句
CASE语句其语句格式如下:CASE表达式ISWHEN条件选择值1 = >顺序语句1;WHEN条件选择值2 = >顺序语句2;… … …WHEN OTHERS = > NULL;END CASE;CASE语句中每一条语句的选择值只能出现一次;CASE语句至少包含一个条件语句;如果所有条件语句中的选择值不能完全覆盖CASE语句中表达式的取值,则最末一个条件语句中必须用"OTHERS"表示,它代表已给出的所有条件语句中未能列出的其他可能的取值。使用OTHERS是为了使条件语句中的所有选择值能覆盖表达式的所有取值,以免综合过程中插入不必要的锁存器。关键字NULL表示不作任何操作。
IF与CASE语句比较:
Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitybcd_7segISPORT(q:instd_logic_vector(3downto0);y:outstd_logic_vector(6downto0));Endbcd_7seg;Architectureaofbcd_7segISBeginProcess(q)BeginCaseqis--"gfedcba"when"0000"=>Y<="0111111";--0when"0001"=>Y<="0000110";--1when"0010"=>Y<="1011011";--2when"0011"=>Y<="1001111";--3when"0100"=>Y<="1100110";--4when"0101"=>Y<="1101101";--5when"0110"=>Y<="1111101";--6when"0111"=>Y<="0000111";--7when"1000"=>Y<="1111111";--8when"1001"=>Y<="1101111";--9whenOTHERS=>NULL;EndCase;Enda;例七段显示译码器的VHDL描述如下:
五. VHDL中的并行语句在VHDL中,并行语句在结构体中的执行是同时并发执行的,其书写次序与其执行顺序无关,并行语句的执行顺序是由他们的触发事件来决定的。并行语句之间可以有信息往来,也可以是互为独立、互不相关、异步运行的(如多时钟情况)。每一并行语句内部的语句运行可以有两种不同的方式,即并行执行方式(如块语句)和顺序执行方式(如进程语句)。并行语句主要有:进程语句、并行信号赋值语句、块语句、元件例化语句、生成语句、并行过程调用语句等。1.进程语句进程语句是最主要的并行语句,它在VHDL设计中使用频率最高,也是最能体现硬件描述语言特点的一种语句。进程语句的内部是顺序语句,而进程语句本身是一种并行语句。一个结构体中可以有多个并行运行的进程语句,多进程之间或进程语句与结构体中其余部分之间的信息交流是通过信号对象来传递。
进程语句的书写格式如下:[标号:]PROCESS(敏感信号参数表)[变量说明语句]BEGIN顺序描述语句END PROCESS [标号];敏感信号参数表需列出用于启动本进程的信号名。进程语句结构中至少需要一个敏感信号量(输入端口、信号),否则除了初始化阶段,进程永远不会被再次激活。当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcnt10ISPORT(clk,clrn:INSTD_LOGIC;--时钟和清零输入co:OUTSTD_LOGIC;--进位输出q:OUTINTEGERRANGE0TO10);ENDcnt10;ARCHITECTUREoneOFcnt10ISBEGIN例具有异步清零十进制加法计数器的VHDL描述如下:PROCESS(clk,clrn)VARIABLEcnt:INTEGERRANGE0TO10;BEGINIFclrn='0'THEN--为低电平时清零cnt:=0;ELSIFclk'EVENTANDclk='1'THENIFcnt=9THENco<='1';--计数为9,下一个时钟来时cnt:=0;--co=1,cnt=0ELSEco<='0';cnt:=cnt+1;ENDIF;ENDIF;q<=cnt;ENDPROCESS;ENDone;并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。这三种信号赋值语句的共同点是赋值目标必须都是信号,所有赋值语句与其它并行语句一样,在结构体内的执行是同时发生的,与它们的书写顺序没有关系。2.并行信号赋值语句 ; 简单信号赋值语句并行简单信号赋值语句与进程中的信号赋值语句相同。它的语句格式如下:赋值目标<=表达式;式中赋值目标的数据对象必须是信号,它的数据类型必须与赋值符号右边表达式的数据类型一致。
; 条件信号赋值语句条件信号赋值语句的语句格式如下:赋值目标<=表达式1 WHEN赋值条件1 ELSE表达式2 WHEN赋值条件2 ELSE…表达式n ;此条件信号赋值语句的功能与在进程中的IF语句相同,在执行条件信号语句时,每个赋值条件是按书写的先后关系逐项测定,—旦发现某一赋值条件为真(TRUE),立即将对应表达式的值赋给赋值目标。这里的赋值条件的数据类型是布尔量,最后一项表达式可以不跟条件子句,用于表示以上各条件都不满足时,则将此表达式赋给赋值目标信号。
; 选择信号赋值语句选择信号赋值语句的语句格式如下:WITH选择表达式SELECT赋值目标<=表达式1 WHEN选择值1,表达式2 WHEN选择值2,…表达式n WHEN OTHERS;选择信号赋值语句的功能与进程中的CASE语句的功能相似。选择赋值语句不允许选择值有重叠的现象,也不允许存在选择值涵盖不全的情况。如果选择值涵盖不全时,与case语句相似,最后选择值需要使用others来代替未列出的取值。
元件例化就是引入—种连接关系,将预先设计好的实体定义为一个元件(模块),将此元件引入到当前的设计实体中与指定端口相连接,从而为当前设计实体引入一个新的低一级的设计层次(模块)。对于一个例化元件,它可以以不同的形式出现,这个元件可以是已设计好的一个VHDL设计实体;也可以是来自FPGA元件库中的元件;它们也可能是以别的硬件描述语言(如Verilog)设计的实体;元件还可以是软的IP核,或者是PPGA中的嵌人式硬IP核。3.元件例化语句元件例化语句由两部分组成,前一部分为元件定义语句,对一个设计实体定义或声明为一个元件,第二部分为元件例化语句,对元件与当前的设计实体连接进行说明。完整的元件例化语句的语句格式如下:
--元件说明语句(第一部分)COMPONENT元件名[ GENERIC(类属表);]PORT(端口表);END COMPONENT [元件名];--元件例化语句(第二部分)标号名:元件名PORT MAP( [端口名=>]连接端口名,… );第一部分语句是元件定义语句,相当于对一个现成的设计实体进行封装,使其只留出对外的接口界面。关键字COMPONENT后面的"元件名"用来指定要在结构体中例化的元件,该元件必须已经存在于调用的工作库中;元件例化的第二部分语句即为元件例化语句,其中的标号名是此元件例化的唯一标志。PORT MAP是端口映射的意思,映射就是把元件的参数和端口与实际连接的信号对应起来,以进行元件的引用。
元件例化语句中所定义的元件的端口名与当前系统的连接端口名的接口表达有两种方式:一种是名称映射方式,另一种是位置映射方式。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshift_reg4ISPORT(din,clock:INSTD_LOGIC;co:OUTSTD_LOGIC);ENDshift_reg4;ARCHITECTUREoneOFshift_reg4ISCOMPONENTdff1--元件定义语句PORT(clk,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALb:STD_LOGIC_VECTOR(0TO4);--信号bBEGINb(0)<=din;--赋值语句U0:dff1PORTMAP(clock,b(0),b(1));--位置映射方式U1:dff1PORTMAP(clock,b(1),b(2));U2:dff1PORTMAP(clk=>clock,d=>b(2),q=>b(3));--名称映射方式U3:dff1PORTMAP(clk=>clock,d=>b(3),q=>b(4));co<=b(4);--赋值语句ENDone;六.子程序及其调用子程序是一个VHDL程序模块、这个模块是利用顺序语句来定义和完成算法的,与进程十分相似。与其它软件语言程序中的子程序的应用目的是相似的,能更有效地完成重复性的设计工作。子程序的使用方法只能通过子程序调用及与子程序的界面端口进行通信。每调用一次子程序都意味着增加了一个硬件电路模块,因此,在实际使用时,要密切关注和严格控制子程序的调用次数。子程序有两种类型,即过程(PROCEDURE)和函数(FUNCTION)。其区别是:过程的调用可通过其界面获得多个返回值,而函数只能返回一个值;在函数入口中,所有参数都默认为输入,而过程有输入参数、输出参数和双向参数;过程一般被看作一种语句结构.而函数通常是表达式的一部分;过程可以单独存在、其行为类似于进程,而函数通常作为语句的—部分被调用。
1.函数(Function)--函数首Function函数名(参数表)Return数据类型Function函数名(参数表) Return数据类型IS[说明部分]Begin顺序语句;END Function函数名;--函数体注:参数表中参量可以是变量、信号、常数(默认);无需定义参数的方向(默认为"输入")。在VHDL中有多种函数形式,如在库中现存的具有专用功能的预定义函数和用于不同目的的用户自定义函数。一般的函数定义由两部分组成,即函数首和函数体。函数的语言表达式如下:
EntityfuncIsPort(a:inbit_vector(0to2);m:outbit_vector(0to2));EndEntityfunc;ArchitecturedemoOffuncIsFunctionsam(x,y,z:bit)ReturnbitisBeginReturn(xandy)orzEndFunctionsam;BeginProcess(a)Beginm(0)<=sam(a(0),a(1),a(2));m(1)<=sam(a(2),a(0),a(1));m(2)<=sam(a(1),a(2),a(0));EndProcess;EndArchitecturedemo;函数体输入变量函数返回数据类型函数调用例
例函数体的VHDL描述:Functiontrans(value:bit_vector(0to3))Returnbit_vectorIsBeginCasevalueISWhen"0000"=>Return"1100";When"0101"=>Return"1100";WhenOthers=>Return"1111";EndCase;EndFunctiontrans;
--过程首Procedure过程名(参数表)Procedure过程名(参数表)IS[说明部分]Begin顺序语句;END Procedure过程名;--过程体2.过程(Procedure)注:参数表中参量可以时变量、信号、常数(默认),参数的方向可以是IN、OUT、INOUT。如果只定义了IN模式而未定义目标参量类型,则默认为常量;若只定义了INOUT或OUT则默认目标参量类型是变量。过程与函数一样,由两部分组成,即由过程首和过程体构成,过程首也不是必需的,过程体可以独立存在和使用。过程的语句格式如下:
例题(过程调用)排列数据由小到大顺序为:ra、rb、rc、rdENTITYmax4ISPORT(a,b,c,d:INbit_vector(0to3);ra,rb,rc,rd:ourbit_vector(0to3));ENDmax4;ARCHITECTUREaOFmax4isProceduresort(x,y:inoutbit_vector(0to3))isvariabletmp:bit_vector(0to3);BeginIfx>ythentmp:=x;x:=y;y:=tmp;ENDIF;ENDSORT;BeginProcess(a,b,c,d)variableaa,bb,cc,dd:bit_vector(0to3);Beginaa:=a;bb:=b;cc:=c;dd:=d;sort(aa,cc);sort(bb,dd);sort(aa,bb);sort(cc,dd);sort(bb,cc);ra<=aa;rb<=bb;rc<=cc;rd<=dd;ENDprocess;ENDa;七.状态机的VHDL设计VHDL描述的状态机有其独特的优越性,主要表现在以下几方面:
状态机是描述时序逻辑电路的形式之一,是逻辑控制器设计的有效方法,具有与时序逻辑电路相同的结构。状态机的状态不仅和输入信号有关,而且还与存储器的当前状态有关。存储器用于存储状态机的状态,组合逻辑电路实现状态译码和输出控制信号。由VHDL描述的状态机从结构上分为单进程状态机和多进程状态机;通常使用两进程方式来描述状态机的内部逻辑。主要有三部分组成:说明部分、描述时序逻辑的进程和描述组合逻辑的进程。1.状态机的基本结构说明部分:使用TYPE语句定义一个新的数据类型,此数据类型为枚举型。其元素通常用状态机的状态名来定义。由于状态变量的取值是文字符号,所以该语句定义的状态机属于符号化状态机。说明部分一般应放在结构体的ARCHITECTURE和BEGIN之间,例如定义状态机的状态如下:TYPE ss IS(s0, s1, s2, s3, s4);SIGNAL statet_s , next_s : ss ;
时序逻辑进程:时序逻辑进程是指在时钟驱动下负责状态转换的进程,这部分进程的VHDL描述一般是比较固定、单一和简单。状态机中必须包含一个对工作时钟信号敏感的进程,当时钟发生有效跳变时,状态机的状态才会变化。一般地,时序逻辑进程可以不负责下一状态的具体状态转移。组合逻辑进程:其任务是根据外部输入的控制信号,包括来自状态机外部的信号和来自状态机内部其它的组合或时序进程的信号,或(和)当前状态的状态值确定下一状态(next_s)的取向,即次态next_s的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容。一般用CASE语句和IF语句来描述状态机中的状态转移。输出信号输入信号resetclkFSMnext_sstate_s组合逻辑进程时序逻辑进程状态机的一般结构框图
用VHDL设计的状态机有多种形式,从结构上分为单进程状态机和多进程状态机;从状态表达方式上分为有符号化状态机和确定状态编码的状态机;从编码方式上分为顺序编码状态机、一位热码编码状态机或其它编码方式状态机。从状态机的输出方式上分为Mealy(米里)型和Moore(莫尔)型两种状态机。2.状态机的VHDL模型 ; 多进程的状态机在VHDL描述的多进程状态机中至少应包括两个进程:时序逻辑进程和组合逻辑进程。例:实现状态转移图所示的功能,两个进程状态机的VHDL描述如下:S0S1S2S3din="00"din≠"00"din="00"din≠"00"din="11"din="11"din≠"11"din≠"11"out=5out=8out=12out=14状态转移图
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmachine1ISPORT(clk,reset:INSTD_LOGIC;din:INSTD_LOGIC_VECTOR(0TO1);co:OUTINTEGERRANGE0TO15);ENDmachine1;ARCHITECTUREoneOFmachine1ISTYPEssIS(s0,s1,s2,s3);--定义状态机SIGNALcurrent_s,next_s:ss;BEGINREG:PROCESS(reset,clk)--时序逻辑进程BEGINIFreset='1'THENcurrent_s<=s0;ELSIFclk='1'ANDclk'EVENTTHENcurrent_s<=next_s;ENDIF;COM:PROCESS(current_s,din)BEGIN--组合逻辑进程CASEcurrent_sISWHENs0=>co<=5;IFdin="00"THENnext_s<=s0;ELSEnext_s<=s1;ENDIF;WHENs1=>co<=8;IFdin="00"THENnext_s<=s1;ELSEnext_s<=s2;ENDIF;WHENs2=>co<=12;IFdin="11"THENnext_s<=s0;ELSEnext_s<=s3;ENDIF;WHENs3=>co<=14;IFdin="11"THENnext_s<=s3;ELSEnext_s<=s0;ENDIF;ENDcase;ENDPROCESS;ENDone;多进程的状态机S0S1S2S3din="00"din≠"00"din="00"din≠"00"din="11"din="11"din≠"11"din≠"11"out=5out=8out=12out=14状态转移图
; 单进程的状态机在两进程的状态机中,输出信号是由组合逻辑进程发出的,在一些特定情况下难免出现毛刺现象。为了避免出现毛刺现象的状态机,可以采用两种方式:一种是希望输出信号具有寄存器锁存功能,在两进程状态机的基础上,增加一个输出信号的锁存进程,与时钟信号同步输出。另一种是采用单进程状态机,将时序逻辑进程和组合逻辑进程放在同一个进程中,此进程可以认为是混合进程。例:为实现前面状态转移图所示的功能,单进程状态机的VHDL描述如下:混合进程的输出信号要等到进入下一状态的时钟信号的跳变进行锁存,即状态机的输出信号在当前状态中由组合电路产生,而在稳定了一个时钟周期后在次态由锁存器输出。因此要比多进程状态机的输出晚一个时钟周期。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmachine2ISPORT(clk,reset:INSTD_LOGIC;din:INSTD_LOGIC_VECTOR(0TO1);co:OUTINTEGERRANGE0TO15);ENDmachine2;ARCHITECTUREoneOFmachine2ISTYPEssIS(s0,s1,s2,s3);--定义状态机SIGNALst:ss;--定义状态stBEGINPROCESS(reset,clk)--混合进程BEGINIFreset='1'THENst<=s0;ELSIFclk='1'ANDclk'EVENTTHENCASEstIS--用CASE语句和IF语句WHENs0=>co<=5;IFdin="00"THENst<=s0;ELSEst<=s1;ENDIF;WHENs1=>co<=8;IFdin="00"THENst<=s1;ELSEst<=s2;ENDIF;WHENs2=>co<=12;IFdin="11"THENst<=s0;ELSEst<=s3;ENDIF;WHENs3=>co<=14;IFdin="11"THENst<=s3;ELSEst<=s0;ENDIF;WHENOTHERS=>st<=s0;ENDcase;ENDIF;ENDPROCESS;ENDone;单进程的状态机单进程的状态机仿真时序图S0S1S2S3din="00"din≠"00"din="00"din≠"00"din="11"din="11"din≠"11"din≠"11"out=5out=8out=12out=14状态转移图
数字逻辑电路的VHDL描述方式VHDL语言能形象化地抽象表示电路的行为和结构,支持电路描述由高层到低层的综合转换。通常VHDL描述方式有三种风格:行为描述方式、数据流描述方式和结构描述方式。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder8ISPORT(A:INSTD_LOGIC_VECTOR(7DOWNTO0);B:INSTD_LOGIC_VECTOR(7DOWNTO0);Cin:INSTD_LOGIC;Co:OUTSTD_LOGIC;Sum:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDadder8;ARCHITECTUREbehaveOFadder8ISSIGNALSint:STD_LOGIC_VECTOR(8DOWNTO0);SIGNALAA,BB:STD_LOGIC_VECTOR(8DOWNTO0);BEGINAA<='0'&A(7DOWNTO0);--将8位加数矢量扩展为9位,为进位提供空间BB<='0'&B(7DOWNTO0);--将8位被加数矢量扩展为9位,为进位提供空间Sint<=AA+BB+Cin;Sum<=Sint(7DOWNTO0);Co<=Sint(8);ENDbehave;例:八位二进制加法器VHDL描述如下:数字键盘显示器显示译码器编码器二—十进制编码器模块(bmq)七段显示译码器模块(XIAN)简单数字显示系统
Libraryieee;Useieee.std_logic_1164.all;EntityxianisPort(C:instd_logic_vector(3downto0);D:outstd_logic_vector(6downto0));Endxian;Architecturea1ofxianisBeginD<="0111111"whenC="0000"else--0"0000110"whenC="0001"else--1"1011011"whenC="0010"else--2"1001111"whenC="0011"else--3"1100110"whenC="0100"else--4"1101101"whenC="0101"else--5"1111101"whenC="0110"else--6"0000111"whenC="0111"else--7"1111111"whenC="1000"else--8"1101111"whenC="1001"else--9"0000000";Enda1; ; 七段显示译码器模块(xian)
libraryieee;useieee.std_logic_1164.all;entitybmqisPort(A:instd_logic_vector(9downto0);B:outstd_logic_vector(3downto0));endbmq;architecturem1ofbmqisbeginB<="0000"whenA="0000000001"else"0001"whenA="0000000010"else"0010"whenA="0000000100"else"0011"whenA="0000001000"else"0100"whenA="0000010000"else"0101"whenA="0000100000"else"0110"whenA="0001000000"else"0111"whenA="0010000000"else"1000"whenA="0100000000"else"1001"whenA="1000000000"else"1111"endm1; 二—十进制编码器模块(bmq)Libraryieee;Useieee.std_logic_1164.all;Useeee.std_logic_unsigned.all;EntityshuziisPort(X:instd_logic_vector(9downto0);Y:outstd_logic_vector(6downto0));Endshuzi;ArchitectureaofshuziisSignalZ:std_logic_vector(3downto0);ComponentxianPort(C:instd_logic_vector(3downto0);D:outstd_logic_vector(6downto0));endcomponent;ComponentbmqPort(A:instd_logic_vector(9downto0);B:outstd_logic_vector(3downto0));endcomponent;BeginU1:bmqPortmap(x,z);U2:xianPortmap(z,Y);Enda;数字键盘显示系统的VHDL描述源文件shuzi(顶层文件),它调用两个低层文件:bmq模块和xian模块
本页为D触发器的符号特性表,源文件仅提取到「符号特性表 D触发器」标题,具体特性内容以图片形式呈现,建议对照原课件图片补充本页要点说明。
LIBRARY IEEE;USEIEEE.std_logic_1164.all;EntityffDisport(clk,d:instd_logic;q:outstd_logic);EndffD;Architecturebody1offfdisbeginprocess(clk)beginifclk'eventandclk='1'thenq<=d;endif;endprocess;endbody1;Architecturebody2offfdisbeginprocess(clk,d)beginifrising_edge(clk)thenq<=d;endif;endprocess;endbody2;本页为T触发器的符号特性表,源文件仅提取到「符号特性表 T触发器」标题,具体特性内容以图片形式呈现,建议对照原课件图片补充本页要点说明。
LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITYfftISPORT( Cp,T: IN STD_LOGIC;q: OUT STD_LOGIC);ENDfft;ARCHITECTURE a OF fft ISsignal qn: std_logic;BEGINprocess(cp)beginif cp'event and cp='1' thenif T='1' then qn<= not qn; end if;end if;end process;q<=qn;END a;本页为JK触发器的符号特性表,源文件仅提取到「符号特性表 JK触发器」标题,具体特性内容以图片形式呈现,建议对照原课件图片补充本页要点说明。
LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITYffJKISPORT( Cp,J,K: IN STD_LOGIC;q: OUT STD_LOGIC);ENDffJK;ARCHITECTURE a OF ffJK ISsignal qn : std_logic;Signal tt : std_logic_vector(2 downto1)BeginProcess(Cp)begintt<=J&K;if Cp'event and Cp='1'thencase tt iswhen "10"=> qn<='1' ;when "01"=> qn<='0' ;when "11"=> qn<=not qn ;when others=>null;End case; End if; End Process;q<=qn; End a;计数器的种类很多。按计数器中的触发器是否同时翻转分类,可以把计数器分为同步式和异步式两种。如果按计数过程中计数器中的数字增减分类,有可以分为加法计数器和减法计数器。可增可减的计数器为可逆计数器。有时也用计数器的计数容量来区分各种不同的计数器,如十进制计数器、二十四进制计数器和六十进制计数器等。一、24进制加法计数器 ; 计数器
LIBRARYIeee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYcount24ISPORT(en,clk:INSTD_LOGIC;qa:outSTD_LOGIC_VECTOR(3DOWNTO0);--个位数计数qb:outSTD_LOGIC_VECTOR(1DOWNTO0));--十位数计数ENDcount24;实体结构体ARCHITECTURE a1 OF count24 ISBEGINprocess(clk)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb: STD_LOGIC_VECTOR(1 DOWNTO 0);beginif clk'event and clk='1' thenif en='1' thenif tma="1001" then tma:="0000";tmb:=tmb+1;elsif tmb="10" and tma="0011" then tma:="0000"; tmb:="00";else tma:=tma+1;end if;end if;end if;qa<=tma; qb<=tmb;end process;END a1;LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYcount60ISPORT(en,clk:INSTD_LOGIC;qa:outSTD_LOGIC_VECTOR(3DOWNTO0);--个位数计数qb:outSTD_LOGIC_VECTOR(2DOWNTO0);--十数计数rco:OUTSTD_LOGIC);--计数进位ENDcount60;实体二、60进制加法计数器结构体ARCHITECTUREaOFcount60ISBEGINprocess(clk)variabletma:STD_LOGIC_VECTOR(3DOWNTO0);variabletmb:STD_LOGIC_VECTOR(2DOWNTO0);beginifclk'eventandclk='1'thenifen='1'thenrco<=tmb(0)andtmb(2)andtma(0)andtma(3)anden;iftma="1001"thentma:="0000";iftmb="101"thentmb:="000";elsetmb:=tmb+1;endif;elsetma:=tma+1;endif;endif;endif;qa<=tma;qb<=tmb;endprocess;ENDa;结论:该计数器为十进制加计数器 ; 分频器(加法4MHz-1hz分频器)
本页为分频器的状态图与时序图,源文件仅提取到波形数据,图形内容以图片形式呈现,建议对照原课件图片补充本页要点说明。
<1>一个3bits的计数器,它所能计数的范围为0~7(=23-1)。同理,nbits的计数器所能计数范围为0~2n-1。<2>Q0、Q1、Q2的波形频率分别为时钟脉冲信号Clk的1/2、1/4、1/8,由此可以知道,nbits的计数器可获得的最低分频频率为时钟脉冲信号Clk的1/2n。<3>对于4MHz频率信号,若作为加法计数器电路的时钟脉冲信号Clk,则电路不同输出脚位获得的分频频率如下表所示。
4MHz时钟分频输出频率:下表按计数器输出位列出对应的分频频率。
| 分频输出(Q0~Q9) | 分频输出(Q10~Q19) | 分频输出(Q20~Q29) |
|---|---|---|
| Q0:2 MHz | Q10:1.953125 kHz | Q20:1.907348 Hz |
| Q1:1 MHz | Q11:976.5625 Hz | Q21:0.953674 Hz |
| Q2:500 kHz | Q12:488.28125 Hz | Q22:0.476837 Hz |
| Q3:250 kHz | Q13:244.14063 Hz | Q23:0.238418 Hz |
| Q4:125 kHz | Q14:122.070312 Hz | Q24:0.119209 Hz |
| Q5:62.5 kHz | Q15:61.035156 Hz | Q25:0.059604 Hz |
| Q6:31.25 kHz | Q16:30.517578 Hz | Q26:0.029802 Hz |
| Q7:15.625 kHz | Q17:15.258789 Hz | Q27:0.014901 Hz |
| Q8:7.8125 kHz | Q18:7.629394 Hz | Q28:0.00745 Hz |
| Q9:3.90625 kHz | Q19:3.814697 Hz | Q29:0.003725 Hz |
说明:原文各单元格粘连无分隔,表中数值按原文顺序切分还原,基准时钟为4MHz。
LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYcountISPORT(clk:inSTD_LOGIC;q:outSTD_LOGIC;ENDcount;ARCHITECTUREaOFcountISSignaltmp:STD_LOGIC_vector(21downto0);BEGINProcess(clk)BeginIfclk'eventandclk='1'thentmp<=tmp+1;endif;Endprocess;q<=tmp(21);ENDa;结构体实体设计一个由4MHz到1Hz的分频器,其VHDL电路设计为:; 寄存器寄存器是暂时存储一组数据的数字器件。结论:一个脉冲存储一组数据,即一拍存储一组数据110110一、普通寄存器
LIBRARY IEEE;USE IEEE.STD_1164.ALL;ENTITY JICUN ISPORT( D : IN STD_LOGIC_VECTOR(3 DOWNTO1);CLK : IN STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(3 DOWNTO1) );END ENTITY;ARCHITECTURE ONE OF JICUN ISBEGINIF CLK'EVENT AND CLK='1'THENQ <= D;END IF;END ARCHITECTURE;下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}