中国高校课件下载中心 》 教学资源 》 大学文库

《EDA技术》课程授课教案(讲稿)第7章 VHDL语句

文档信息
资源类别:文库
文档格式:PDF
文档页数:31
文件大小:295.25KB
团购合买:点击进入团购
内容简介
《EDA技术》课程授课教案(讲稿)第7章 VHDL语句
刷新页面文档预览

第7章VHDL语句顺序语句和并行语句是程序设计中两类基本描述语句。这些语句从多侧面完整地描述了数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。7.1顺序语句顺序语句的特点是:执行(指仿真执行)顺序与他们的书写顺序基本一致。顺序语句只能出现在进程和子程序中,子程序包括函数和过程。VHDL有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。7.1.1赋值语句信号赋值语句变量赋值语句赋值目标赋值符号赋值源变量赋值与信号赋值的区别:变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程序中,它是一个局部的、暂时性数据对象。对于它的赋值是立即发生的(假设进程已启动),即是一种时间延迟为零的赋值行为。变量赋值符号为:“:=”。信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传输的载体,而且可通过信号与其他的实体进行通信。信号的赋值并不是立即发生的,它发生在一个进程结束时。信号赋值符号为:“<=”。7.1.2IF语句(1) IF条件句THEN顺序语句END IF ;(2)IF条件句THEN顺序语句ELSE顺序语句END IF ;(3)IF条件句THENIF条件句THEN1

1 第 7 章VHDL 语句 顺序语句和并行语句是程序设计中两类基本描述语句。这些语句从多侧面完 整地描述了数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的 赋值、多层次的元件例化以及系统行为等。 7.1 顺序语句 顺序语句的特点是:执行(指仿真执行)顺序与他们的书写顺序基本一致。 顺序语句只能出现在进程和子程序中,子程序包括函数和过程。 VHDL 有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序 调用语句、返回语句、空操作语句。 7.1.1 赋值语句 信号赋值语句 变量赋值语句 赋值目标 赋值符号 赋值源 变量赋值与信号赋值的区别: 变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程 序中,它是一个局部的、暂时性数据对象。 对于它的赋值是立即发生的(假设进程已启动),即是一种时间延迟为零的 赋值行为。 变量赋值符号为:“:=”。 信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传输 的载体,而且可通过信号与其他的实体进行通信。 信号的赋值并不是立即发生的,它发生在一个进程结束时。 信号赋值符号为:“<=”。 7.1.2 IF 语句 (1)IF 条件句 THEN 顺序语句 END IF ; (2)IF 条件句 THEN 顺序语句 ELSE 顺序语句 END IF ; (3)IF 条件句 THEN IF 条件句 THEN

END IFENDIF(4) IF条件句THEN顺序语句ELSEIF条件句THENELSE顺序语句ENDIF--任一分支的执行条件,是以上各分支所确定条件的与逻辑(相关条件同时成立)。即语句中顺序语句的执行条件具有向上相与的功能。注意:判别条件句的表达式结果的数据类型是Boolean表3-228线-3线优先编码器真值表入输输出dinodinldin2din3din4din5din6din7outoout1out20000xxxxxxx01100xxxxXx011010xxxxx01I1110xXXx0111100xxx【例3-32】8线一3线优先编码器LIBRARYIEEE;USEIEEE.STDLOGIC1164.ALL:ENTITY coder ISPORT(din:INSTDLOGIC_VECTOR(OTO7);Output:OUTSTDLOGIC_VECTOR(OTO2)END coder,ARCHITECTUREbehavOF coderISSIGNAL SINT : STD_LOGIC_VECTOR(4 DOWNTO O);BEGINPROCESS (din)2

2 . END IF END IF (4)IF 条件句 THEN 顺序语句 ELSE IF 条件句 THEN . ELSE 顺序语句 END IF -任一分支的执行条件,是以上各分支所确定条件的与逻辑(相关条件同时成 立)。即语句中顺序语句的执行条件具有向上相与的功能。 注意: 判别条件句的表达式结果的数据类型是 Boolean 表 3-2 8 线-3 线优先编码器真值表 【例 3-32】8 线-3 线优先编码器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY coder IS PORT ( din : IN STD_LOGIC_VECTOR(0 TO 7); output : OUT STD_LOGIC_VECTOR(0 TO 2) ); END coder; ARCHITECTURE behav OF coder IS SIGNAL SINT : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS (din) 输 入 输 出 din0 din1 din2 din3 din4 din5 din6 din7 out0 out1 out2 x x x x x x x 0 0 0 0 x x x x x x 0 1 1 0 0 x x x x x 0 1 1 0 1 0 x x x x 0 1 1 1 1 1 0 x x x 0 1 1 1 1 0 0 1

BEGINIF (din(7)=0') THEN output 顺序语句:When选择值=>顺序语句:ENDCASE;选择值可以有四种不同的表达方式:单个普通数值,如6。数值选择范围,如(2TO4),表示取值为2、3或4。并列数值,如35,表示取值为3或者5。混合方式,以上三种方式的混合。多条件选择值的一般表达式为:选择值【选择值】条件语句的选择值必须在表达式的取值范围内。除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示,它代表已给的所有条件句中未能列出的其他可能的取值。CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。CASE语句执行中必须选中且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。3

3 BEGIN IF (din(7)='0') THEN output 顺序语句; When 选择值 => 顺序语句; . END CASE ; 选择值可以有四种不同的表达方式: 单个普通数值,如 6。 数值选择范围,如(2 TO 4),表示 取值为 2、3 或 4。 并列数值,如 3 5,表示取值为 3 或者 5。 混合方式,以上三种方式的混合。 多条件选择值的一般表达式为: 选择值 [ |选择值 ] 条件语句的选择值必须在表达式的取值范围内。 除非所有条件语句中的选择值能完全覆盖 CASE 语句中表达式的取值,否则 最末一个条件句中的选择必须用“OTHERS”表示,它代表已给的所有条件句中 未能列出的其他可能的取值。 CASE 语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件 语句出现。 CASE 语句执行中必须选中且只能选中所列条件语句中的一条。这表明 CASE 语句中至少要包含一个条件语句

【例7-1】四选一电路描述LIBRARYIEEE:USEIEEE.STDLOGIC 1164.ALL:ENTITY mux41ISPORT(s4, s3, s2, s1 :IN STD LOGIC;z4, z3, z2, zl :OUT STD_LOGIC),END mux41;ARCHITECTUREactivOFmux41ISSIGNALsel:INTEGERRANGE0TO15BEGINPROCESS(sel ,s4,s3,s2,s1)BEGINsezl Z2z3z4 out1outl<='0';ENDCASE4

4 【例 7-1】四选一电路描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (s4,s3, s2,s1 : IN STD_LOGIC; z4,z3, z2,z1 : OUT STD_LOGIC); END mux41; ARCHITECTURE activ OF mux41 IS SIGNAL sel : INTEGER RANGE 0 TO 15; BEGIN PROCESS (sel ,s4,s3,s2,s1 ) BEGIN sel z1 z2 z3 z4 out1 out1<= '0' ; END CASE

CASE value ISWHEN0TO10=>0ut0ut1 result result-a、b相等IF (a=b) THEN result<=x"01";ELSE result <= x"00";END IF;5

5 CASE value IS WHEN 0 TO 10 => out1 out1 result result - a、b 相等 IF (a = b) THEN result <= x"01"; ELSE result <= x"00"; END IF;

--a、b不相等WHENnot equal=>IF (a /= b) THEN result 10;-当a大于10时跳出循环ENDLOOPL2;(2)FOR_LOOP语句,语法格式如下:[LOOP标号:]FOR循环变量,IN循环次数范围LOOP顺序语句ENDLOOP[LOOP标号1:FOR后的循环变量是一个临时变量,属于LOOP语句的局部变量,不必事先定义。这个变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义。使用时要注意在LOOP语句范围内,不要再使用其他与此循环变量同名的标示符。循环变量从循环范围次数的初值开始,每执行一次顺序语句后递增1,直到达到循环次数范围指定的最大值。【例7-4】8位奇偶校验LIBRARYIEEE;USEIEEE.STDLOGIC1164.ALL:6

6 WHEN not_equal => - a、b 不相等 IF (a /= b) THEN result 10 ; - 当 a 大于 10 时跳出循环 END LOOP L2; . (2)FOR_LOOP 语句,语法格式如下: [LOOP 标号:] FOR 循环变量,IN 循 环次数范围 LOOP 顺序语句 END LOOP [LOOP 标号]; FOR 后的循环变量是一个临时变量,属于 LOOP 语句的局部变量,不必事 先定义。 这个变量只能作为赋值源,不能被赋值,它由 LOOP 语句自动定义。 使用时要注意在 LOOP 语句范围内,不要再使用其他与此循环变量同名的 标示符。 循环变量从循环范围次数的初值开始,每执行一次顺序语句后递增 1,直到 达到循环次数范围指定的最大值。 【例 7-4】8 位奇偶校验 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;

ENTITYpcheckISPORT(a:INSTD_LOGIC_VECTOR(7 DOWNTO O);y : OUT STD_LOGIC);ENDp_check;ARCHITECTURE opt OF p_check ISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp<='0';FOR n IN O TO 7 LOOPtmp<= tmp XOR a(n);END LOOP ;y <= tmp;ENDPROCESS:END opt,【例7-5】SIGNAL a, b, c : STD LOGIC_VECTOR (1 TO 3);FOR n IN 1 TO 3 LOOPa(n) <= b(n) AND c(n);END LOOP:此段程序等效于顺序执行以下三个信号赋值操作:a(1)<=b(1) AND c(1);a(2)<=b(2) AND c(2);a(3)<=b(3) AND c(3);注意:LOOP循环的范围最好以常数表示,否则LOOP体内的逻辑可以重复任何可能的范围,将导致消耗过大的硬件资源。7.1.5NEXT语句第一种语句格式:无条件跳转到前面LOOP语句的起始点;NEXT:第二种语句格式:无条件跳转到前面LOOP标号语句的起始点:NEXTLOOP标号:第三种语句格式:条件为Ture时,跳转到前面LOOP标号语句的起始点;NEXTLOOP标号WHEN条件表达式:【例7-6】单层LOOP循环,可省去关键词NEXT与WHEN之间的“LOOP标号”。L1 : FOR cnt_ value IN 1 TO 8 LOOPsl:a(cnt_value) :='0';7

7 ENTITY p_check IS PORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); y : OUT STD_LOGIC ); END p_check; ARCHITECTURE opt OF p_check IS SIGNAL tmp :STD_LOGIC ; BEGIN PROCESS(a) BEGIN tmp <='0'; FOR n IN 0 TO 7 LOOP tmp <= tmp XOR a(n); END LOOP ; y <= tmp; END PROCESS; END opt; 【例 7-5】 SIGNAL a, b, c : STD_LOGIC_VECTOR (1 TO 3); . FOR n IN 1 TO 3 LOOP a(n) <= b(n) AND c(n); END LOOP; 此段程序等效于顺序执行以下三个信号赋值操作: a(1)<=b(1) AND c(1); a(2)<=b(2) AND c(2); a(3)<=b(3) AND c(3); 注意:LOOP 循环的范围最好以常数表示,否则 LOOP 体内的逻辑可以重复任何 可能的范围,将导致消耗过大的硬件资源。 7.1.5 NEXT 语句 第一种语句格式:无条件跳转到前面 LOOP 语句的起始点; NEXT; 第二种语句格式:无条件跳转到前面 LOOP 标号语句的起始点; NEXT LOOP 标号; 第三种语句格式:条件为 Ture 时,跳转到前面 LOOP 标号语句的起始点; NEXT LOOP 标号 WHEN 条件表达式; 【例 7-6】单层 LOOP 循环,可省去关键词 NEXT 与 WHEN 之间的“LOOP 标 号”。 . L1 : FOR cnt_value IN 1 TO 8 LOOP s1:a(cnt_value) := '0';

NEXTWHEN (b=c);s2:a(cnt_ value + 8 ):='0';END LOOP L1:【例7-7】多层LOOP循环,LOOP标号不可省!L x:FOR cnt _ value IN 1 TO 8LOOPsl:a(cnt_ value):='0';k:= 0;LOOPL y:s2:b(k) :='0';NEXT L x WHEN (e>f);s3:b(k+8) :='0':k :=k+1;NEXT LOOPL_y;NEXT LOOPL_X;7.1.6EXIT语句第一种语句格式:无条件跳转到LOOP语句的结束处;EXIT:第二种语句格式:无条件跳转到LOOP标号语句的结束处:EXITLOOP标号;第三种语句格式:条件为Ture时,跳转到LOOP标号语句的结束处:EXITLOOP标号WHEN条件表达式;【例7-8】SIGNALa,b:STDLOGIC_VECTOR(1DOWNTOO);SIGNAL a less _then _b : Boolean;a less_then bba_less_then_b <=FALSE;EXIT;ELSIF (a(i)=0' AND b(i)=1) THEN--a<balessthenb<=TRUE;EXIT;ELSENULL:END IF;END LOOP:-当i=1时返回LOOP语句继续比较7.1.7WAIT语句8

8 NEXT WHEN (b=c); s2:a(cnt_value + 8 ):= '0'; END LOOP L1; 【例 7-7】多层 LOOP 循环,LOOP 标号不可省! . L_x: FOR cnt_value IN 1 TO 8 LOOP s1: a(cnt_value):= '0'; k := 0; L_y: LOOP s2: b(k) := '0'; NEXT L_x WHEN (e>f); s3: b(k+8) := '0'; k := k+1; NEXT LOOP L_y ; NEXT LOOP L_x ; . 7.1.6 EXIT 语句 第一种语句格式:无条件跳转到 LOOP 语句的结束处; EXIT; 第二种语句格式:无条件跳转到 LOOP 标号语句的结束处; EXIT LOOP 标号; 第三种语句格式:条件为 Ture 时,跳转到 LOOP 标号语句的结束处; EXIT LOOP 标号 WHEN 条件表达式; 【例 7-8】 SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL a_less_then_b : Boolean; .a_less_then_b b EXIT ; ELSIF (a(i)='0' AND b(i)='1') THEN a_less_then_b <= TRUE ; - a < b EXIT; ELSE NULL; END IF; END LOOP; - 当 i=1 时返回 LOOP 语句继续比较 7.1.7 WAIT 语句

第一种语句格式:永远挂起:WAIT;第二种语句格式:敏感信号等待语句;WAITON信号表;第三种语句格式:条件等待语句;WAITUNTIL条件表达式;第四种语句格式:超时等待语句;WAITFOR时间表达式;【例7-9】SIGNAL s1,s2 : STD LOGIC;PROCESSBEGINWAITON sl,s2 :ENDPROCESS;注意:已列出敏感表的进程中不能使用任何形式的WAIT语句。进程在WAIT处被挂起,一直到s1或s2中任一信号发生改变时,进程才重新开始。【例7-10】以下两种表达方式是等效的(b)WAIT_ON结构(a)WAIT_UNTIL结构LOOPWait until enable ='1';Wait on enable;EXITWHEN enable =1';ENDLOOP;对于条件等待语句:WAITUNTIL条件表达式:被此语句挂起的进程需顺序满足如下两个条件,进程才能脱离挂起状态:1、在条件表达式中所含的信号发生了改变:2、此信号改变后,且满足WAIT语句所设的条件。这两个条件不但缺一不可,而且必须按照以上顺序来完成。一般地,只有WAITUNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用),WAIT_UNTIL语句有以下三种表达方式:WAITUNTIL信号=Value:- (1)WAITUNTIL信号”EVENTAND信号=Value;--(2)WAITUNTILNOT信号STABLEAND信号=Value;--(3)9

9 第一种语句格式:永远挂起; WAIT; 第二种语句格式:敏感信号等待语句; WAIT ON 信号表; 第三种语句格式:条件等待语句; WAIT UNTIL 条件表达式; 第四种语句格式:超时等待语句; WAIT FOR 时间表达式; 【例 7-9】 SIGNAL s1,s2 : STD_LOGIC; . PROCESS BEGIN . WAIT ON s1,s2 ; END PROCESS ; 注意:已列出敏感表的进程中不能使用任何形式的 WAIT 语句。 进程在 WAIT 处被挂起,一直到 s1 或 s2 中任一信号发生改变时,进程才重新开 始。 【例 7-10】以下两种表达方式是等效的 (a) WAIT_UNTIL 结构 (b) WAIT_ON 结构 . LOOP Wait until enable ='1'; Wait on enable; . EXIT WHEN enable ='1'; END LOOP; 对于条件等待语句: WAIT UNTIL 条件表达式; 被此语句挂起的进程需顺序满足如下两个条件,进程才能脱离挂起状态: 1、在条件表达式中所含的信号发生了改变; 2、此信号改变后,且满足 WAIT 语句所设的条件。 这两个条件不但缺一不可,而且必须按照以上顺序来完成。 一般地,只有 WAIT_UNTIL 格式的等待语句可以被综合器接受(其余语句 格式只能在 VHDL 仿真器中使用) ,WAIT_UNTIL 语句有以下三种表达方式: WAIT UNTIL 信号=Value; - (1) WAIT UNTIL 信号’EVENT AND 信号=Value; - (2) WAIT UNTIL NOT 信号’STABLE AND 信号=Value; - (3)

如果设clock为时钟信号输入端,以下四条WAIT语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:WAIT UNTIL clock ='1':WAIT UNTIL rising_edge(clock);WAITUNTILNOTclock'STABLEANDclock =1';WAITUNTILclock=I'ANDclock'EVENT;【例7-11】4个时钟后将获得4个数值的平均值。PROCESSBEGINWAIT UNTIL clk =I';ave<=a,WAIT UNTIL clk ='1':ave <= ave + a,WAITUNTILclk=I':ave <= ave + a,WAIT UNTIL clk='I';ave<=(ave + a)/4 ;END PROCESS ;原因:1、信号赋值需要一个8延时:2、在进程中,所有赋值语句(包括变量赋值)都必须在一个8延时中完成。3、在进程中存在同一信号有多个赋值源时,赋值对象的值发生更新的信号,是最接近“ENDPROCESS”语句的信号。信号赋值的进一步说明:1、在进程中的所有信号赋值语句,在进程启动的一瞬间立即执行赋值操作:2、所有赋值语句都必须在一个8延时中完成赋值(令赋值对象的值发生更新)。3、执行赋值和完成赋值是两个不同的概念。“执行赋值”值是一个过程,它具有顺序特征;而“完成赋值”是一种结果,它的发生具有HDL最本质的并行的特征。【例7-12】用WAIT语句描述具有同步复位功能的电路。PROCESSBEGINrst_loop :LOOPWAITUNTILclock=IANDclock'EVENT;-等待时钟信号检测复位信号rstNEXT rst_loop WHEN (rst=1');无复位信号,执行赋值操作x<=a;,WAITUNTILclock=I'ANDclockEVENT:等待时钟信号检测复位信号rstNEXT rst loop WHEN (rst='1');无复位信号,执行赋值操作y<=b;END LOOP rst_loop ;ENDPROCESS;10

10 如果设 clock 为时钟信号输入端,以下四条 WAIT 语句所设的进程启动条件 都是时钟上跳沿,所以它们对应的硬件结构是一样的: WAIT UNTIL clock ='1'; WAIT UNTIL rising_edge(clock) ; WAIT UNTIL NOT clock’STABLE AND clock ='1'; WAIT UNTIL clock ='1' AND clock’EVENT; 【例 7-11】4 个时钟后将获得 4 个数值的平均值。 . PROCESS BEGIN WAIT UNTIL clk ='1'; ave <= a; WAIT UNTIL clk ='1'; ave <= ave + a; WAIT UNTIL clk ='1'; ave <= ave + a; WAIT UNTIL clk ='1'; ave <= (ave + a)/4 ; END PROCESS ; 原因: 1、信号赋值需要一个δ延时; 2、在进程中,所有赋值语句(包括变量赋值)都必须在一个δ延时中完成。 3、在进程中存在同一信号有多个赋值源时,赋值对象的值发生更新的信号,是 最接近“END PROCESS”语句的信号。 信号赋值的进一步说明: 1、在进程中的所有信号赋值语句,在进程启动的一瞬间立即执行赋值操作; 2、所有赋值语句都必须在一个δ延时中完成赋值(令赋值对象的值发生更新)。 3、执行赋值和完成赋值是两个不同的概念。“执行赋值”值是一个过程,它具有 顺序特征;而“完成赋值”是一种结果,它的发生具有 HDL 最本质的并行的特 征。 【例 7-12】用 WAIT 语句描述具有同步复位功能的电路。 PROCESS BEGIN rst_loop : LOOP WAIT UNTIL clock ='1' AND clock’EVENT; - 等待时钟信号 NEXT rst_loop WHEN (rst='1'); - 检测复位信号 rst x <= a ; - 无复位信号,执行赋值操作 WAIT UNTIL clock ='1' AND clock’EVENT; - 等待时钟信号 NEXT rst_loop WHEN (rst='1'); - 检测复位信号 rst y <= b ; - 无复位信号,执行赋值操作 END LOOP rst_loop ; END PROCESS;

刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档