第VHDL基本语句与要素PPT课件

上传人:可**** 文档编号:78250644 上传时间:2022-04-21 格式:PPTX 页数:155 大小:611.66KB
返回 下载 相关 举报
第VHDL基本语句与要素PPT课件_第1页
第1页 / 共155页
第VHDL基本语句与要素PPT课件_第2页
第2页 / 共155页
第VHDL基本语句与要素PPT课件_第3页
第3页 / 共155页
点击查看更多>>
资源描述
VHDL的基本顺序语句主要包括:赋值语句、IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句、WAIT语句、ASSERT语句、REPORT语句、子程序调用语句、RETURN和NULL语句等。4.1 VHDL的顺序语句的顺序语句第1页/共155页 4.1.1 赋值语句 赋值语句的功能就是将一个值或一个表达式的运算结果传递给某一数据对象,如信号或变量,或由信号、变量组成的数组。VHDL的赋值语句有两种,即信号赋值语句和变量赋值语句。 4.1 VHDL的顺序语句的顺序语句第2页/共155页4.1.1 赋值语句 (1)变量赋值语句 变量赋值语句的功能是用计算赋值符号右边的表达式所得的新值取代变量原来的值。 变量的赋值只能限定在顺序区域内,即只能在进程、过程或函数中为变量赋值。变量赋值语句的书写格式如下: VARIABLE目标变量名:数据类型:=表达式;4.1 VHDL的顺序语句的顺序语句第3页/共155页4.1 VHDL的顺序语句(1)变量赋值语句单值元素赋值目标例如:VARIABLE a, b: STD_LOGIC; VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;a:=1;b:=0; x:=11; y:=2+x;第4页/共155页(1)变量赋值语句数组元素赋值目标 数组元素赋值目标的表示形式如下: 标识符(下标名)其中“下标名”可以是一个具体的数值,也可以是一个以文字表示的数字,VHDL规定程序在综合时该文字要具有确定的数值。VARIABLE a,b:STD_LOGIC_VECTOR(7 DOWNTO 0); b(7 DOWNTO 0):=“10110010”; -数组赋初值a:=b; -b向a赋值 4.1 VHDL的顺序语句第5页/共155页 (1)变量赋值语句段下标元素赋值目标 赋值目标表示形式如下: 标识符(下标1 TO或DOWNTO 下标2) 其中,括号中的“下标1”和“下标2”必须用具体数值表示,并且其数值范围必须在所定义的数组下标范围内。例如:VARIABLE a,b : STD_LOGIC_VECTOR (1 TO 4);b(1 TO 4):=1011;a:=b;a(1 TO 2):=b(3 TO 4); -a(1)=1,a(2)=1;a(1 TO 4):=1011;4.1 VHDL的顺序语句第6页/共155页4.1.1 赋值语句(2)信号赋值语句 信号赋值语句的书写格式如下:目标信号名=表达式 AFTER 时间量;“=”为信号赋值符号。“AFTER 时间量”可用于为数据信息的输入设置延时量(如AFTER 3ns)4.1 VHDL的顺序语句SIGNAL y,z : STD_LOGIC;SIGNAL a,b :STD_LOGIC_VECTOR(0 TO 3);a=1010; -数组元素赋值b=1000;a(i)=y; -段下标元素赋值b(3)=z; -段下标元素赋值第7页/共155页4.1.2 IF语句(1)用于门闩控制的IF语句语句的书写格式如下: IF 条件 THEN 顺序语句; END IF;当程序执行到该IF语句时,就要判断IF语句所指定的条件是否成立。如果条件成立,IF语句所包含的“顺序语句”将被执行;如果条件不成立,程序跳过IF语句所包含的“顺序语句”,执行IF语句的后续语句。4.1 VHDL的顺序语句第8页/共155页【例4.1】 D触发器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END DFF;ARCHITECTURE bhv OF DFF ISBEGIN PROCESS(clk) BEGIN IF clkEVENT AND clk=1 THEN -IF语句应用 q=d; END IF; END PROCESS;END bhv;4.1 VHDL的顺序语句第9页/共155页(2)用于二选一控制的IF语句语句的书写格式如下: IF 条件 Then 顺序语句1; ELSE 顺序语句2; END IF;当IF指定的“条件”成立时,执行“顺序语句1”;当“条件”不成立时,执行“顺序语句2”。用于二选一控制的IF语句是利用条件选择两条不同的程序执行路径。4.1 VHDL的顺序语句第10页/共155页【例4.2】二选一多路选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT(a,b,sel:IN STD_LOGIC; c:OUT STD_LOGIC);END mux21;ARCHITECTURE example OF mux21 ISBEGIN PROCESS(a,b,sel) BEGIN IF sel=1THEN c=a; ELSE c=b; END IF; END PROCESS;END example;4.1 VHDL的顺序语句第11页/共155页(3)用于多选择控制的IF语句语句的书写格式如下: IF 条件1 THEN 顺序语句1; ELSIF 条件2 THEN 顺序语句2; ELSIF 条件n THEN 顺序语句n; ELSE 顺序语句n+1; END IF; 当“条件1”成立时,执行“顺序语句1”;当“条件2”成立时,执行“顺序语句2”;当“条件n”成立时,执行“顺序语句n”;当所有条件都不成立时,执行“顺序语句n+1”。4.1 VHDL的顺序语句第12页/共155页(3)用于多选择控制的IF语句 例4.3 8-3优先级编码器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY priority_encoder IS PORT(d:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END priority_encoder; ARCHITECTURE example OF priority_encoder IS BEGIN PROCESS(d) BEGIN IF(d(0)=0)THEN q=111; ELSIF(d(1)=0) THEN q=110; ELSIF(d(2)=0) THEN q=101;4.1 VHDL的顺序语句第13页/共155页IF语句是顺序执行语句,此例中IF语句的执行顺序和编码器的优先级是一致的,若颠倒IF语句的顺序,则破坏了编码器的优先级,故IF语句的判别条件是不可颠倒的。 ELSIF(d(3)=0) THEN q=100; ELSIF(d(4)=0) THEN q=011; ELSIF(d(5)=0) THEN q=010; ELSIF(d(6)=0) THEN q=001; ELSE q顺序语句1; WHEN 选择值=顺序语句2; 【WHEN OTHERS=顺序语句n;END CASE;4.1 VHDL的顺序语句第15页/共155页4.1.3 CASE语句【例4.4】4-1多路选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX41 IS PORT(S1,S2:IN STD_LOGIC; A,B,C,D:IN STD_LOGIC; Z:OUT STD_LOGIC); END ENTITY MUX41; ARCHITECTURE ART OF MUX41 IS SIGNAL S:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN 4.1 VHDL的顺序语句第16页/共155页4.1.3 CASE语句SZZZZZ=X; END CASE; END PROCESS;END ART; 运算符“&”代表并置的意思。由于S的数据 STD_LOGIC_VECTOR,在VHDL综合过程中,它可能的选择值除了00、01、10和11外,还可以有其他定义于STD_LOGIC的选择值,需要用OTHERS列出。4.1 VHDL的顺序语句DZDCBAS1S2CBAS1S2图4.1 4选1多路选择器第17页/共155页4.1.3 CASE语句【例4.5】用IF语句和CASE语句共同完成的4选多路选择器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 ART OF MUX41 IS SIGNAL SEL:INTEGER RANGE 0 TO 15;BEGIN PROCESS(S4,S3,S2,S1) BEGIN 4.1 VHDL的顺序语句第18页/共155页SEL=0; -设置初始值 IF S1=1 THEN SEL=SEL+1; ELSIF S2=1THEN SEL=SEL+2; ELSIF S3=1 THEN SEL=SEL+4; ELSIF S4=1 THEN SEL=SEL+8; ELSE NULL; -NULL空操作语句,表示什么都不做 END IF; Z1=0;Z2 =0; Z3=0; Z4 Z1 Z2 Z3 Z410; -当A大于10时跳出循环 END LOOP L2;第21页/共155页4.1.4 LOOP语句(2)FOR循环变量形式的LOOP语句语句的书写格式如下LOOP标号:FOR 循环变量 IN 循环次数范围LOOP 顺序语句; END LOOP LOOP标号;上述格式中“循环变量”的值在每次循环中都会发生变化。“循环次数范围”表示循环变量在循环过程中的取值范围。4.1 VHDL的顺序语句第22页/共155页4.1.4 LOOP语句【例4.6】利用FOR-LOOP语句实现的4位并行奇校验发生器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY parity_check IS PORT(A:IN STD_LOGIC_VECTOR(0 TO 2); B:IN STD_LOGIC; Y:OUT STD_LOGIC);END;ARCHITECTURE example_LOOP OF parity_check IS SIGNAL S: STD_LOGIC_VECTOR(0 TO 3);BEGIN PROCESS(A) BEGIN 4.1 VHDL的顺序语句第23页/共155页 从例4.6可以看出,使用FOR-LOOP语句时循环变量(i)在信号说明、变量说明中不能出现,信号、变量不能代入到循环变量中。S(0)=B; FOR i IN 0 TO 2 LOOPS(i+1)=S(i) XOR A(i); END LOOP; Y=S(3); END PROCESS; END example_LOOP;4.1 VHDL的顺序语句4.1.4 LOOP语句语句第24页/共155页(3)WHILE条件下的LOOP语句语句的书写格式如下: LOOP 标号:WHILE 循环条件 LOOP 顺序语句; END LOOPLOOP标号;在WHILE-LOOP形式的循环语句中,“循环条件”为“真”时执行“顺序语句”;“循环条件”为“假”时结束循环。4.1 VHDL的顺序语句4.1.4 LOOP语句语句第25页/共155页【例4.7】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY parity_check IS PORT(A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); Y:OUT STD_LOGIC);END parity_check;ARCHITECTURE example_while OF parity_check ISBEGIN PROCESS(A) VARIABLE TMP:STD_LOGIC; VARIABLE i:INTEGER; BEGIN TMP:=0; i:=0; WHILE (i8) LOOP TMP:=TMP xor A(i); i:=i+1; END LOOP; END PROCESS;END example_while;4.1 VHDL的顺序语句4.1.4 LOOP语句语句第26页/共155页4.1.5 NEXT语句NEXT语句用在LOOP循环语句的内部,充当内部循环控制,它的作用是有条件的或无条件的终止当前循环并开始下一次循环。NEXT语句的书写格式有以下三种:(1)NEXT;当LOOP内的顺序语句执行到NEXT语句时,即刻无条件终止当 前循环,跳回到本次循环LOOP语句处,开始下一次循环。(2)NEXT LOOP标号;LOOP标号表明下一次循环的起始位置。当有多重LOOP语句嵌套时,可以跳转到指定标号的LOOP语句处,重新开始执行循环操作。4.1 VHDL的顺序语句第27页/共155页(3)NEXT LOOP标号 WHEN 条件表达式;“WHEN 条件表达式”是执行NEXT语句的条件,如果条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作;如果“条件表达式”的值为FALSE,则循环正常继续。当只有单层LOOP循环时,“LOOP 标号”可以省略。4.1 VHDL的顺序语句4.1.5 NEXT语句第28页/共155页 L1:WHILE I10 LOOP L2:WHILE J20 LOOP NEXT L1 WHEN I=J; END LOOP L2; END LOOP L1;本例中,当程序执行到NEXT语句时,如果条件判断式(I=J)的结果为TRUE,将执行NEXT语句,并返回到L1,否则跳转语句不起作用,继续执行循环语句L2。 4.1 VHDL的顺序语句4.1.5 NEXT语句第29页/共155页N1:FOR i IN 10 DOWNTO 1 LOOP N2:FOR j IN 0 TO i LOOP NEXT N1 WHEN i=j;-条件成立,跳到N1处 MATRIX(i,j):=i*l+1; -条件不成立,继续内层 循环N2的执行 END LOOP N2;END LOOP N1;4.1 VHDL的顺序语句4.1.5 NEXT语句第30页/共155页4.1.6 EXIT语句 EXIT语句用在LOOP循环语句的内部,用于循环控制,它的作用是有条件或无条件地终止该循环。EXIT语句的书写格式有以下三种: (1)EXIT;(2)EXIT LOOP标号;(3)EXIT LOOP标号 WHEN 条件表达式;4.1 VHDL的顺序语句第31页/共155页 与NEXT语句的区别是NEXT 语句跳转到LOOP 语句处,当没有标号时跳转到LOOP 语句的开始处。EXIT 语句的跳转方向LOOP 标号指定的LOOP循环语句的结束处,即完全跳出指定的循环。其用法示例如下: SIGNAL a,b:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL a_less_then_b:BOOLEAN; a_less_then_b=FALSE; -设初始值FOR I IN 1 DOWNTO 0 LOOP IF (a(i)=1AND b(i)=0THEN a_less_then_bb4.1 VHDL的顺序语句4.1.6 EXIT语句第32页/共155页 EXIT; ELSIF (a(i)=0AND b(i)=1)THEN a_less_then_b=TRUE; -ab EXIT; ELSE NULL; END IF;END LOOP;上例是一个两元素矢量值比较的程序。此程序先比较a和b的高位,高位是1者大,输出判断结果TRUE或FALSE后中断比较程序;当高位相等时,继续比较低位,这里假设a不等于b。其中的NULL为空操作语句,是为了满足ELSE的转换。4.1 VHDL的顺序语句4.1.6 EXIT语句第33页/共155页4.1.7 WAIT语句 在进程(包括过程)中,当执行到WAIT(等待)语句时,运行程序将被挂起(Suspension),直到满足此语句设置的结束挂起条件后,才重新开始执行进程或过程中的程序。但VHDL规定,在已列出敏感量的进程中不能使用任何形式的WAIT语句。WAIT语句的书写格式有以下四种:(1)WAIT;单独的WAIT,未设置停止挂起的条件表达 式,表示永远挂起。(2)WAIT ON 信号表;4.1 VHDL的顺序语句第34页/共155页敏感信号等待语句,类似于进程PROCESS语句中的敏感信号表,在“信号表”中列出的信号是等待语句的敏感信号,当处于等待状态时,敏感信号的任何变化(如01或10的变化)将结束挂起,再次启动进程。(3)WAIT UNTIL 条件表达式;条件等待语句,相对于敏感信号等待语句,条件等待语句不仅要求“条件表达式”中的信号发生变化,并且要求信号的变化满足WAIT语句所设的条件。只有以上两个条件同时满足,才能解除挂起,继续执行WAIT语句后的顺序语句。4.1 VHDL的顺序语句4.1.7 WAIT语句第35页/共155页(4)WAIT FOR 时间表达式;第四种等待语句格式称为超时等待语句,在此语句中定义了一个时间段,从执行到WAIT语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。用法示例如下:WAIT FOR 20ns;表示执行到该语句时需等待20ns后再继续执行下一条语句。一般地,只有WAIT UNTIL格式的等待语句可以被综合器接受。其余语句格式在VHDL语句中使用,只能用于仿真。4.1 VHDL的顺序语句4.1.7 WAIT语句第36页/共155页WAIT UNTIL语句有以下三种表达方式: WAIT UNTIL 信号=Value;WAIT UNITL 信号EVENT AND 信号=Value;WAIT UNTIL NOT 信号STABLE AND 信号=Value;用法示例如下:WAIT UNTIL clock=1;WAIT UNITL rising_edge(clock);WAIT UNTIL NOT clockSTABLE AND clock=1;WAIT UNTIL clock=1AND clockEVENT;以上四条WAIT UNTIL语句都是表示在时钟上升沿结束挂起重新启动程序。4.1 VHDL的顺序语句4.1.7 WAIT 语句第37页/共155页【例4.8】利用WAIT UNTIL语句实现四个数求平均值LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY TWN IS PORT(A: IN STD_LOGIC_VECTOR(5 DOWNTO 0); CLK: IN STD_LOGIC; S: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END TWN; 4.1 VHDL的顺序语句4.1.7 WAIT语句第38页/共155页ARCHITECTURE ATWN OF TWN IS SIGNAL AVE: STD_LOGIC_VECTOR(5 DOWNTO 0); BEGIN PROCESS BEGIN WAIT UNTIL CLK=1; AVE=A; WAIT UNTIL CLK=1; AVE=A+AVE; WAIT UNTIL CLK=1; AVE=A+AVE; WAIT UNTIL CLK=1; AVE=A+AVE; WAIT UNTIL CLK=1; S=CONV_STD_LOGIC_VECTOR(CONV_INTEGER(AVE/4); END PROCESS;END ATWN;4.1 VHDL的顺序语句4.1.7 WAIT语句第39页/共155页【例4.9】利用WAIT_UNTIL语句实现JK触发器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY JKFF IS PORT(J,K,CLK :IN STD_LOGIC; Q: OUT STD_LOGIC);END;ARCHITECTURE ONE OF JKFF IS SIGNAL TEMP: STD_LOGIC;BEGIN PROCESS BEGIN WAIT UNTIL(CLKEVENT AND CLK=1); TEMP=(J AND (NOT TEMP) OR (NOT K) AND TEMP); END PROCESS;Q=TEMP;END;4.1 VHDL的顺序语句第40页/共155页4.1.8 ASSERT语句ASSERT(断言)分为顺序断言语句和并行断言语句。断言语句的书写格式为 :ASSERT 条件表达式REPORT 出错信息SEVERITY 错误级别; 当程序执行到断言语句时,首先对“条件表达式”进行判别,如果条件表达式为“TRUE”,则跳过断言语句向下执行;如果条件表达式为“FALSE”,则表示出错,输出错误信息和错误等级报告。4.1 VHDL的顺序语句第41页/共155页(1)顺序断 言语句顺序断言语句只能用于进程、函数和过程仿真、调试中的人机对话。【例4.10】见右LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY RSFF2 IS PORT(S,R:IN STD_LOGIC; Q,QF:OUT STD_LOGIC);END RSFF2;ARCHITECTURE bhv OF RSFF2 ISBEGIN PROCESS(S,R) VARIABLE D:STD_LOGIC; BEGIN ASSERT NOT (R=1AND S=1) REPORT both R and S equal to 1 SEVERITY Error; IF R=1AND S=0 THEN D:=0; ELSIF R=0AND S=1 THEN D:=1; END IF; Q=D;QF=NOT D; END PROCESS;END bhv;4.1 VHDL的顺序语句第42页/共155页【例4.11】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY TEST IS PORT(RESET:IN STD_LOGIC:=0); BEGIN ASSERT RESET=1 REPORT Reset Active! SEVERITY ERROR;END ENTITY TEST;ARCHITECTURE example OF TEST IS BEGIN ASSERT FALSE REPORT Example message SEVERITY NOTE;END example;(2)并行断言语句 并行断言语句可以放在任何一个要观察、调试的点上。 把断言语句放在一个单独进程中描述叫断言进程。作为并行断言语句的断言进程与结构体内的其他进程是并列的,但断言语句或断言进程不对任何信号进行赋值操作,所以也被称为被动进程。4.1 VHDL的顺序语句第43页/共155页4.1.9 REPORT语句REPORT语句的书写格式为: 标号:REPORT 报告信息错误级别;REPORT语句的全部语义可由与之等价的顺序断言语句来解释,下面给出的两个语句是等价的:(a) (b)REPORT “OK!”; ASSERT FALSE REPORT“OK!” SEVERITY NOTE;4.1 VHDL的顺序语句第44页/共155页【例4.12】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY RSFF2 IS PORT(S,R:IN STD_LOGIC; Q,QF:OUT STD_LOGIC);END RSFF2;ARCHITECTURE bhv OF RSFF2 ISBEGIN PROCESS(S,R) VARIABLE D:STD_LOGIC; BEGIN IF R=1AND S=1THEN REPORT BOTH R AND S IS 1;-错误信息 ELSIF R=1AND S=0 THEN D:=0; ELSIF R=0AND S=1 THEN D:=1; END IF; Q=D;QF实参表达式实参表达式,形参名形参名=实参表达式实参表达式);一个过程的调用将分别完成以下三个步骤:将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的 形参;执行这个过程;将过程中IN和INOUT模式的形参值返回给对应的实参。第46页/共155页【例4.13】程序包源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE MYUSE ISPROCEDURE jfq(DIN1 :IN INTEGER RANGE 0 TO 31; DIN2: IN INTEGER RANGE 0 TO 31; DOUT: OUT INTEGER RANGE 0 TO 31);END MYUSE; PACKAGE BODY MYUSE IS PROCEDURE jfq(IND1,IND2 :IN INTEGER RANGE 0 TO 31; VARIABLE DOUT:OUT INTEGER RANGE 0 TO 31) IS BEGIN DOUT:=DIN1+DIN2; END jfq; END MYUSE;4.1 VHDL的顺序语句4.1.10 子程序调用语句第47页/共155页调用过程的源程序LIBRARY IEEE;USE IEEE,STD_LOGIC_1164.ALL;USE WORK.MYUSE .ALL;ENTITY CALL_PROCEDURE IS PORT(D1: IN INTEGER RANGE 0 TO 31; D2: IN INTEGER RANGE 0 TO 31; FOUT:OUT INTEGER RANGE 0 TO 31);END;ARCHITECTURE ONE OF CALL_PROCEDURE ISBEGIN PROCESS(D1,D2) VARIABLE FO: INTEGER RANGE 0 TO 31; BEGIN Jfq(D1,D2,FO); FOUT=FO; END PROCESS;END;4.1 VHDL的顺序语句4.1.10 子程序调用语句第48页/共155页【例4.14】在结构体内定义过程例4.13中,首先在程序包MYUSE中定义了一个求两个数相加运算的过程,供调用;让后在调用程序CALL_PROCEDURE.VHD中,用USE WORK.MYUSE.ALL库语句调用过程jfq(DIN1,DIN2,DOUT);被调用中的形参名与调用语句中的实参表达式的对应关系采用位置关联法,(D1,D2,FO)为实参表达式。4.1 VHDL的顺序语句第49页/共155页LIBRARY IEEE; -【例4.14】在结构体内定义过程USE IEEE.STD_LOGIC_1164.ALL;ENTITY PROCEDURE 2 IS PORT(DIN1 :IN INTEGER RANGE 0 TO 31; DIN2 :IN INTEGER RANGE 0 TO 31; DOUT :OUT INTEGER RANGE 0 TO 31);END;ARCHITECTURE TWO OF PROCEDURE2 IS PROCEDURE jfq(D1,D2:IN INTEGER RANGE 0 TO 31; VARIABLE FOUT:OUT INTEGER RANGE 0 TO 31) IS BEGIN FOUT:=D1+D2; END;BEGIN PROCESS VARIABLE FO:INTEGER RANGE 0 TO 31; BEGIN jfq(DIN1,DIN2,FO); DOUT=FO; END PROCESS;END;4.1 VHDL的顺序语句第50页/共155页4.1.11 RETURN和NULL语句(1)RETURN语句RETURN(返回)语句只能用在子程序体中,用来结束当前子程序体的执行。RETURN语句的书写格式为: RETURE 表达式;当“表达式”缺省时,返回语句只能用于过程,它只是结束过程,并不返回任何值;当有“表达式”时,只能用于函数,并且必须返回一个值。4.1 VHDL的顺序语句第51页/共155页 例4.15是一过程定义程序,它将完成一个R-S触发器的功能。其中RETURN语句只用于当信号R和S同时为1时结束过程,并不返回任何值。【例4.15】PROCEDURE RS(R,S:IN STD_LOGIC; Q,NQ:INOUT STD_LOGIC)ISBEGINIF S=1AND R=1THEREPORT“FORBIDDEN STATE:S AND R ARE EQUAL TO 1”; RETURN; ELSE Q=S AND NQ AFTER 5ns; NQtmp:=rega AND regb; WHEN “101”=tmp:=rega OR regb; WHEN“110”=tmp:=NOT rega; WHEN OTHERS=NULL;END CASE;当CASE语句中的表达式Opcode为 “001”、“101”和“110”时,程序分别执行与、或、非运算;当出现其他值时,不做任何操作。4.1 VHDL的顺序语句4.1.11 RETURN和NULL语句第54页/共155页 每个并行语句代表一个功能单元,一个或多个功能单元组成一个结构体,并行语句在结构体中的使用格式如下:ARCHITECTURE 结构体名 OF 实体名 IS 说明语句; BEGIN 并行语句; 并行语句;END ARCHITECTURE 结构体名; 结构体中的可综合的并行语句主要有以下几种:并行信号赋值语句、进程语句、块语句、条件信号赋值语句、元件例化语句、生成语句和并行过程调用语句。4.2 VHDL的并行语句第55页/共155页4.2.1 进程(PROCESS)语句 进程语句(PROCESS)是并行处理语句,即各个进程是同时处理的,在一个结构体中多个进程语句是同时并发运行的。PROCESS语句具有如下特点:(1)进程结构内部的所有语句都是顺序执行的。(2)多进程之间是并行执行的,并可访问结构体或实体中所定义的信号。(3)进程的启动是由进程标识符PROCESS后的敏感信号表所标明的信号来触发的,也可以用WAIT等待语句实现触发。(4)各进程之间的通信是由信号来传递的。4.2 VHDL的并行语句第56页/共155页4.2.1 进程(PROCESS)语句PROCESS语句的书写格式为:进程名:PROCESS敏感信号表 变量说明语句; BEGIN 顺序描述语句; END PROCESS 进程名;PROCESS语句结构是由三部分组成的,即变量说明部分、顺序描述语句部分和敏感信号表。4.2 VHDL的并行语句第57页/共155页4.2.1 进程(PROCESS)语句(1)变量说明部分主要用于定义一些局部变量,包括数据类型、常数、属性和子程序等。(2)顺序描述语句部分包括赋值语句、进程启动语句、子程序调用语句、顺序描述语句(包括IF语句、CASE语句、LOOP语句和NULL语句)和跳转语句(包括NEXT语句和EXIT语句)等。(3)进程语句中的敏感信号表和WAIT语句的作用一致,都是进程启动、触发的条件。但需要注意,在进程语句中,敏感信号表和WAIT语句不能共同存在于一个进程之中。4.2 VHDL的并行语句第58页/共155页4.2.1 进程(PROCESS)语句ARCHITECTURE ART OF STAT IS -【例4.17】不含敏感信号表的进程示例BEGIN P1:PROCESS -该进程未列出敏感信号,需要靠WAIT语句来启动 BEGIN WAIT UNITL CLOCK; -等待CLOCK激活进程 IF(DRIVER=1)THEN -当DRIVER为高电平时进入CASE语句 CASE OUTPUT IS WHEN S1=OUTPUTOUTPUTOUTPUTOUTPUT=S1; END CASE; END IF;END PROCESS P1;END ART;4.2 VHDL的并行语句第59页/共155页4.2.1 进程(PROCESS)语句【例4.18】同步进程的敏感信号表中只有时钟信号PROCESS(CLOCK)BEGIN IF(CLOCK=1AND CLOCKEVENT) THEN IF RESET=1 THEN -检测到复位信号RESET DATA=“00”; -复位信号有效,执行复位操作 ELSE DATA=IN_DATA; -无复位信号,执行赋值操作 END IF; END IF;END PROCESS;4.2 VHDL的并行语句第60页/共155页4.2.1 进程(PROCESS)语句【例4.19】异步进程的敏感信号表中除时钟信号外还有其他信号PROCESS(CLK,RESET) -定义了2个敏感信号, CLK, BEGIN -RESET任一改变,进程启动 IF RESET=1 THEN DATA=“00”; ELSIF CLK=1AND CLKEVENT THEN DATA=IN_DATA; END IF;END PROCESS;4.2 VHDL的并行语句第61页/共155页4.2.2 并行信号赋值语句 并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句。(1)简单信号赋值语句其语句的书写格式如下: 赋值目标=表达式;其中,“赋值目标”的数据对象必须是信号,它的数据类型必须与“表达式”的数据类型一致。4.2 VHDL的并行语句第62页/共155页用法示例如下: ARCHITECTURE curt OF bc1 IS SIGNAL s1,e,f,g,h:STD_LOGIC;BEGIN output1=a AND b; output2=c+d; g=e OR f; h=e XOR f; s1=g;END ARCHITECTURE curt;以上结构体中的5条信号赋值语句的执行是并行发生的。4.2 VHDL的并行语句4.2.2 并行信号赋值语句第63页/共155页(2)条件信号赋值语句 条件信号赋值语句也是并行描述语句,它可以根据不同的条件将不同的表达式的值代入目标信号中。其语句的书写格式如下: 赋值目标信号=表达式 WHEN 赋值条件 ELSE 表达式 WHEN 赋值条件 ELSE 表达式;4.2 VHDL的并行语句4.2.2 并行信号赋值语句第64页/共155页【例4.20】ENTITY condsigm ISPORT(high, mid, low : IN STD_LOGIC; q : OUT INTEGER);END condsigm;ARCHITECTURE maxpld OF condsigm ISBEGINQ =3 WHEN high = 1 ELSE 2 WHEN mid = 1 ELSE 1 WHEN low = 1 ELSE 0; END maxpld;上例中,由于条件测试的顺序性,第一子句具有最高赋值优先级,第二句其次,第三句最后。4.2 VHDL的并行语句4.2.2 并行信号赋值语句第65页/共155页(3)选择信号赋值语句 选择信号赋值语句类似于CASE语句,它对表达式进行测试,当表达式取值不同时,将不同的值代入目标信号中。语句的书写格式如下: WITH 选择表达式 SELECT赋值目标信号=表达式 WHEN 选择值, 表达式 WHEN 选择值, 表达式 WHEN 选择值;4.2 VHDL的并行语句4.2.2 并行信号赋值语句第66页/共155页4.2.2 并行信号赋值语句【例4.21】ENTITY selsig ISPORT(d0, d1, d2, d3: IN STD_LOGIC; s: IN INTEGER RANGE 0 TO 3; output: OUT STD_LOGIC);END selsig;ARCHITECTURE maxpld OF selsig IS BEGIN WITH s SELECT- 建立一个4选1多路选择器 output 连接端口名 -元件端口的映射 ,端口名称=连接端口名);其用法示例如下:U1:ADD GENERIC MAP(N=4) -U1是例化名称,ADD是例化元件 名,在当前层次给N赋4PORT MAP(X,Y,Z,CARRY); -采用位置映射关系4.2 VHDL的并行语句4.2.4 元件例化(COMPONENT)语句第73页/共155页(2)元件例化语句元件声明类似实体声明,其用法示例如下: COMPONENT ADD GENERIC(N:POSITIVE); -声明常数N取正整数 PORT(X,Y:IN BIT_VECTOR(N-1 DOWNTO 0); Z:OUT BIT_VECTOR(N-1 DOWNTO 0); CARRY:OUT BIT); -进位输出 END COMPONENT;上例对加法器的输入输出数据宽度做了声明。元件声明可以在结构体、程序包及块中进行。4.2 VHDL的并行语句4.2.4 元件例化(COMPONENT)语句第74页/共155页 元件例化语句中所定义的例化元件的端口名与当前系统的连接端口名的接口表达有两种方式:一种是名字关联方式。 另一种是位置关联方式。若使用这种方式,例化元件的端口名和关联符号“=”都可以省去,在PORT MAP子句中,只要列出当前系统中的连接端口名就行了,但要求连接端口名的排列方式与所需例化的元件端口定义的端口名一一对应。 其用法示例如下: 名字关联方式:PORT MAP 低层次端口名=当前层次端口名, 低层次端口名=当前层次端口名,; 位置关联方式:PORT MAP(当前层次端口名,当前层次端口 名,);4.2 VHDL的并行语句4.2.4 元件例化(COMPONENT)语句第75页/共155页LIBRARY IEEE; -【例4.23】USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHIFT_REGISTER IS PORT(A,CLK: IN STD_LOGIC; B: OUT STD_LOGIC);END SHIFT_REGISTER;ARCHITECTURE FOUR_BIT_SHIFT_REGISTER OF SHIFT_REGISTER IS COMPONENT DFF PORT(A,CLK: IN STD_LOGIC; B:OUT STD_LOGIC); END COMPONENT; SIGNAL X:STD_LOGIC_VECTOR(0 TO 4);BEGIN X(0)=A; DFF1: DFF PORT MAP(X(0),CLK,X(1); DFF2: DFF PORT MAP(X(1),CLK,X(2); DFF3: DFF PORT MAP(X(2),CLK,X(3);DFF4: DFF PORT MAP(X(3),CLK,X(4);B=X(4); END FOUR_BIT_SHIFT_REGISTER;4.2 VHDL的并行语句4.2.4 元件例化(COMPONENT)语句第76页/共155页 4.2.5 块(BLOCK)语句BLOCK语句可以看作是结构体中用于把许多并行语句包装在一起的子模块,它常用于结构体的结构化描述。BLOCK语句的书写格式如下: 块标号:BOLCK(块保护表达式) 接口说明 类属说明 BEGIN 并行语句 END BLOCK 块标号;4.2 VHDL的并行语句第77页/共155页 BLOCK语句可以通过类属子句(GENERIC)、类属映射子句(GENERIC MAP)、接口子句(PORT)和接口映射子句(PORT MAP)来实现信号在块内外的传输以及参数的定义。 BLOCK语句是可以嵌套的,内层的BLOCK语句可以使用外层BLOCK所定义的信号,外层BLOCK不能使用内层BLOCK语句定义的信号。4.2 VHDL的并行语句 4.2.5 块(BLOCK)语句第78页/共155页ENTITY half IS -【例4.24:半加器程序设计】 PORT(a,b:IN BIT; s,c:OUT BIT);END ENTITY half;ARCHITECTURE adder1 OF half IS -结构体1的名字为adder1BEGIN s=a XOR b; c=a AND b;END adder1;ARCHITECTURE adder2 OF half IS -结构体2的名字为adder2 BEGIN4.2 VHDL的并行语句 4.2.5 块(BLOCK)语句第79页/共155页Example:BLOCK -块名example PORT(a,b:IN BIT; -端口接口说明语句 s,c:OUT BIT); PORT MAP(a,b,s,c); -信号的映射 BEGIN P1:PROCESS(a,b) BEGIN s=a XOR b; END PROCESS P1; P2:PROCESS(a,b) BEGIN c=a AND b; END PROCESS P2; END BLOCK example;END adder2;4.2 VHDL的并行语句第80页/共155页4.2.5 块(BLOCK)语句嵌套形式的BLOCK语句用法示例如下:b1:BLOCK SIGNAL s1:BIT;BEGIN s1=a AND b; b2:BLOCK SIGNAL s1:BIT; BEGIN s2=c AND d; b3:BLOCK BEGIN z=s2; END BLOCK b3; END BLOCK b2; y=s1;END BLOCK b1;在嵌套形式的BLOCK语句中注意不同层次的块中定义的信号的有效范围。4.2 VHDL的并行语句第81页/共155页4.2.6 生成(GENERATE)语句 生成(GENERATE)语句又叫重复部件调用语句,它有赋值作用,可生成与指定元件或单元电路完全相同的一组并行元件或单元电路组结构。生成语句的书写格式有以下两种:(1)使用FOR语句的生成语句格式 标号:FOR 循环变量 IN 取值范围 GENERATE 说明部分 BEGIN 并行语句 END GENERATE标号;4.2 VHDL的并行语句第82页/共155页(2)使用IF语句的生成语句格式 标号:IF 条件 GENERATE 说明部分 BEGIN 并行语句 END GENERATE 标号;IF-GENERATE语句用于描述一个结构中的例外情形,例如边界发生的特殊情况。 4.2 VHDL的并行语句4.2.6 生成(GENERATE)语句第83页/共155页这两种语句格式都由以下4部分组成:生成方式:利用FOR语句结构或IF语句结构,用于规定并行语句的复制方式。说明部分:对元件数据类型、子程序和数据对象作一些局部说明。并行语句:生成语句结构中的并行语句是用来“复制”的基本单元,主要包括元件、进程语句、块语句、并行过程调用语句、并行信号赋值语句甚至生成语句。这表示生成语句允许存在嵌套结构,因而可以用于生成元件的多维阵列结构。标号:生成语句中的标号并不是必须的,但如果在嵌套生成语句结构中就是很重要的。4.2 VHDL的并行语句4.2.6 生成(GENERATE)语句第84页/共155页LIBRARY IEEE; -例4.25元件例化语句实现4位移位寄存器的设计USE IEEE.STD_LOGIC_1164.ALL;ENTITY shift_register IS PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC);END shift_register;ARCHITECTURE example OF shift_register IS COMPONENT DFF -元件调用DFF PORT(d,clk:IN BIT; Q:OUT BIT);END COMPONENT;SIGNAL X:STD_LOGIC_VECTOR(0 TO 4);BEGIN X(0)=a; DFF1:DFF PORT MAP(X(0),CLK,X(1); DFF2:DFF PORT MAP(X(1),CLK,X(2); DFF3:DFF PORT MAP(X(2),CLK,X(3); DFF4:DFF PORT MAP(X(3),CLK,X(4);b=X(4);END example;4.2 VHDL的并行语句4.2.6 生成(GENERATE)语句第85页/共155页 例4.25是利用元件例化语句设计的4位移位寄存器,其电路结构如图4.2所示。CLKDQDQDQbA图4.2 例4.25的RTL电路DQX(0)X(1)X(2)X(3)4.2 VHDL的并行语句4.2.6 生成(GENERATE)语句第86页/共155页【例4.26】 GENERATE语句设计4位移位寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shift_register IS PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC);END shift_register;ARCHITECTURE example OF shift_register IS-接下页4.2 VHDL的并行语句4.2.6 生成(GENERATE)语句第87页/共155页COMPONENT DFF -元件调用DFF PORT(d,clk:IN BIT; q:OUT BIT);END COMPONENT; SIGNAL X:STD_LOGIC_VECTOR(0 TO 4); BEGIN X(0)=a; Register1:FOR i IN 0 TO 3 GENERATE Dffx:DFF PORT MAP(X(i),clk,Z(i+1); -端口映射 END GENERATE; b=0 AND i/=(n-1) GENERATEDFFX:DFF PORT MAP(X(i),clk,X(i+1); END GENERATE U2; U3:IF (i=(n-1) GENERATEDFFX:DFF PORT MAP(X(i),clk,b); END GENERATE U3; END GENERATE;END example;4.2 VHDL的并行语句第90页/共155页VHDL文字主要包括数值和标识符。数值型文字主要有数字型、字符串型和位串型 (1)数字型文字 整数:整数都是十进制的数 。如:2, 476, 0, 15E2(=1500), 45_234_287(=45234287)实数:实数也都是十进制的数,但必须带有小数点 如:1.335, 88_670_551.453_909(=88670551.453909), 1.0, 44.99E-2(=0.4499)4.3.1 VHDL文字规则4.3 VHDL语言要素第91页/共155页以数值基数表示的文字:用这种方式表示的数由五个部分组成。第一部分是用十进制数标明数制进位的基数;第二部分是数值隔离符号“#”;第三部分是表达的数;第四部分是指数隔离符号“#”;第五部分是用十进制表示的指数部分,举例如下: SIGNAL d1,d2,d3,d4,d5:INTEGER RANGE 0 TO 255;d1=10#170#; -十进制表示,等于170d2=2#1111_1110#; -二进制表示,等于254d3=8#376#; -八进制表示,等于254d4=16#E#E1; -十六进制表示,等于2#1110000#,等于224 物理量文字:VHDL不接受此类文字,如:60s(60秒), 100m(100米), k(千欧姆), 177A(177安培)4.3 VHDL语言要素第92页/共155页(2)字符及字符串型文字 字符是用单引号括起的ASCI
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!