VHDL基本语句用法.ppt

上传人:小飞机 文档编号:5452175 上传时间:2023-07-08 格式:PPT 页数:74 大小:592KB
返回 下载 相关 举报
VHDL基本语句用法.ppt_第1页
第1页 / 共74页
VHDL基本语句用法.ppt_第2页
第2页 / 共74页
VHDL基本语句用法.ppt_第3页
第3页 / 共74页
VHDL基本语句用法.ppt_第4页
第4页 / 共74页
VHDL基本语句用法.ppt_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《VHDL基本语句用法.ppt》由会员分享,可在线阅读,更多相关《VHDL基本语句用法.ppt(74页珍藏版)》请在三一办公上搜索。

1、第10章 VHDL基本语句,一:主要内容:VHDL基本语句讲解 顺序语句 并行语句二:重点掌握:常用VHDL基本语句及应用,赋值语句,信号赋值语句,变量赋值语句,信号代入语句:格式:目的信号变量=信号变量表达式 例:a=b;,变量赋值语句:格式:目的变量:=表达式 例:c:=a+d,信号与变量的区别:(1)信号赋值可以有延迟时间,变量赋值无时间延迟(2)信号除当前值外还有许多相关值,如历史信息等,变量只有当前值 进程对信号敏感,对变量不敏感(3)信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见(4)信号可以看作硬件的一根连线,但变量无此对应关系。,10.1 顺序语句,IF 语句已

2、讲过,IF 条件 THEN END IF;,CASE语句,1)CASE语句的结构:CASE 表达式 ISWhen 选择值=顺序语句;When 选择值=顺序语句;.【WHEN OTHERS=】;END CASE;,2)多条件选择值的一般表达式:选择值|选择值,3)选择值 表达方式:(1)单个普通数值,如6。(2)数值选择范围,如(2 TO 4),表示取值为 2、3或4。(3)并列数值,如35,表示取值为3或者5。(4)混合方式,以上三种方式的混合。,4)CASE 语句举例,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux41 IS PORT(

3、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 z1 z1 z2 z3 z4=1;-当sel为815中任一值时选中 END CASE;END activ;,例【10.1】,CASE 语句病句举例,【例10.2】,LOOP语句,格式:LOOP标号:LOOP 顺序语句 END LOOP LOOP标号;,格式:LOOP标号:FOR 循环变量,IN 循环次数范围 LOOP 顺序语句 END

4、 LOOP LOOP标号;,见例1,见例2,见例3,1、单个LOOP语句,2、FOR_LOOP语句,10.15 NEXT 语句-跳出本次循环,1、格式:(1)NEXT;无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下次循环。(2)NEXT LOOP标号;-同(1)。(3)NEXT LOOP标号 WHEN 条件表达式;-条件表达式为TRUE,执行NEXT语句,进入跳转操作,否则继续向下执行。,2、注意:NEXT语句用于跳出本次循环 且控制内循环的结束.在多重循环中必加标号。,3、举例,例1,例2,EXIT语句-结束循环状态,1、格式:(1)EXIT;-结束本次循环(2)EXIT LOO

5、P标号;-同上(3)EXIT LOOP标号 WHEN 条件表达式;,2、举例,例 1,3、NEXT与 EXIT区别:NEXT语句是转向LOOP语句的起始点。EXIT 语句是转向LOOP语句的终点。,WAIT语句-等待语句,1)格 式:(1)WAIT;-功能:将程序挂起,直到满足条件。(2)WAIT ON 信号表;(3)WAIT UNTIL 条件表达式;(4)WAIT FOR 时间表达式;,2)举 例,见例1,见例2,【例3】,说明 1:一般只有WAIT_UNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用),WAIT_UNTIL语句三种表达方式:WAIT UNTIL

6、 信号=Value;-(1)WAIT UNTIL 信号EVENT AND 信号=Value;-(2)WAIT UNTIL NOT 信号STABLE AND 信号=Value;-(3),说明2:对应的硬件结构相同的时钟信号clock上跳沿应用的四条WAIT语句:WAIT UNTIL clock=1;WAIT UNTIL rising_edge(clock);WAIT UNTIL clock=1 AND clockEVENT;WAIT UNTIL NOT clock STABLE AND clock=1;,3)说 明,说明3:WAIT语句可用于Process 进程中的任何地方,已列出敏感信号的 P

7、rocess中不能用WAIT语句。,子程序调用语句,1、过程调用-就是执行一个给定名字和参数的过程。,1)格式:过程名(形参名=实参表达式,形参名=实参表达式);,2)一个过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;(2)执行这个过程;(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,3)举例,例1,【例2】,2、函数调用,函数调用与过程调用是十分相似的,不同之处:调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。,1)格式:FUNCTION 函数名(参数表)RETURN 数据类型;-函数首 FUNCTION

8、 函数名(参数表)RETURN 数据类型 IS-函数体,2)详细内容已讲过,返回语句(RETURN),1)格式:语句格式一:RETURN;-只用于结束过程,并不返回任何值。语句格式二:RETURN 表达式;-只用于函数,并返回一个值。,2)举例,例1 过程调用返回例子,例2 幻灯片 60函数调用返回例子,空操作语句(NULL),1)语句格式:NULL;,例:CASE Opcode IS WHEN 001=tmp:=rega AND regb;WHEN 101=tmp:=rega OR regb;WHEN 110=tmp:=NOT rega;WHEN OTHERS=NULL;END CASE;,

9、3)说明:在上例的CASE语句中,NULL用于排除一些不用的条件。等同:WHEN OTHERS=tmp:=rega;,2)举例:,10.2 并行语句,结构体中的并行语句种类:1、并行信号赋值语句(Concurrent Signal Assignments)。2、进程语句(Process Statements)。3、块语句(Block Statements)。4、条件信号赋值语句(Selected Signal Assignments)。5、元件例化语句(Component Instantiations),其中包括类属、配置语句。6、生成语句(Generate Statements)。7、并行过

10、程调用语句(Concurrent Procedure Calls)。,并行语句位置:ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END 结构体名;,并行信号赋值语句,1.简单信号赋值语句,格式:赋值目标=表达式,例: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 curt;注:例中的五条信号赋值语句的执行是并行发生的。,2.条件信号赋值语句,赋值目标=表达式1 WH

11、EN 赋值条件1 ELSE 表达式2 WHEN 赋值条件2 ELSE.表达式n;,1)格式:,2)举例:,【例1】ENTITY mux IS PORT(a,b,c:IN BIT;p1,p2:IN BIT;z:OUT BIT);END mux;ARCHITECTURE behv OF mux IS BEGIN z=a WHEN p1=1 ELSE b WHEN p2=1 ELSE c;END;,例1的逻辑电路图见 图1,3.选择信号赋值语句,WITH 选择表达式 SELECT 赋值目标信号=表达式1 WHEN 选择值1 表达式2 WHEN 选择值2.表达式n WHEN 选择值n;,1)格式:,2

12、)举例:例2,例3,块语句结构(BLOCK),块标号:BLOCK(块保护表达式)接口说明 类属说明 BEGIN 并行语句 END BLOCK 块标号;,1)格式:,#标号是必需的;#在对程序进行仿真时,BLOCK中的语句是并行执行的,与书写顺序无关。#一个BLOCK等价于一个结构体。,2)说明:,3)举例:,【例2】,块语句嵌套例子:【例3】,【例1】,并行过程调用语句,1)格式:过程名(关联参量名);,2)举例:,【例1】,【例2】,【例3】,元件例化语句,COMPONENT 元件名 IS GENERIC(类属表);-元件定义(说明)语句 PORT(端口名表);END COMPONENT 文

13、件名;例化名:元件名 PORT MAP(端口名=连接端口名,.);-元件例化(调用)语句。,1)格式:,(1)元件声明语句用于调用已生成的元件,这些元件可能在库中,也可能是预先编写的元件实体描述.;(2)元件语句可以在ARCHITECTURE,PACKAGE和BLOCK的说明部分.(3)元件例化中,两层端口名(信号)之间的关系为映射关系:,2)说明:,3)举例:例1,例 2,例 3,生成语句,标号:FOR 循环变量 IN 取值范围 GENERATE 说明 BEGIN 并行语句 END GENERATE 标号;,2)格式:,标号:IF 条件 GENERATE 说明 Begin 并行语句 END

14、GENERATE 标号;,取值范围的语句格式,有两种形式:表达式 TO 表达式;-递增方式,如1 TO 5表达式 DOWNTO 表达式;-递减方式,如5 DOWNTO 1,3)说明:,1)作用:复制作用,根据某些条件,设定好某一元件或设计单位,就可利用 生成语句复制一组完全相同的并行元件或设计单位。,生成语句四部分组成:,(2)生成方式,(3)说明部分,(4)并行语句,(1)标号,*【例1】,*【例2】,*【例3】,举例:,REPORT语句-报告相关信息语句。-格式:REPORT;,断言语句-时序仿真和程序调试的人机对话。-格式:ASSERT REPORT SEVERITY,10.3 属性描述

15、与定义语句,可综合属性:LEFT、RIGHT、HIGH、LOW、RANGE、REVERS RANGE、LENGTH、EVENT及STABLE。格式:属性测试项目名 属性标识符,1.信号类属性,#(NOT clockSTABLE AND clock=1)-不可综合#(clockEVENT AND clock=1)以上两语句的功能是一样的。,注 意,1)EVENT与STABLE测试功能相反。2)语句“NOT(clockSTABLE AND clock=1)”的表达方式是不可综合的。,2、数据区间类属性,【例】.SIGNAL range1:IN STD LOGIC VECTOR(0 TO 7);.F

16、OR i IN range1RANGE LOOP.,3、数值类属性,.PROCESS(clock,a,b);TYPE obj IS ARRAY(0 TO 15)OF BIT;SIGNAL ele1,ele2,ele3,ele4:INTEGER;BEGIN ele1=objRIGNT;ele2=objLEFT;ele3=objHIGH;ele4=objLOW;.,4、数组属性LENGTH,.TYPE arry1 ARRAY(0 TO 7)OF BIT;VARIABLE wth:INTEGER;.wth1:=arry1LENGTH;-wth1=8.,5、用户定义属性,ATTRIBUTE 属性名:数

17、据类型;ATTRIBUTE 属性名 OF 对象名:对象类型IS 值;,Synplify综合器支持的特殊属性都在synplify.attributes程序包中,使用前加入下面语句:,LIBRARY synplify;USE synplicity.attributes.all;,6、说明,7、举例,*【例1】,*【例2】,本章程序举例,例10.2 寄存器,结束,例子:设计一个实体图如图,功能为32位计数器,例10.2 寄存器,ENTITY reginf ISPORT(d,clk,clr,pre,load,data:IN BIT;q1,q2,q3,q4,q5,q6,q7:OUT BIT);END r

18、eginf;ARCHITECTURE maxpld OF reginf IS BEGIN PROCESS-高电平时钟触发 BEGIN WAIT UNTIL clk=1;q1=d;END PROCESS;PROCESS-低电平时钟触发 BEGIN WAIT UNTIL clk=0;q2=d;END PROCESS;PROCESS(clk,clr)-上升沿触发/同步清除 BEGIN IF clr=1 THEN q3=0;ELSIF clkEVENT AND clk=1 THEN q3=d;END IF;END PROCESS;,PROCESS(clk,clr)-下降沿触发/同步清除 BEGIN I

19、F clr=0 THEN q4=0;ELSIF clkEVENT AND clk=0 THEN q4=d;END IF;END PROCESS;PROCESS(clk,pre)-上升沿触发/同步预置”1”BEGIN IF pre=1 THEN q5=1;ELSIF clkEVENT AND clk=1 THEN q5=d;END IF;END PROCESS;,(续)例10.2 寄存器,PROCESS(clk,load,data)-上升沿触发/同步预置数据 BEGIN IF load=1 THEN q6=data;ELSIF clkEVENT AND clk=1 THEN q6=d;END I

20、F;END PROCESS;PROCESS(clk,clr,pre)-上升沿触发/同步置”1”和清除 BEGIN IF clr=1 THEN q7=0;ELSIF pre=1 THEN q7=1;ELSIF clkEVENT AND clk=1 THEN q7=d;END IF;END PROCESS;END maxpld;,例10.2 寄存器(续),LIBRARY ieee;use ieee.std_logic_1164.all;use;entity count12 isport(clk,reset,en:in std_logic;qa,qb,qc,qd:out std_logic);end

21、 count12;architecture behave of count12 issignal count_4:std_logic_vector(3 downto 0);begin qa=count_4(0);qb=count_4(1);qc=count_4(2);qd=count_4(3);process(clk,reset)begin if(reset=0)then count_4=0000;elsif(clkevent and clk=1)then if(en=1)then if(count_4=1011)then count_4=0000;else count_4=count_4+1

22、;end if;end if;end if;end process;end behave;,引脚定义:reset 复位;en 计数控制;clk 时钟;qa,qb,qc,qd 计数器输出,例10.1 十二进制同步计数器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;-设计DFF元件 ENTITY d_ff IS PORT(d,clk_s:IN STD_LOGIC;q:OUT STD_LOGIC;nq:OUT STD_LOGIC);END ENTITY d_ff;ARCHITECTURE a_rs_ff OF d_ff IS BEGIN bin_rs_ff:PR

23、OCESS(CLK_S)BEGIN IF clk_s=1 AND clk_sEVENT THEN q=d;nq=NOT d;END IF;END PROCESS;END ARCHITECTURE a_rs_ff;接下页,例3,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY cnt_bin_n is GENERIC(n:INTEGER:=6);PORT(q:OUT STD_LOGIC_VECTOR(0 TO n-1);in_1:IN STD_LOGIC);END ENTITY cnt_bin_n;ARCHITECTURE behv OF cnt_b

24、in_n IS COMPONENT d_ff PORT(d,clk_s:IN STD_LOGIC;Q,NQ:OUT STD_LOGIC);END COMPONENT d_ff;SIGNAL s:STD_LOGIC_VECTOR(0 TO n);BEGIN s(0)=in_1;q_1:FOR i IN 0 TO n-1 GENERATE dff:d_ff PORT MAP(s(i+1),s(I),q(i),s(i+1);END GENERATE;END ARCHITECTURE behv;,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SN743

25、73 IS PORT(D:IN STD_LOGIC_VECTOR(8 DOWNTO 1);OEN,G:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(8 DOWNTO 1);END ENTITY SN74373;ARCHITECTURE two OF SN74373 IS SIGNAL sigvec_save:STD_LOGIC_VECTOR(8 DOWNTO 1);BEGIN PROCESS(D,OEN,G,sigvec_save)BEGIN IF OEN=0 THEN Q=sigvec_save;ELSE Q=ZZZZZZZZ;END IF;IF G=1 THEN

26、Sigvec_save=D;END IF;END PROCESS;END ARCHITECTURE two;接下页,例2,(续)ARCHITECTURE one OF SN74373 IS COMPONENT LatchPORT(D,ENA:IN STD_LOGIC;Q:OUT STD_LOGIC);END COMPONENT;SIGNAL sig_mid:STD_LOGIC_VECTOR(8 DOWNTO 1);BEGIN GeLatch:FOR D(inNum)IN 1 TO 8 GENERATE Latchx:Latch PORT MAP(D(inNum),G,sig_mid(inNum

27、);END GENERATE;Q=sig_mid WHEN OEN=0 ELSE ZZZZZZZZ;-当OEN=1时,Q(8)Q(1)输出状态呈高阻态END ARCHITECTURE one;,.COMPONENT compPORT(x:IN STD_LOGIC;y:OUT STD_LOGIC);END COMPONENT;SIGNAL a:STD_LOGIC_VECTOR(0 TO 7);SIGNAL b:STD_LOGIC_VECTOR(0 TO 7);.gen:FOR i IN aRANGE GENERATE u1:comp PORT MA(x=a(i),y=b(i);END GENER

28、ATE gen,.,【例 1】,下图 是 生成语句产生的8个相同的电路模块,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY rs ISPORT(set,reset:IN BIT;q,qb:BUFFER BIT);END rs;ARCHITECTURE rsff1 OF rs IS COMPONENT nand2 PORT(a,b:IN BIT;c:OUT BIT);END COMPONENT;BEGIN U1:nand2 PORT MAP(a=set,b=qb,c=q);U2:nan

29、d2 PORT MAP(a=reset,b=q,c=qb);END rsff1;,例 3 RS触发器电路实现,.b1:BLOCK SIGNAL s1:BIT;BEGIN S1=a AND b;b2:BLOCK SIGNAL s2:BIT;BEGIN s2=c AND d;b3:BLOCK BEGIN Z=s2;END BLOCK b3;END BLOCK b2;y=s1;END BLOCK b1;.,块语句嵌套例子:【例3】,.ENTITY gat IS GENERIC(l_time:TIME;s_time:TIME);-类属说明 PORT(b1,b2,b3:INOUT BIT);-结构体全局

30、端口定义 END ENTITY gat;ARCHITECTURE func OF gat IS SIGNAL a1:BIT;-结构体全局信号 a1定义 BEGINBlk1:BLOCK-块定义,块标号名是Blk1 GENERIC(gb1,gb2:Time);-定义块中的局部类属参量 GENERIC MAP(gb1=l_time,gb2=s_time);-局部端口参量设定 PORT(pb:IN BIT;pb2:INOUT BIT);-块结构中局部端口定义 PORT MAP(pb1=b1,pb2=a1);-块结构端口连接说明 CONSTANT delay:Time:=1 ms;-局部常数定义 SIG

31、NAL s1:BIT;-局部信号定义 BEGIN s1=pb1 AFTER delay;pb2=s1 AFTER gb1,b1 AFTER gb2;END BLOCK Blk1;END ARCHITECTURE func;,【例2】块语句例,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY decoder IS PORT(a,b,c:IN STD_LOGIC;data1,data2:IN STD_LOGIC;dataout:OUT STD_LOGIC);END decoder;ARCH

32、ITECTURE concunt OF decoder IS SIGNAL instruction:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN instruction=c,【例2】,.WITH selt SELECTmuxout=a WHEN 0|1,-0或1 b WHEN 2 TO 5,-2或3,或4或5 c WHEN 6,d WHEN 7,Z WHEN OTHERS;.,【例3】,【例10.2】CASE 语句病句举例 SIGNAL value:INTEGER RANGE 0 TO 15;SIGNAL out1:STD_LOGIC;.CASE value IS-缺少

33、以WHEN引导的条件句 END CASE;.CASE value IS WHEN 0=out1 out1 out1 out1=0;END CASE;,.L2:LOOP a:=a+1;EXIT L2 WHEN a 10;-当a大于10时跳出循环 END LOOP L2;.,例.1,【例2】循环语句举例 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 p_check;ARCHITECTURE opt OF p_

34、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;,例循环语句举例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;,例3,此段程序等效于顺序执行以下三个信号赋值操作:a(1)=b(1)AND c(1);a(2)=b(2)AND c(2);a(3)=b(3)AND

35、 c(3);,【例1】NEXT 举例.L1:FOR cnt_value IN 1 TO 8 LOOPs1:a(cnt_value):=0;NEXT WHEN(b=c);-判断条件s2:a(cnt_value+8):=0;END LOOP L1;,说明:当程序执行到NEXT判断,当b=c时执行NEXT返回L1,当bc时执行s2语句,【例2】多重循环NEXT举例.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(ef);s3:b(k+8):=0;k:=k+1;NEXT

36、 LOOP L_y;NEXT LOOP L_x;.,说明:当(ef)时,执行NEXT L_x,跳转到L_x执行,当ef不成立时,执行s3语句,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语句继续比较,例 1 EXIT语句举例-两位数比较,说明:程序中当a b时,由EX

37、IT跳出循环比较程序,并报告结果。,1)WAIT ON 信号表结构-用于仿真SIGNAL s1,s2:STD_LOGIC;.PROCESSBEGIN.WAIT ON s1,s2;-执行到此句被挂起来,待s1,s2任一信号改变,进程才重新开始。END PROCESS;,2)WAIT_ON 结构-用于仿真 LOOP Wait on enable;EXIT WHEN enable=1;END LOOP;3)WAIT_UNTIL条件表达式结构-用于综合.Wait until enable=1;.,【例1】,例 2)、3)中:待enable上升沿。(即:两条件enable改变AND nable=1同时满

38、足),例 2 WAIT语句举例,【例2】用一个硬件求实现平均值的功能.PROCESSBEGINWAIT 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;,【例3】-用WAIT语句实现具有同步复位功能 PROCESS BEGIN rst_loop:LOOP WAIT UNTIL clock=1 AND clockEVENT;-等待时钟信号 NEXT rst_loop WHEN(rst=1);-检测复位信号rst x=

39、a;-无复位信号,执行赋值操作 WAIT UNTIL clock=1 AND clockEVENT;-等待时钟信号 NEXT rst_loop When(rst=1);-检测复位信号rst y=b;-无复位信号,执行赋值操作 END LOOP rst_loop;END PROCESS;-每当时钟上升沿到来结束进程的挂起,从而检测rst=1是否成立,如果是高电平,则返回循环起点rst_loop处,否则,执行下面的顺序语句。,PACKAGE data_types IS-程序包体SUBTYPE data_element IS INTEGER RANGE 0 TO 3;-定义数据类型TYPE data

40、_array IS ARRAY(1 TO 3)OF data_element;END data_types;USE WORK.data_types.ALL;-工作库的程序包data_typesENTITY sort IS PORT(in_array:IN data_array;out_array:OUT data_array);END sort;ARCHITECTURE exmp OF sort IS BEGIN PROCESS(in_array)-进程开始,设data_types为敏感信号 PROCEDURE swap(data:INOUT data_array;-过程体开始 low,hig

41、h:IN INTEGER)IS-形参名为 data、low、high VARIABLE temp:data_element;BEGIN-以下过程的逻辑功能 接下页,例1 过程调用举例,IF(data(low)data(high)THEN-检测数据 temp:=data(low);data(low):=data(high);data(high):=temp;END IF;END swap;-过程swap结束VARIABLE my_array:data_array;BEGIN-进程开始 my_array:=in_array;-将输入值读入变量swap(my_array,1,2);-my_array

42、、1、2是对应于data、low、high的实参 swap(my_array,2,3);-位置关联法调用,第2第3元素交换 swap(my_array,1,2);-第1第2元素再次交换 out_array=my_array;END Process;END exmp;,例1(续),ENTITY sort4 isGENERIC(top:INTEGER:=3);PORT(a,b,c,d:IN BIT_VECTOR(0 TO top);ra,rb,rc,rd:OUT BIT_VECTOR(0 TO top);END sort4;ARCHITECTURE muxes OF sort4 ISPROCEDU

43、RE sort2(x,y:INOUT BIT_VECTOR(0 TO top)is VARIABLE tmp:BIT_VECTOR(0 TO top);BEGIN IF x y THEN tmp:=x;x:=y;y:=tmp;END IF;END sort2;BEGIN PROCESS(a,b,c,d)VARIABLE va,vb,vc,vd:BIT_VECTOR(0 TO top);BEGIN va:=a;vb:=b;vc:=c;vd:=d;sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);ra=va;rb=vb

44、;rc=vc;rd=vd;END PROCESS;END muxes;,例2 过程调用举例,PROCEDURE rs(SIGNAL s,r:IN STD_LOGIC;SIGNAL q,nq:INOUT STD_LOGIC)IS BEGIN IF(s=1 AND r=1)THEN REPORT Forbidden state:s and r are quual to 1;RETURN;ELSE q=s AND nq AFTER 5 ns;nq=s AND q AFTER 5 ns;END IF;END PROCEDURE rs;,例1,当信号s=1 AND r=1满足时,RETURN 将中断过程

45、。,FUNCTION opt(a,b,opr:STD_LOGIC)RETURN STD_LOGIC IS BEGIN IF(opr=1)THEN RETURN(a AND b);ELSE RETURN(a OR b);END IF;END FUNCTION opt;,例2,.PROCEDURE adder(SIGNAL a,b:IN STD_LOGIC;-过程名为adder SIGNAL sum:OUT STD_LOGIC);.adder(a1,b1,sum1);-并行过程调用.-在此,a1、b1、sum1即为分别对应于a、b、sum的关联参量名 PROCESS(c1,c2);-进程语句执行

46、BEGIN Adder(c1,c2,s1);-顺序过程调用,在此c1、c2、s1即为分别对 应于a、b、sum的关联参量名 END PROCESS;,【例1】,PROCEDURE check(SIGNAL a:IN STD_LOGIC_VECTOR;SIGNAL error:OUT BOOLEAN)IS-在调用时再定位宽 VARIABLE found_one:BOOLEAN:=FALSE;-设初始值 BEGIN FOR i IN aRANGE LOOP-对位矢量a的所有的位元素进行循环检测 IF a(i)=1 THEN-发现a中有 1 IF found_one THEN-若found_one为

47、TRUE,表明发现了一个以上的1 ERROR=TRUE;-发现了一个以上的1,令found_one为TRUE RETURN;-结束过程 END IF;Found_one:=TRUE;-在a中已发现了一个1 End IF;End LOOP;-再测a中的其它位 error=NOT found_one;-如果没有任何1 被发现,error 将被置TRUE END PROCEDURE check;,【例2】,.CHBLK:BLOCK SIGNAL s1:STD_LOGIC_VECTOR(0 TO 0);-过程调用前设定位矢尺寸 SIGNAL s2:STD_LOGIC_VECTOR(0 TO 1);SI

48、GNAL s3:STD_LOGIC_VECTOR(0 TO 2);SIGNAL s4:STD_LOGIC_VECTOR(0 TO 3);SIGNAL e1,e2,e3,e4:Boolean;BEGIN Check(s1,e1);-并行过程调用,关联参数名为s1、e1 Check(s2,e2);-并行过程调用,关联参数名为s2、e2 Check(s3,e3);-并行过程调用,关联参数名为s3、e3 Check(s4,e4);-并行过程调用,关联参数名为s4、e4 END BLOCK;.,*【例3】,【例1】奇偶校验判别信号发生器,利用属性函数 low 和highLIBRARY IEEE;-PAR

49、ITY GENERATORUSE IEEE.STD_LOGIC_1164.ALL;ENTITY parity IS GENERIC(bus_size:INTEGER:=8);PORT(input_bus:IN STD_LOGIC_VECTOR(bus_size-1 DOWNTO 0);even_numbits,odd_numbits:OUT STD_LOGIC);END parity;ARCHITECTURE behave OF parity ISBEGINPROCESS(input_bus)VARIABLE temp:STD_LOGIC;BEGIN temp:=0;FOR i IN inpu

50、t_busLOW TO input_busHIGH LOOPtemp:=temp XOR input_bus(i);END LOOP;odd_numbits=temp;even_numbits=NOT temp;END PROCESS;END behave;,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY cntbuf IS PORT(Dir:IN STD_LOGIC;Clk,Clr,OE:IN STD_LOGIC;A,B:INOUT STD_LOGIC_VECTOR(0 to 1);Q:INOUT STD_LOGIC_VECTOR(3 down

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号