第5章第2节-VHDL顺序语句课件1_第1页
第5章第2节-VHDL顺序语句课件1_第2页
第5章第2节-VHDL顺序语句课件1_第3页
第5章第2节-VHDL顺序语句课件1_第4页
第5章第2节-VHDL顺序语句课件1_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 VHDL设计进阶5.2 VHDL顺序语句顺序描述与并行描述语句并行语句:在结构体中的执行都是同时进行的,没有执行顺序的先、后之分;顺序语句:每一条语句的执行顺序与其书写顺序对应;注意:顺序语句综合后,映射为实际的门电路,系统一上电,这些门电路都同时工作;因此顺序语句并不意味者相应地硬件结构也有相同地顺序性;顺序语句只能出现在进程(Process)和子程序(函数和过程)中VHDL顺序语句6类基本顺序语句:赋值语句转向控制语句(IF、CASE、LOOP、NEXT、EXIT)等待语句(WAIT)子程序调用语句返回语句(RETURN)空操作语句(NULL)1 赋值语句赋值语句信号赋值变量赋值赋

2、值目标、赋值符号、赋值源信号赋值变量赋值符号=:=位置结构体内定义的进程或子程序中操作过程进程的最后才赋值立即赋值ARCHITECTURE TEST OF FUZHI ISsignal A,B:integer range 0 to 255; -声明信号A、B的位置begin process(reset,clock) variable C: integer range 0 to 255; -声明变量C的位置 begin if reset=1 then -系统复位时对A、B、C赋值 A=0; B=2; -对信号赋值用”=” C:=0; -对变量赋值用”:=” elsif (clockevent a

3、nd clock=1)then C:=C+1; A=C+1; B=A+2; end if; end process; numA=A; -信号可在PROCESS外使用 numB=B;END;在进程中,变量赋值语句一旦被执行,目标变量立即被赋值,在执行下一条语句时,该变量的值为上一句新赋的值;信号的赋值语句即使被执行,也不会使信号立即发生代入, 下一条语句执行时,仍使用原来的信号值(信号是在进程挂起时才发生代入的)。赋值目标标识符赋值目标及数组单元素赋值目标;段下标元素赋值目标及集合块赋值目标; 标识符赋值目标 以简单的标识符作为被赋值的信号或变量名;数组单元素赋值目标数组类信号或变量名(下标名)

4、; v1:=1; v2:=1; svec(0)=v1; svec(1)=v2;标识符赋值及数组单元素赋值段下标元素赋值目标及集合块赋值目标;A(1 TO 2):=“10”;A(3 DOWNTO 0):=“1011”; s=“0100” (a,b,c,d)e,3=f,1=g(0),0=g(1):=h集合块赋值(位置关联及名字关联赋值) 数组类信号或变量(下标1 TO/DOWNTO 下标2) 对目标中的每个元素进行赋值的方式段下标赋值(注意TO及DOWNTO)2 转向控制语句IFCASELOOPNEXTEXITIF语句IF 条件 THEN 语句 END IF;格式1:若条件成立,则执行THEN与E

5、ND IF间的语句,否则结束END IF;IF 条件 THEN 语句 ELSE 语句 END IF;格式2:若条件成立,则执行THEN与ELSE间的语句;反之,执行ELSE与END IF间的语句;IF语句的二选择控制IF语句的多选择控制IF 条件1 THEN 语句ELSIF 条件2 THEN 语句 . ELSE 语句 END IF;格式3:自上而下逐一判断条件式是否成立。若条件成立,则执行相应的语句,并不再判断其它条件式,直接结束IF语句;entity eqcomp4_if is port( a,b:in std_logic_vector(3 downto 0); equals: out st

6、d_logic);end eqcomp4_if; architecture behave of eqcomp4_if isbeginprocess(a,b)begin equals=0; if a=b then equals b1 THEN q1 = 1;ELSIF a1 b1 THEN q1 b1 THEN q1 = 1;ELSE q1 = 0;END IF;END PROCESS;END ARCHITECTURE one;a1=b1 ?12条件不完整12因此必须在所有情况下指定输出值。在没有指定输出值的条件下,综合器可能误以为设计者希望存储数据而引入锁存器。architecture beh

7、ave of encoder isbeginprocess(en,i)begin if en=1 then if i(7)=1 then a=111; elsif i(6)=1 then a=110; elsif i(5)=1 then a=101; elsif i(4)=1 then a=100; elsif i(3)=1 then a=011; elsif i(2)=1 then a=010; elsif i(1)=1 then a=001; elsif i(0)=1 then a=000; else a=000; end if; else a=000; end if;end proces

8、s;end;所有需要读入的信号都必须放在敏感信号参数表中此处的ELSE是否为必须的?library ieee;use ieee.std_logic_1164.all;entity mux4 isport(a,b,c,d:in std_logic_vector(3 downto 0); s :in std_logic_vector(1 downto 0); x :out std_logic_vector(3 downto 0);end mux4;architecture behave of mux4 isbegin process(a,b,c,d) begin if(s=00)then x=a;

9、 elsif(s=01)then x=b; elsif(s=10)then x=c; else x 语句A; WHEN 值2 = 语句B; WHEN OTHERS = 语句C; END CASE;这里的=不是关系运算符,仅描述:值和对应执行语句的对应关系,相当于THEN的作用选择值可以有4种不同的表达方式单个普通数值数值选择范围,如(2 to 4)并列数值,如2|4混合方式几种容易发生的错误-缺少when 引导的条件语句 case a is end case;-没有将所有条件中有可能出现的情况全部列出来-选择值中的值有重叠entity case_mux41 isport(a,b,c,d:in

10、std_logic; sel:in std_logic_vector(1 downto 0); z: out std_logic);end;architecture dataflow of case_mux41 isbeginprocess(sel,a,b,c,d)begin case sel is when 00=zzzzz=X; end case;end process;end;4选1多路选择器CASE 输 入输 出G1G2A+G2BcbaY(7)Y(6)Y(5)Y(4)Y(3)Y(2)Y(1)Y(0)0XXXX11111111X1XXX11111111100001111111010001

11、111111011001011111011100111111011110100111011111010111011111101101011111110111011111117/25/2022CASElibrary ieee;use ieee.std_logic_1164.all;entity decode_3to8 is Port ( a,b,c,G1,G2A,G2B:in std_logic; y:out std_logic_vector(7 downto 0);end decode_3to8;architecture dec_arch of decode_3to8 is signal in

12、data: std_logic_vector(2 downto 0); begin indatayyyyyyyyy=XXXXXXXX; end case; else ya10; -当a大于10时跳出循环 END LOOP L2;2.FOR_LOOP语句语句格式:标号:FOR 循环变量IN 循环次数范围LOOP 顺序语句;END LOOP 标号 ;注意:循环变量是一个临时变量,属LOOP语句的局部变量,不必事先定义,它由LOOP语句自动定义;循环变量只能作为赋值源,不能被赋值;在LOOP范围内不要再使用与此循环变量同名的标识符;循环次数范围规定LOOP语句中的顺序语句被执行的次数。每执行一次,循

13、环变量自动增1。例如:用LOOP语句实现19的累加器计算: sum:=0; FOR i IN 1 TO 9 LOOP sum:=sum+i; END LOOP;library ieee;use ieee.std_logic_1164.all;entity p_check is port(a:in std_logic_vector(7 downto 0); y:out std_logic);end;architecture behave of p_check issignal tmp:std_logic;begin process(a) begin tmp=0; for n in 0 to 7

14、loop tmp=tmp xor a(n); end loop; y=tmp; end process;end; tmp:变量8位奇偶校验逻辑电路VARIABLE length: INTEGER RANGE 0 TO 15;FOR i IN 0 to length LOOPEND LOOP;描述是否正确需用具体的数值表示3.WHILE_LOOP语句 循环标号:WHILE 条件 LOOP 顺序处理语句 END LOOP循环标号;若条件为”真”,则进行循环;若为”假”,则结束循环注意:没有循环变量和循环次数,也没有自动递增功能,只给出了执行循环语句的条件;条件可以是任何布尔表达式;当条件为TRUE

15、时,进行循环;当条件为FALSE时,跳出循环;VHDL综合器支持WHILE语句的前堤是,LOOP的结束条件值必须是在综合时就可以决定。综合器不支持无法确定循环次数的LOOP语句。例如:用LOOP语句实现19的累加器计算: i:=1; sum:=0; WHILE (i10) LOOP sum:=sum+i; i:=i+1; END LOOP; process(a) variable i: integer :=0; begin tmp=0; while i8 loop tmp=tmp xor a(i); i:=i+1; end loop; yf); S3:b(k+8):=0; K:=K+1; NE

16、XT LOOP L_Y; NEXT LOOP L_X;.EXIT 语句EXIT;EXIT LOOP 标号;EXIT LOOP 标号 WHEN 条件表达式;其跳转的方向是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)=1 AND b(i)=0)THEN a_less_then_b=FALSE; EXIT; ELSIF(a(i)=0 AND b

17、(i)=1)THEN a_less_then_b=TRUE; EXIT; ELSE NULL; END IF;END LOOP;比较a,b的大小5.2.3 WAIT 语句当执行到WAIT语句时,运行程序被挂起,直到满足此语句设置的结束挂起条件后,将重新开始执行进程或过程中的程序;已列出敏感量的进程中不能使用任何形式的WAIT语句;WAITON 信号表UNTIL 条件表达式FOR 时间表达式;单独的WAIT,未设置停止挂起的条件,表示永远挂起。WAIT ON信号,信号,即敏感信号等待语句,当敏感信号变化时,结束挂起。例如:WAIT ON a,b;WAIT UNTIL条件表达式,即条件等待语句,当

18、条件表达式中所含的信号发生了变化,并且条件表达式为真时,进程才能脱离挂起状态,继续执行此语句后面的语句。 例如:WAIT UNTIL(x*10)100);WAIT FOR 时间表达式,直到指定的时间到时,挂起才结束。 例如:WAIT FOR 20ns;多条件WAIT语句,即上述条件中有多个同时出现,此时只要多个条件中有一个成立,则终止挂起。process(a,b) process begin begin y=a and b; y=a and b;end process; wait on a,b; end process; process(a,b) begin y=a and b; wait o

19、n a,b; end process;已列出敏感量的进程中不能使用WAIT语句PROCESSBEGIN rst_loop:LOOP WAIT UNTIL clock=1 AND clockEVENT; NEXT rst_loop WHEN (rst=1); x=a; WAIT UNTIL clock=1 AND clockEVENT; NEXT rst_loop WHEN (rst=1); yNULL; END CASE; END IF; END PROCESS;5.2.5 其它语句属性测试项目名属性标识符信号类属性STABLE 、EVENT;数据区间类属性RANGE、REVERSE_RANG

20、E;数值类属性LEFT、RIGHT、HIGH、LOW;数组属性LENGTH;信号类属性EVENT:如果在当前一个相当小的时间间隔内,事件发生了,那么函数返回一个“真”的布尔量;STABLE:刚好与EVENT 相反;在一个指定的时间间隔内,无事件发生,那么函数返回一个“真”的布尔量;数据区间类RANGE(n)返回一个数据区间;REVERSE_RANGE(n)返回一个次序颠倒的数据区间;如:若属性RANGE返回的区间0 TO 15,那么使用REVERSE_RANGE返回的区间是15 DOWNTO 0数值类属性数值类属性用来得到数组、块或者一般数据的有关值;LEFT-得到数据类或子类区间的最左端的值

21、RIGHT-得到数据类或子类区间的最右端的值HIGH-得到数据类或子类区间的高端值(max)LOW-得到数据类或子类区间的低端值(min)数组属性LENGTH:用该属性将得到一个数组的长度ASSERT语句用于程序调试、时序仿真时的人机对话,也属于不可综合语句,综合时被忽略而不会生成逻辑电路。ASSERT 条件表达式 REPORT信息 SEVERITY级别若条件式为真,则任何事都不做;若条件式为假,则输出错误信息和错误严重级别;出错级别共有5 种: Note、Warning、Error、Failure、Fatal ;若缺少,则默认级别为ERROR;用双引号括起来在VHDL 模型的模拟过程中,一旦

22、断言语句的条件为假,则发送消息并将出错级别发送给模拟器。通常可以设置一个中止模拟器运行的出错级别,一般默认的中止运行的出错级别为Failure。 我们来看一个例子: assert (s_cyi(DWIDTH-1)/4) = 0) and (s_ovi = 0) and (s_qutnt=conv_std_logic_vector(v_quot,DWIDTH) and (s_rmndr=conv_std_logic_vector(v_remd,DWIDTH) report ERROR in division! severity failure; 断言的条件有4 个并且是与的关系,只要其中一个条件

23、不成立则整个表达式为假,断言成立。如果断言成立将输出“ERROR in division!“这个消息。并且通知模拟器出错级别为failure,这一般会停止模拟。这个断言实际是在对结果进行验证。再来看一个例子:assert false report * & IMAGE(DWIDTH) & BIT DIVIDER SEQUENCE FINISHED AT & IMAGE(now) & ! & * severity note; 断言的条件不是一个条件表达式,而直接是false。这说明只要程序执行到这里断言就一定会成立,送出消息。出错级别为note。architecture behav of rs_a

24、ssert is begin a:process(r,s) begin assert not (r=1 and s=1) report both r and s equal to 1 severity error; end process; b:process(r,s) variable d:std_logic:=0; begin if r=1 and s=0 then d:=0; elsif r=0 and s=1 then d:=1; end if; q=d;qf=not d; end process;end;REPORT语句报告有关信息的语句,本身不可综合;类似于ASSERT,区别是REPORT没有条件;REPORT 信息SEVERITY级别architecture behav of rs_report i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论