EDA技术实用教程.ppt
《EDA技术实用教程.ppt》由会员分享,可在线阅读,更多相关《EDA技术实用教程.ppt(80页珍藏版)》请在三一办公上搜索。
1、EDA技术实用教程,第6章 VHDL设计进阶,6.1 4位加法计数器的VHDL描述,一、4位加法计数器,【例6-1】ENTITY CNT4 IS PORT(CLK:IN BIT;Q:BUFFER INTEGER RANGE 15 DOWNTO 0);END;ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q=Q+1;END IF;END PROCESS;END bhv;,注意:(1)表面上BUFFER具有双向端口INOUT的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反
2、馈回来,并不含有IN的功能。(2)VHDL规定加,减等算术符+,-对应的操作数(如式a+b中的a和b)的数据类型只能是INTEGER(除非对算术操作符有一些特殊的说明,如重载函数的利用).(3)表达式Q=Q+1的右项与左向并非处于相同的时刻内,对于时序电路,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q+1,需等待下一个时钟周期。,二、整数、自然数和正整数数据类型 整数类型INTEGER 的元素包括正整数、负整数和零。在VHDL中,整数的取值范围是-2147483647+2147483647,即可用32位有符号的二进制数表示。注意:通常VHDL仿真器将INTEGER类型作为有符号数处
3、理,而VHDL综合器则将INTEGER作为无符号数处理。在使用整数时,VHDL综合器要求必须使用RANGE字句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数因为VHDL综合器无法综合未限定范围的整数类型的信号或变量。,在例6-1中的语句 Q:BUFFER INTEGER RANGE 15 DOWNTO 0;即限定Q的取值范围是0-15共16个值,可用4位二进制数来表示,因此,VHDL综合器即将Q综合成由四条信号线构成的总线方式信号:Q(3)、Q(2)、Q(1)和Q(0)。,整数常量的书写方式示例如下:1 十进制整数0 十进制整数35 十进制整数10E3 十进制
4、整数100016#D9#十六进制整数D9H8#720#八进制整数720 O 2#11010010#二进制整数11010010B,NB:在语句中整数的表达不加单引号,如1、0、25等;而逻辑位的数据必须加引号,如1、0、“10”、“1000111”。自然数类型NATURAL是整数类型的一个子类型,它包括0和所有正整数。如果对例6-1的Q定义为NATURAL类型,综合的结果不变,语句表达为:Q:BUFFER NATURAL RANGE 15 DOWNTO 0;正整数类型POSITIVE也是整数类型的一个子类型,它只比自然数类型NATURAL少一个0。尽管如此,对于许多综合器来说,若定义例6-1的Q
5、为 Q:BUFFER POSITIVE RANGE 15 DOWNTO 0,仍然能综合出相同的计数器电路来。与BIT、BIT-VECTOR一样,整数类型INTEGER、NATURAL和POSITIVE都定义在VHDL标准程序包STANDARD中,是默认打开的。,三、4位加法计数器的另一种表达方式,【例6-2】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 IS PORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
6、END;ARCHITECTURE bhv OF CNT4 ISSIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(CLK)BEGIN IF CLKEVENT AND CLK=1 THEN Q1=Q1+1;END IF;Q=Q1;END PROCESS;END bhv;,例6-2特点:(1)若输入和输出为标准逻辑位STD_LOGIC和标准逻辑位矢量STD_LOGIC_VECTOR,必须利用LABRARY语句和USE语句,打开程序包STD_LOGIC_1164。如例6-2中的CLK和Q。(2)Q的端口模式是OUT,由于没有输入的端口模式特性,因
7、此不能如例6-1那样直接用Q=Q+1中。考虑到计数器必须建立一个用于计数累加的寄存器,因此在计数器内部先定义一个信号SIGNAL(类似于节点),语句表达上可以在结构体的ARCHITECTURE和BEGIN之间定义一个信号:SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0),由于Q1是内部的信号,不必像端口信号那样定义它们的端口模式,即Q1的数据流动是不受方向限制的。因此可以在Q1=Q1+1中用信号Q1来完成累加的任务,然后将累加的结果用语句Q=Q1向端口Q输出。于是,在例6-2的不完整的IF条件语句中,Q1变成了内部加法计数器的数据端口。,(3)考虑到VHDL不允许在
8、不同数据类型的操作数之间进行直接操作或运算,而Q1=Q1+1中数据传输符=右边加号的两个操作数分属不同的数据类型:Q1(逻辑矢量)+1(整数),不满足算术符“+”对应的操作数必须是整数类型,且相加和也为整数类型的要求,因此必须对Q1=Q1+1中的加号赋予新的功能,使之允许不同数据类型的数据可以相加,且相加和为标准逻辑矢量。方法之一就是调用一个函数,以便赋予加号具备新的数据类型的操作功能,这就是所谓的运算符重载,这个函数称为运算符重载函数。,为了方便各种不同数据类型间的运算操作,VHDL允许用户对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符。事实上,VHDL的IEEE库中
9、的STD_LOGIC_UNSIGNED程序包中预定义的操作符,如“+”、“-”、“*”、“=”、“=”、“”、“”、“/=”、“AND”和“MOD”等,对相应的数据类型INTEGER、STD_LOGIC、STD_LOGIC_VECTOR的操作作了重载,赋予了新的数据类型进行操作,或者允许不同的数据类型之间用此运算符进行运算。例6-2中第三行使用语句“USE IEEE.STD_LOGIC_UNSIGNED.ALL”的目的就在于此 使用此程序包就是允许当遇到例6-2中的+号时,调用+号的算符重载函数。,例6-1和6-2的综合结果是相同的,其RTL电路如图6-1所示,工作时序如图6-2所示。4位加法
10、计数器由两大部分组成:完成加1操作的纯组合电路加法器和4位边沿触发方式锁存器。,图6-1 4位加法计数器RTL电路,图6-2 4位加法计数器工作时序,数据类型:整数类型、自然数类型、正整数类型。BUFFER模式:BUFFER表达特定端口的特定功能,并非是特定的端口结构。重栽函数:程序包STD_LOGIC_UNSIGNED含有(+)和其它运算符的重载函数。计数器结构:加法计数器由两部分组成:加1组合电路和寄存器时序电路。,归纳,数据类型,BUFFER模式,重载函数,计数器结构,6.2 不同工作方式的时序电路设计,带有复位和时钟使能的10进制计数器 相关语法 带有并行置位的移位寄存器,一、带有复位
11、和时钟使能的10进制计数器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 IS PORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END CNT10;,例6-3描述的是一个带有异步复位和同步时钟使能的十进制加法计数器。所谓同步或异步都是相对于时钟信号而言的,不依赖于时钟而有效的信号称为异步信号,否则称为同步信号。,【例6-3】,ARCHITECTURE
12、 behav OF CNT10 ISBEGIN PROCESS(CLK,RST,EN)VARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN IF RST=1 THEN CQI:=(OTHERS=0);-计数器复位,独立于CLK,称为异步 ELSIF CLKEVENT AND CLK=1 THEN-检测时钟上升沿 IF EN=1 THEN-检测是否允许计数 IF CQI 0);-大于9,计数值清零 END IF;END IF;END IF;IF CQI=1001 THEN COUT=1;-计数大于9,输出进位信号 ELSE COUT=0;END IF;C
13、Q=CQI;-将计数值向端口输出 END PROCESS;END behav;,图6-3 例6-3的RTL电路,图6-4 例6-3的工作时序,二、相关语法,1.变量 变量VARIABLE与信号SIGNAL一样,都属于数据对象,在此程序中的功能与信号相似。但变量的赋值符号与信号的赋值符号是不同的,信号的赋值符号是“=”,而变量的赋值符号是“:=”。例如a为变量,对其赋值可以写为:a:=1。再如语句:VARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0),定义标识符CQI为变量VARIABLE,其数据类型是4元素的标准逻辑矢量。变量的功能主要用于数据的暂存。,2.省略赋
14、值操作符(OTHERS=X),为了简化表达才使用短语“(OTHERS=X)”,这是一个省略赋值操作符,它可以在较多位的位矢量赋值中作省略化的赋值,如以下语句:SIGNAL d1:STD_LOGIC_VECTOR(4 DOWNTO 0);VARIABLE a1:STD_LOGIC_VECTOR(15 DOWNTO 0);.d1 0);a1:=(OTHERS=0);这条语句等同于d1=“00000”;a1:=“0000000000000000”.其优点是在给大的位矢量赋值时简化了表述,明确了含义,这种表述与位矢量无关。,利用“(OTHERS=X)”还可以给位矢量的某一部分位赋值之后再使用OTHER
15、S给剩余的位赋值,例如:d21.4=1,OTHERS=0,此赋值语句的意义是给位矢量d2的第1位和第4位赋值为1,而其余位赋值为0。下例是用省略赋值操作符“(OTHERS=X)”给d2赋其他信号的值:d1e(3),3=e(5),OTHERS=e(1);这个矢量赋值语句也可以改写为使用连接符的语句(假设d1的长度为5位):fX)”的描述方法要优于“”的描述方法,因为后者的缺点是赋值依赖于矢量的长度,当长度改变时必须重新排序。,三、带有并行置位的移位寄存器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHFRT IS-8位右移寄存器 PORT(C
16、LK,LOAD:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);QB:OUT STD_LOGIC);END SHFRT;,【例6-4】8位右移移位寄存器,ARCHITECTURE behav OF SHFRT IS BEGIN PROCESS(CLK,LOAD)VARIABLE REG8:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN IF CLKEVENT AND CLK=1 THEN IF LOAD=1 THEN-装载新数据 REG8:=DIN;ELSE REG8(6 DOWNTO 0):=REG8(7 DOWNTO
17、1);END IF;END IF;QB=REG8(0);END PROCESS;-输出最低位END behav;,图6-5 例6-4的工作时序,(1)在第一个时钟到来时,LOAD恰为高电平,(2)第二个时钟,以及以后的时钟信号都是移位时钟,高位置1,(3)第二个时钟后,QB输出了右移出的第2个位1,常数定义的一般表述:CONSTANT 常数名:数据类型:=表达式;,6.3 数据对象DATA OBJECTS,在VHDL中,数据对象有三类,即常量(CONSTANT)、变量(VARABLE)和信号(SIGNAL)。,一、常数(CONSTANT)常数的定义和设置主要是为了使程序更容易阅读和修改。例如,
18、将逻辑位的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在程序中不能在改变,因而具有全局性意义。,例如:CONSTANT FBT:STD_LOGIC_VECTOR:=“010110”;-标准位矢量类型 CONSTANT DATAIN:INTEGER:=15-整数类型 VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量的可视性规则即常量的使用范围取决于它被定义的位置。*如果在程序包中,常量具有最大的的全局化特征,可以用在调用此程序包的所有设计实体中;*常量如果定义在设计实体中,其有效范围为
19、这个实体定义的所有的结构体(多结构体);*如果常量定义在设计实体的某一结构体中,则只能用于此结构体;*如果常量定义在结构体的某一单元,如一个进程中,则这个常量只能用在这一进程中。,定义变量的一般表述:VARIABLE 变量名:数据类型:=初始值;,二、变量(VARIABLE)在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前结构中。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时的行为。变量的主要作用是在进程中作为临时的数据存储单元。,例如:VARIABLE a:INTEGER RANGE 0 TO 15;VARIABLE d:
20、STD_LOGIC;分别定义a的取值范围从0到15的整数型变量;d为标准位类型的变量。,变量赋值的一般表述为;目标变量名:=表达式;注意:10 变量赋值符号是“:=”,变量数值的改变是通过变量赋值来实现的。20 赋值语句右方的“表达式”必须是一个与“目标变量名”具有相同数据类型的数值,这个表达式可以是一个运算表达式,也可以是一个数值。30 通过赋值操作,新的变量值的获得是立刻发生的。40 变量赋值语句左边的目标变量可以是单值变量,也可以是一个变量的集合,如位矢量类型的变量。例如:VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;VARIABLE a,b:STD_LO
21、GIC_VECTOR(7 DOWNTO 0);x:=11;y:=2+x;-运算表达式赋值,y也是实数变量 a:=b a(0 TO 5):=b(2 TO 7);,信号定义格式:SIGNAL 信号名:数据类型:=初始值;,三、信号(SIGNAL)信号是描述硬件系统的基本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值与触发器的记忆功能有很好的对应关系,只是不必注明信号上数据流动的方向。,信号初始值的设置不是必须的,而且初始值仅在VHDL的行为仿真中有效。除了没有方向说明外,信号与实体的端口(Port)概念是一致
22、的,它可以看成是实体内部(设计器件内部)的端口。信号的使用和定义范围是实体、结构体和程序包,在进程和子程序的顺序语句中不允许定义信号。,当信号定义了数据类型和表达式后,在VHDL设计中就能对信号进行赋值了。信号的赋值语句表达式为:目标信号名=表达式;这里的“表达式”可以是一个运算表达式,也可以是数据对象(变量、信号或常量)。数据信息的传入可以设置延时量。信号的赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中,但它们运行的含义是不一样的。前者属顺序信号赋值(这时的信号赋值操作要视进程是否已被启动);后者属并行信号赋值(其赋值操作是各自独立并行地发生的)。在进程中,可以允许同一信号
23、有多个驱动源(赋值源),即在同一进程中存在多个同名的信号被赋值,其结果只有最后的赋值语句被启动,并进行赋值操作。,例如:SIGNAL a,b,c,y,z:INTEGER;PROCESS(a,b,c)BEGIN y=a+b;z=c-a;y=b;END PROCESS;其中,a、b、c被列入进程敏感表,当进程被启动后,信号赋值将自上而下顺序执行,但第一项赋值操作并不会发生,这是因为y的最后一项驱动源是b,因此y被赋值b。在并行赋值语句中,不允许如上例所示的同一信号有多个驱动源的情况。,表6-1 信号与变量赋值语句功能的比较,四、进程中的信号与变量赋值语句 从硬件电路系统来看,变量和信号相当于逻辑电
24、路系统中的连线和连线上的信号值;常量相当于电路中的恒定电平,如GND或VCC接口。从行为仿真和VHDL语句功能上看,信号与变量具有比较明显的区别,其差异主要表现在接受与保持信号的方式和信息保持与传递的区域大小上。表6-1在三方面对信号与变量作了比较,之后给出了一些实例。,【例6-5】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF3 IS PORT(CLK,D1:IN STD_LOGIC;Q1:OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS(CLK)VARIABLE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 实用教程

链接地址:https://www.31ppt.com/p-5428637.html