1、第二章 VHDL语言语法基础,VHDL入门,例: 2选1选择器设计,a b mux21 y s,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL ENTITY mux21 ISPORT(a,b:IN STD_LOGIC;s:IN STD_LOGIC;y:OUT STD_LOGIC); END mux21; ARCHITECTURE one OF mux21 IS BEGINy=a WHEN s=0 ELSEb WHEN S=1; END one;,IEEE库使用说明,器件mux21的外部接口信号说明,PORT相当于器件的引脚,这一部分称为实体,器件mux21的
2、内部工作逻辑描述,即为实体描述的器件功能结构,称为结构体,例: 锁存器设计,LATCH D Q ENA,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Latch IS PORT(D:IN STD_LOGIC;ENA:IN STD_LOGIC;Q:OUT STD_LOGIC); END latch; ARCHITCTURE one OF latch IS SIGNAL sig_save:STD_LOGIC; BEGINPROCESS(D,ENA)BEGINIF ENA=1 THENsig_save=D;END IF;Q= sig_save;E
3、ND PROCESS; END one;,锁存器的实体,定义了此器件的输入输出引脚及其信号属性,定义信号,进程语句结构,描述逻辑的时序方式,结构体,例: 全加器设计,1位半加器,1位全加器,H_ADDER a co b so,H_ADDER a co b so,H_ADDER a co b so,F_ADDER ain cout bin sum cin,ain,bin,ain,acb,u1,u2,u3,sum,cout,d,e,f,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2 ISPORT(A,B:IN STD_LOGIC;c: O
4、UT STD_LOGIC); END or2; ARCHITECTURE ful OF or2 ISBEGINc = a OR b; END fu1;,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT(a,b:IN STD_LOGIC;co,so:OUT STD_LOGIC); END h_adder; ARCHITECTURE fh1 OF h_adder IS BEGINso= a AND (a NAND b);co=NOT( a NAND b ); END fh1;,LIBRARY IEEE; USE IE
5、EE.STD_LOGIC-1164.ALL; ENTITY f_adder ISPORT(ain,bin,cin:IN STD_LOGIC;cout,sum:OUT STD_LOGIC); END f_adder; ARCHITECTURE fd1 OF f_adder IS BEGINCOMPONENT h_adderPORT(a,b:IN STD_LOGIC;co,so:OUT STD_LOGIC);END COMPONENT;COMPONENT or2PORT(a,b:IN STD_LOGIC;c:OUT STD_LOGIC);END COMPONENT;SIGNAL d,e,f:STD
6、_LOGIC; BEGINu1:h_adder PORT MAP(ain,bin,d,e);u2:h_adder PORT MAP(e,b,f,sum);u3:or2 PORT MAP(d,f,cout); END fd1;,元件调用声明,元件连接,第2章 VHDL语言程序的基本结构,实 体 构造体 配 置 包集合 库,VHDL语言的基本结构,库及包集合 LIBRARY 库名; 使用说明 USE 库名.包集合名.项目名;ENTITY 实体名 IS 实体说明 类属参数说明 ;端口说名 ;END实体名 ; ARCHITECTURE 构造体名 OF 实体名 IS 定义语句 内部信号,常数,数据类型,
7、函数等的定义; 构造体描述 BEGIN并行处理语句 ;END构造体名;,VHDL语言程序的基本结构,2.1 VHDL语言设计的基本单元及其构成,基本单元 门 微处理器 系统 基本单元构成 实体说明:规定了设计单元的输入输出接口信号或引脚。 构造体:定义了设计单元的具体构造和操作(行为)。,多路选择器的VHDL描述,例 2选1多路选择器的VHDL描述,2选1输入/输出端口 (实体Entity),电路功能 实现 (结构体Architecture),?,例 2选1多路选择器的实体描述,多路选择器的VHDL描述,实体在电路中主要是说明该电路的输入、输出关系,更具体地说就是用来定义实体与外部的连接关系以
8、及需传送给实体的参数。,ENTITY mux21 ISPORT ( a, b : IN BIT; s : IN BIT;y : OUT BIT ); END ENTITY mux21; ARCHITECTURE one OF mux21 ISBEGINy = a WHEN s = 0 ELSE b ; END ARCHITECTURE one ;,例 2选1多路选择器的结构体描述1 (行为描述),说明:以关键字ARCHITECTURE引导,以END (ARCHITECTURE) xxx结尾的语句部分,称为结构体。描述电路的内部逻辑功能或电路结构。,多路选择器的VHDL描述,例 2选1多路选择器
9、的结构体描述2 (原理图描述),多路选择器的VHDL描述,例 2选1多路选择器的结构体描述3 (布尔方程描述),多路选择器的VHDL描述,说明:以上三种结构体描述都是并行语句,例 2选1多路选择器的结构体描述4 (进程描述),多路选择器的VHDL描述,2选1多路选择器功能时序波形,例 2选1多路选择器的EDA软件仿真结果,多路选择器的VHDL描述,2.1 实体表达(ENTITY),多路选择器的VHDL描述,例VHDL描述中出现的相关语句结构和语法说明,ENTITY 实体名 IS GENERIC (类属表);PORT (端口表); END ENTITY 实体名;,实体在电路中主要是说明该电路的输
10、入、输出关系,更具体地说就是用来定义实体与外部的连接关系以及需传送给实体的参数。,ENTITY 实体名 IS GENERIC (类属表);PORT (端口表); END ENTITY 实体名;,(1)类属表:用以将信息参数传递到实体。 (2)端口表:指明实体的输入、输出信号及其模式、数据类型。,PORT (端口名:端口模式 数据类型;端口名:端口模式 数据类型);,英文字母+数字,数据流动方向,主要有“位”和“位矢量”两类,设计者自己命名的名称(文件名),实体参数和端口说明,类属参数说明: 必须放在端口说明之前, 用于指定参数。 GERERIC(常数名:数据类型:设定值); 如上例中的GENE
11、RIC(m:TIME=1 ns)。 该语句指定了构造体内m的值为1 ns。这样,语句q=tmp AFTER m; 表示tmp经 1 ns延迟才送到q。在这个例子中, GENERIC利用类属参数为q建立一个延迟值。,注意简单地说In 不可以出现在= 或 : = 的左边out不可以出现在= 或 : = 的右边buffer可以出现在= 或 : = 的两边,In 信号只能被引用,不能被赋值 out 信号只能被赋值,不能被引用 buffer 信号可以被引用,也可以被赋值,例:,VHDL中任何一种数据对象(信号、变量、常数)必须严格限定其取值范围。VHDL 中一个对象只能有一种类型,施加于该对象的操作必须
12、与该类型相匹配。常用数据类型有:BIT,BIT_VECTOR,STD_LOGIC,STD_LOGIC_VECTOR,INTEGER,BOOLEAN等,“std_logic”型数据可以具有如下9种不同的值:U-初始值;X-不定;0 -0;1 -1; 注意:当使用这两种数据类型Z -高阻; 时,在程序中必须写出库W-弱信号不定; 和包集合的说明语句。L -弱信号0; H -弱信号1;-不可能情况。,std_logic,std_logic_vector,实体描述,实体描述从“ENTITY 实体名 IS”开始, 至“END 实体名”结束。 实际上,对VHDL语言而言,大写和小写都一视同仁,不加区分。这
13、里这样规定仅仅是为了增加程序的可读性而已。 建议将VHDL的标识符或基本语句关键词以大写方式表示,而由设计者添加的内容可以以小写方式来表示。,2.2 结构体表达(ARCHITECTURE),结构体表达,ARCHITECTURE 结构体名 OF 实体名 IS定义语句 内部信号,常数,数据类型,函数等定义; BEGIN功能描述语句; END ARCHITECTURE 结构体名;,构造体说明,构造体命名: 英文字母、数字、 构造体的名称可以由设计者自由命名。但是在大多数的文献和资料中, 通常把构造体的名称命名为behavioral(行为),dataflow(数据流)、rtl(寄存器传输)或者stru
14、ctural(结构 ) 当一个实体具有多个结构体时,结构体的取名不可相重。,2.1.2 构造体说明,定义语句 位置在ARCHITECTURE和BEGIN之间。 对用于构造体内部所使用的信号、 常数、 数据类型和函数等进行定义 例:SIGNAL cont:STDLOGICVECTOR(3 DOWNTO 0);SIGNAL co_1:STDLOGIC;CONSTANT m:TIME:=2ns;TYPE STATE IS (INIT,DAD,ADC,SRF,FRF);,2.1.2 构造体说明,并行处理语句 位置:处于语句BEGIN和END之间 所有的并行处理语句都可以写在这里面。并行处理语言在仿真时
15、是并发工作的,和前后次序无关,从而描述了构造体内部逻辑电路的并发功能。 有5种语句结构 块语句(BLOCK) 进程语句(PROCESS) 信号赋值语句 子程序调用语句 元件例化语句,都是并行语句 内部可能包含顺序语句,2.1.2 构造体说明,构造体结束 END 构造体名;,结构体名称的命令:它是该结构体的唯一名称。“OF”后面紧跟的实体名表明了该实体所对应的是哪一个实体。用 “IS”来结束结构体的命名。,ARCHITECTURE 结构体名 OF 实体名 IS定义语句 内部信号,常数,数据类型,函数等的定义; BEGIN功能描述语句; END ARCHITECTURE 结构体名;,定义语句:位于
16、“ARCHITECTURE”和“BEGIN”之间。用于对结构体内部所使用的信号常数、数据类型和函数等进行定义。如:,ARCHITECTURE 结构体名 OF 实体名 IS定义语句 内部信号,常数,数据类型,函数等的定义; BEGIN功能描述语句; END ARCHITECTURE 结构体名;,SIGNAL cont:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL co_1:STD_LOGIC; CONSTANT m:TIME:=2ns; TYPE STATE IS (INIT,DAD,ADC,SRF,FRF);,功能描述语句:处于“BEGIN”和“END”之间。具体描
17、述了结构体的行为及其连接关系。,ARCHITECTURE 结构体名 OF 实体名 IS定义语句 内部信号,常数,数据类型,函数等的定义; BEGIN功能描述语句; END ARCHITECTURE 结构体名;,结构体功能可以用三种方式进行描述,即:行为描述、数据流描述、结构描述。,.结构体的行为描述(behavioral)结构体的行为描述表示输入与输出间转换的关系,是对设计实体按算法的路径来描述。行为描述在 EDA 工程中称为高层次描述或高级描述。,例题!,例:如图所示的半加器,其功能真值表已经给出,写出它的行为描述。,半加器真值表:,(ENTITY部分省略)ARCHITECTURE alg_
18、ha OF half_adder ISBEGINPROCESS (a , b)BEGINIF a=0 AND b=0 THENc=0 ; s=0ELSE a=1 AND b=1 THENc=1 ; s=0;ELSE c=0 ; s=1;END IF;END PROCESSEND alg_ha;,高层次的功能描述,不必考虑在电路中到底是怎样实现的。,.结构体的数据流描述(dataflow)它反映了从输入数据到输出数据之间所发生的逻辑变换,或者说描述了数据流程的运动路径、运动方向和运动结果。 .结构体的结构化描述(structural)结构化描述给出了实体内部结构、所包含的模块或元件间互连关系;与
19、实体外部引线的对应关系。,练习:试用上面的两种方法描述半加器的功能。,结构体中三种描述方式的比较,布尔函数定义明白,连接关系清晰,电路模块化清晰,优 点,小门数设计,不易描述复杂电路,修改不易,数据流描述,电路层次化设计,电路不易理解、繁琐、复杂,结构化描述,适用场合,缺 点,描述方式,电路特性清楚明了,大型复杂的电路模块设计,进行综合效率相对较低,行为描述,2.1.3 举例,ENTITY mux2 IS PORT(d0, d1, sel: IN BIT;q: OUT BIT); END mux2; ARCHITECTURE connect OF mux2 ISSIGNAL tmp1,tmp2
20、,tmp3: BIT; BEGIN;tmp1 = d0 AND sel; tmp2 = d1 AND (NOT sel);tmp3 = tmp1 OR tmp2; q tmp3; END connect; 在语句中,符号“=”表示传送(或代入)的意思, 即将逻辑运算结果送q输出。 代入 语句只要代入符号右边信号有变化就启动一次。,并发执行,小测验,基本单元必须包含哪两部分?各有什么作用? 端口说明中的方向有哪几种,其中BUFFER和OUT有何区别?BUFFER和INOUT有何区别? 前面举了几个二选一的例子,两个程序有何不同之处?,构造体的信号说明位置在什么地方?以下说明哪个是正确的?,ARC
21、HITECTURE connect OF mux2 ISSIGNAL tmp1,tmp2,tmp3: BIT; BEGINtmp1 = d0 AND sel; tmp2 = d1 AND (NOT sel);tmp3 = tmp1 OR tmp2; q tmp3; END connect;,ARCHITECTURE connect OF mux2 IS BEGINSIGNAL tmp1,tmp2,tmp3: BIT; tmp1 = d0 AND sel; tmp2 = d1 AND (NOT sel);tmp3 = tmp1 OR tmp2; q tmp3; END connect;,2.2
22、结构体的3种子结构设计方法,采用多个进程(Process)的子结构方式 采用多个模块(Block)的子结构方式 采用多个子程序(Subprograms)的子结构方式,2.2.1采用多进程描述复杂结构体的方法,进程语句的结构 进程语句的顺序性 进程的启动与执行过程 结构体的多进程组织方法,进程语句的结构,进程名:PROCESS(信号1,信号2,)变量说明BEGINEND PROCESS (进程名)在单个进程的结构体描述中,进程名可以省略。 进程语句带的几个信号表称为敏感量表。,单进程的结构体描述,ENTITY mux IS PORT(d0,d1,d2,sel:IN bit;)g:OUT bit)
23、; END mux; ARCHITECTURE connect OF mux IS BEGINP1:process(d0,d1,sel)VARIABLE x1,x2,x3:bit;BEGINx1:=d0 AND sel;x2:=d1 AND (NOT sel);x3:=x1 OR x2;END process p1; END connect;实体名:mux 结构体名:connect 进程名 P1 变量x1、x2、x3是进程内部变量 d1、d2、d3是敏感变量,进程语句的顺序性,在系统仿真时,Process结构中的语句结构按顺序一条一条向下执行。,进程的启动和执行过程,进程的敏感量表中的信号无论
24、哪一个发生变化都将启动process进程。 一旦启动,进程中的程序将从上到下顺序执行一遍,由新变化的量引导进程产生变化结果输出 当进程的最后一个语句执行完成后,就返回到进程开始处,等待敏感量的新变化,引发进程的再一次执行。,结构体中的多进程,每个结构体中可以有多个进程语句,多个进程语句之间是并行关系,例:两个进程并发执行,Library ieee; Use ieee.std_logic_1164.all; Entity example isport(d,clk:in std_logic;q1,q1:out std_logic); End example; Architecture datafl
25、ow of example is Beginlabel1:processbeginwait until clk = 1;q1= d;end process;label2:processbeginwait until clk = 0;q2 = d;end process; End dataflow;,例:两个进程通信,Library ieee; Use ieee.std_logic_1164.all; Entity sync isport(clk:in std_logic;irq:out std_logic); End sync; Architecture rtl of sync issigna
26、l couter:std_logic_vector(3 downto 0); Beginlabel1:processbeginwait until clk = 1;counter = counter +1;end process;label2:processbeginwait until clk = 1;if (counter = “1111”) thenirq = 0;else irq = 1;end if;end process; End rtl;,给出程序功能?,结构体的多进程组织方法,进程1,进程4,进程3,进程2,P1,P2,P3,P4,P12,P34,P31,P14,P43,P24
27、,进程设计要点,同一结构体中的进程之间是并行运行的,但同一进程中的逻辑描述语句则是顺序运行,因而在进程中只能设置顺序语句. 进程的激活必须由敏感表中定义的任一敏感信号的变化来启动,否则必须有一个显式的WAIT语句来激励.但在一个使用了敏感表的进程中不能含有任何等待语句. 进程之间的通信通过传递信号来实现,在任一进程的进程说明部分不允许定义信号.,2.2.2采用多模块描述复杂结构体的方法,一般的组织形式为: ENTITY multi_blocksARCHITECTUREBlock1 BlockBlock2BlockBlock3Block,Block模块结构,在VHDL中,每一个块结构的一般格式:
28、 块结构名:Block(块保护表达式)接口说明;类属说明BEGIN并行语句;END Block 块结构名;,用模块结构描述的结构体,ENTITY mux IS PORT(d0,d1,sel:IN bit;g:OUT bit); END mux; ARCHITECTURE connect OF mux IS Signal x1,x2,x2:bit; BEGINComa:BlockBEGINX1=d0 AND sel;X2=d1 AND (NOT sel);X1=d1 or x2;G=x3;END Block Coma; END connect;,Block模块并发性及执行条件,Block模块中所
29、描述的各个语句是可以并发执行的,和模块中的语句书写顺序无关。 语句的并发执行分为两类:一类是无条件并发执行,另一类是有条件并发执行。 有条件并发执行的Block称为Guarded Block(卫式Block)Block 控制条件的布尔表达式,块的类属说明部分和接口说明部分的适用范围仅限于当前BLOCK,B1:BLOCKSIGNAL s1:BIT;BEGINs1=a AND b; B2:BLOCKSIGNAL s2:BIT;BEGINs2=c AND d;b3:BLOCKBEGINz=s2;END BLOCK b3;END BLOCK b2;y=s1; END BLOCK b1;在不同的层次块中
30、定义了同名的信号,显示了信号的有效范围.,例:,ENTITY dff IS PORT(d,clk:IN bit;g,gb:OUT bit); END dff; ARCHITECTURE dff_guarded OF dff IS BEGINComA :Block (clk=1)BEGINg= GUARDED d AFTER 5ns;gb = GUARDED NOT(d) AFTER 10ns;END Block ComA; END dff_guardent; 当clk=1为 真时,该Block模块被启动执行,当控制条件为假时,该Block模块不被执行。,回顾,进程的结构 进程名:PROCESS
31、(信号1,信号2,)变量说明BEGINEND PROCESS;,进程结构,进程的启动和执行 进程的敏感信号表 进程内部语句的顺序性 多进程之间的并发性 进程之间如何通讯?,BLOCK模块结构,BLOCK内部语句是并发语句.,2.2.3采用子程序调用的结构体描述法,子程序具有某一特定功能的程序段,能够被主程序调用。子程序被调用时,首先要初始化,执行处理功能后,将处理结果传递给主程序。 子程序内部的值不能保持,子程序返回后,才能被再次调用,再次初始化。 子程序是一个非重入程序,包括两种; 过程(Procedure) 函数(Function),过程,PROCEDURE 过程名(参数1;参数2;) I
32、S定义语句: (变量的定义)BEGIN顺序处理语句: (过程的语句)END 过程名;,例: Procedure vector_to_int(input :in std_logic_vector;flag :out boolean;q:inout interger) is Beginq := 0;flag := false;for I in input ranger loopq:=q*2;if (input(I) =1) thenq:= q+1;elsif (input(I) /= 0) thenflag := true;end if;end loop; End vector_to_int;,子
33、程序可以在VHDL源代码的三个位置对子程序进行定义,这三个位置是:程序包结构体进程,在结构体中定义过程例子: Library ieee; Use ieee.std_logic_1164.all; Entity convert isport(I:in std_logic_vector(7 downto 0);f:out boolean;o:inout integer); End convert; Architectute behav of convert is,Procedure vector_to_int(input :in std_logic_vector;flag :out boolean
34、;q:inout interger) is Beginq := 0;flag := false;for I in input ranger loopq:=q*2;if (input(I) =1) thenq:= q+1;elsif (input(I) /= 0) thenflag := true;end if;end loop; End vector_to_int;,Beginprocess(I) Variable a:boolean; Variable b:integer; Beginvector_to_int(I,a,b);f=a;o = b; End process; End behav
35、;,Library ieee; Use ieee.std_logic_1164.all; Entity convert isport(i1:in std_logic_vector(7 downto 0);i2:in std_logic_vector(7 downto 0);f1:out boolean;f2:out boolean;o1:inout integero2:inout integer); End convert; Architectute behav of convert is Procedure vector_to_int(input :in std_logic_vector;s
36、ignal flag :out boolean;signal q:inout interger) is Beginq := 0;,flag := false;for I in input ranger loopq:=q*2;if (input(I) =1) thenq:= q+1;elsif (input(I) /= 0) thenflag := true;end if;end loop; End vector_to_int; Beginvector_to_int(i1,f1,o1);process(i2) Beginvector_to_int(i2,f2,o2);End process; E
37、nd behav;,函数,FUNCTION 函数名(参数1;参数2;); RETURN 数据类型名 IS 定义语句; BEGIN顺序处理语句;RETURN 返回变量名; END 函数名;函数可在程序包、结构体、进程和实体中定义,在实体中定义不常见。,例:,Function maximum(a,b:std_logic_vector) return std_logic_vector isvariable temp:std_logic_vector(arange); Beginif (ab) thentemp :=a;else temp := b;end if;return(temp); End m
38、aximum;,在结构体中定义函数: Library ieee; Use ieee.std_logic_1164.all; Entity example isport(a,b:in std_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0); End example; Architecture rtl of example is Function maximum(a,b:std_logic_vector) return std_logic_vector isvariable temp:std_logic_vector(aran
39、ge); Beginif (ab) thentemp :=a;else temp := b;,end if;return(temp); End maximum; Beginprocess(a,b) Beginq= maximum(a,b); End process; End rtl;,过程和函数的异同,过程的调用可通过其界面获得多个返回值,而函数只能返回一个值. 在函数入口中,所有参数都是输入参数,而过程有输入参数、输出参数和双向参数。 过程一般被看作一种语句结构,而函数通常是表达式的一部分。 过程可以单独存在,其行为类似于进程,而函数通常作为语句的一部分被调用。,思考:,三种结构体的异同?,
40、2.3包集合、库和配置,除实体和构造体外,包集合、库及配置是另外3个可以独立进行编译的设计单元。,2.3.1 库,库的含义 库(Library)是经编译后的数据的集合,它存放包集合定义、实体定义、构造体定义和配置定义。 它可以使设计者共享已经编译过的设计成果。库和库之间是独立的,不能互相嵌套。 库的种类 IEEE库 STD库 WORK库 ASIC矢量库 用户定义的库,库的使用 LIBRARY 库名 USE 库名.程序包名.项目名; USE 库名.程序包名.ALL; 例:LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;,库说明作用范围 库说明语句的作用范围从一
41、个实体说明开始到它所属的构造体、配置为止。当一个源程序中出现两个以上的实体时,两条作为使用库的说明语句应在每个实体说明语句前重复书写。,LIBRARY IEEE; 库使用说明 USE IEEE.STD_LOGIC_1164.ALL; ENTITY and1 IS END and1; ARCHITECTURE rtl of and1 IS END rtl; CONFIGURATION s1 OF and1 IS END s1; LIBRARY IEEE; 库使用说明 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or1 IS CONFIGURATION s2 OF or
42、1 IS END s2;,2.3.2 包集合,包集合(Package)说明像C语言中include语句一样,用来单纯地罗列VHDL语言中所要用到的信号定义、常数定义、数据类型、元件语句、函数定义和过程定义等,它是一个可编译的设计单元,也是库结构中的一个层次。,要使用包集合时用USE语句说明。 USE IEEE.STD_LOGIC_1164.ALL; 该语句表示在VHDL程序中要使用名为STD_LOGIC_1164的包集合中的所有定义或说明项。,包集合的结构如下所示: PACKAGE 包集合名 IS 说明语句; 包集合标题 END 包集合名; PACKAGE BODY 包集合名 IS 说明语句;
43、 包集合体 END 包集合名;,配置,配置(Configuration)语句描述层与层之间的连接关系以及实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的构造体,使其与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择不同的构造体,进行性能对比试验以得到性能最佳的构造体。,配置语句的基本书写格式如下: CONFIGURATION 配置名 OF 实体名 IS 语句说明; END 配置名;,LIBRARY STD; USE STD.STD_LOGIC.ALL; ENTITY counter IS PORT(load, clear, clk: IN T_WLOGIC; Data
44、_in: IN INTEGER; Data_out: OUT INTEGER); END counter; ARCHITECTURE count_255 OF counter IS BEGIN,PROCESS(clk) VARIABLE count INTEGER=0; BEGIN IF clear=1 THEN count=0; ELSIF load=1 THEN count=data_in; ELSIF(clkEVENT) AND (clk=1) AND (clkLAST_VALUE=0) THEN IF(count=255) THEN count=0; ELSE count=count+
45、1; END IF; END IF; data_out=count; END PROCESS; END count_255;,ARCHITECTURE count_64K OF counter IS BEGIN PROCESS(clk) VARIABLE count: INTEGER=0; BEGIN IF(clear=1) THNE count=0; ELSIF load=1 THEN count=data_in; ELSIF(clkEVENT) AND (clk=1) AND (clkLAST_VALUE=0) THEN IF(count=65535) THEN count=0; ELSE
46、 count=count+1; END IF; END IF;,data_out=count; END PROCESS; END count_64K; CONFIGURATION small_count OF counter IS FOR count_255 END FOR; END small_count; CONFIGURATION big_count OF counter IS FOR count_64K END FOR; END big_count; 在例中,一个计数器实体可以实现两个不同构造体的配置。需要注意的是,为达到这个目的,计数器实体中对装入计数器和构成计数器的数据位宽度不应作
47、具体说明,只将输入和输出数据作为INTEGER(整型)数据来对待。这样就可以支持多种形式的计数器(如例中的8位计数器和16位计数器),以便在宿主机上方便地进行仿真。,课堂小测试,可独立进行编译的设计单元有哪些? 实体和构造体的对应关系是一对一,还是可以一对多? 在VHDL程序中配置有何用处? 库说明的作用范围?,进程是并发语句还是顺序语句,进程内部是何种语句? 信号和变量分别在什么地方定义? 进程如何启动? 进程中已有敏感信号量表,在进程中是否可有WAIT语句? 既无敏感信号量又无WAIT语句的进程会如何? 进程有两个敏感量,其中一个由”0”变”1”,等待一段时间以后再由”1”变”0”,而另一
48、个只由”1”变”0”改变一次,请问该进程将执行几遍? 进程中的语句顺序颠倒一下不会改变所描述的电路功能,对吗?为什么?,作业,1.写出8位锁存器的实体,输入为D、CLOCK和OE,输出为Q。 2.写出如图所示的原理图相应的VHDL的构造体. 3.根据如下的VHDL描述画出相应的原理图. ENTITY DLATCH ISPORT(D,CP:IN STD_LOGIC;Q,QN:OUT STD_LOGIC;) END DLATCH; ARCHITECTURE one OF DLATCH ISSIGNAL N1,N2:STD_LOGIC; BEGINN1=(NOT D) NAND CP;N2=D NAND CP;Q=QN NAND N1;QN=Q NAND N2; END one;,