VHDL基本描述语句_第1页
VHDL基本描述语句_第2页
VHDL基本描述语句_第3页
VHDL基本描述语句_第4页
VHDL基本描述语句_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

第3章VHDL基本描述语句主要内容:1、顺序语句

2、并行语句

重点内容:顺序语句和并行语句1第3章VHDL基本描述语句顺序语句就是在语句的执行过程中,语句的执行顺序是按照语句的书写顺序一个语句一个语句地执行的。顺序语句只能出现在进程、过程和函数中,用以定义在进程、过程和函数中所执行的算法。并发语句是并行执行的。例如进程语句,在一个结构体中的各进程语句是并发执行的。23.1VHDL中的顺序描述语句赋值语句Wait语句If语句Case语句Loop语句Next语句Null语句断言语句过程调用语句33.1.1信号代入语句和变量赋值语句信号代入语句的书写格式:

目标信号<=表达式;该语句表示将代入符号“<=”右边表达式的值赋给左的目标信号,注意代入符号两边的信号和表达式的数据型和长度必须保持一致。变量只能在VHDL源代码的顺序部分进行说明和使用,只能出现在进程、过程和函数内。变量赋值语句的书写格式:

目标变量:=表达式;

43.1.2Wait语句在VHDL源代码中的进程总是处于两种状态:执行和挂起。Wait语句可以控制进程的执行或挂起。当进程执行到wait语句时将被挂起,并等待wait语句条件满足时进程再次被执行。有4种不同的方法来描述一个wait语句。

wait——无限等待

waiton——敏感信号量变化

waituntil——条件满足

waitfor——时间到51.WAIT(无限等待语句)

这种形式的WAIT语句在关键字“WAIT”后面不带任何信息,是无限等待的情况。2.WAITON信号表(敏感信号等待语句)第3章VHDL基本描述语句waiton语句的完整书写格式:

waiton敏感信号[,敏感信号];

waiton语句使进程挂起,直到敏感信号表中的某个信号发生了变化才能够把进程激活。6例[A]PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;例[B]PROCESS(a,b)BEGINy<=aANDb;

ENDPROCESS;

①在使用WAITON语句的进程中,敏感信号量应写在进程中的WAITON语句后面;②在不使用WAITON语句的进程中,敏感信号量应在开头的关键词PROCESS后面的敏感信号表中列出。

③VHDL规定,已列出敏感信号表的进程不能使用任何形式的WAIT语句。

第3章VHDL基本描述语句3.1.2Wait语句7例:异步复位的D触发器Libraryieee;Useieee.std_logic_1164.all;Entityreset_dff1isport(clk,reset:instd_logic;d:instd_logic;q:outstd_logic);Endentityreset_dff1;Architecturertlofreset_dff1isBegin

ProcessBeginif(reset=‘1’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;

waitonclk,reset;

endprocess;Endrtl;3.1.2Wait语句process(reset,clk)Beginif(reset=‘1’)thenq<=‘0’;elsif(clk’eventandclk=‘1’)thenq<=d;endif;83.WAITUNTIL条件(条件等待语句)WAITUNTIL语句需满足以下条件:①在条件表达式中所含的信号发生了变化;②此信号改变后,且满足WAITUNTIL语句中表达式的条件。这两个条件缺一不可,且必须按照上述顺序来完成。第3章VHDL基本描述语句3.1.2Wait语句waituntil语句的完整书写格式:

waituntil条件表达式;waituntil语句将使进程挂起,直到该条件表达式返回一个为“true”的值,进程才能够再次被启动。当表达式中任何一个信号有事件发生时,就会立即对该表达式进行计算。9WAITUNTIL语句有以下三种表达方式:

WAITUNTIL信号=VALUE;

WAITUNTIL信号’EVENTAND信号=VALUE;

WAITUNTIL信号’STABLEAND信号=VALUE;例如:

WAITUNTILclock=“1”;

WAITUNTILrising_edge(clk);

WAITUNTILclk=‘1’ANDclk’EVENT;

WAITUNTILNOTclk’STABLEANDclk=“1”;

一般的,在一个进程中使用了WAIT语句后,综合器会综合产生时序逻辑电路。时序逻辑电路的运行依赖WAITUNTIL表达式的条件,同时还具有数据存储的功能。第3章VHDL基本描述语句10例:同步复位的D触发器Libraryieee;Useieee.std_logic_1164.all;Entityreset_dff3isport(clk,reset:instd_logic;d:instd_logic;q:outstd_logic);Endentityreset_dff3;Architecturertlofreset_dff3isBegin

Process

Beginwaituntilclk’eventandclk=‘1’;if(reset=‘1’)thenq<=‘0’;elsethenq<=d;endif;

endprocess;Endrtl;3.1.2Wait语句114.WAITFOR时间表达式(超时等待语句)例[A]:WAITFOR40ns;

在该语句中,时间表达式为常数40ns,当进程执行到该语句时,将等待40ns,经过40ns之后,进程执行WAITFOR的后继语句。例[B]:WAITFOR(a*(b+c));

在此语句中,(a*(b+c))为时间表达式,WAITFOR语句在执行时,首先计算表达式的值,然后将计算结果返回作为该语句的等待时间。

第3章VHDL基本描述语句125.多条件等待语句

Wait语句可以同时使用多个等待条件。在多条件等待语句的表达式中,至少应该有一个值包含信号。例:waitonabuntil(c’eventandc=‘1’)for10ns;第3章VHDL基本描述语句13If语句是在VHDL描述硬件电路的过程中使用最频繁的语句。If语句的完整书写格式:

if<条件>then<顺序语句>;

[elsif<条件>then<顺序语句>;][elsif<条件>then<顺序语句>;]……[else<顺序语句>;]endif;从if开始到endif结束,endif要分开写条件是一个布尔表达式,返回值为布尔类型。当条件满足时执行接下来的顺序语句;当条件不满足时就去执行接下来的顺序语句elsif子句或else子句或结束if语句。根据if语句的完整书写格式,If语句的三种常用形式。3.1.3IF语句143.1.3IF语句1、门闩控制语句IF<条件>THEN

<顺序语句>;

ENDIF;

第3章VHDL基本描述语句15

当程序执行到这种门闩控制型IF语句时,首先判断语句中所指定的条件是否成立。如果条件成立,则程序继续执行IF语句中所含的顺序处理语句;如果条件不成立,程序将跳过IF语句所包含的顺序处理语句,而向下执行IF的后继语句。

例:利用IF语句引入D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffISPORT(clk,d:INSTD_LOGIC;

q:OUTSTD_LOGIC);ENDdff;ARCHITECTURErtlOFdffISBEGIN

PROCESS(clk)

BEGIN

IF(clk’EVENTANDclk=’1’)

THEN

q<=d;

ENDIF;

ENDPROCESS;END

rtl;第3章VHDL基本描述语句162、二选一控制语句

IF<条件>THEN

<顺序语句>;

ELSE

<

顺序语句>;

ENDIF;

当IF条件成立时,程序执行THEN和ELSE之间的顺序语句部分;当IF语句的条件得不到满足时,程序执行ELSE和ENDIF之间的顺序处理语句。即依据IF所指定的条件是否满足,程序可以进行两条不同的执行路径。

第3章VHDL基本描述语句17例:二选一电路结构体的描述ARCHITECTURErtlOFmux2ISBEGINPROCESS(a,b,s)BEGIN

IF(s=’1’)THEN

c<=a;

ELSE

c<=b;

ENDIF;ENDPROCESS;END

rtl;

第3章VHDL基本描述语句183、多选择控制语句IF<条件>THEN

<顺序语句>;

ELSEIF

<顺序语句>;ELSEIF

<顺序语句>;ELSE

<顺序语句>;ENDIF;

这种多选择控制的IF语句,实际上就是条件嵌套。它设置了多个条件,当满足所设置的多个条件之一时,就执行该条件后的顺序处理语句。当所有设置的条件都不满足时,程序执行ELSE和ENDIF之间的顺序处理语句。第3章VHDL基本描述语句19例:利用多选控制语句设计的四选一多路选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:INSTD_LOGIC_VECTOR(1DOWNTO0);

y:OUTSTD_LOGIC);ENDmux4;第3章VHDL基本描述语句20ARCHITECTURErtlOFmux4ISBEGINPROCESS(input,sel)BEGIN

IF(sel=“00”)THENy<=input(0);

ELSIF(sel=“01”)THENy<=input(1);

ELSIF(sel=“10”)THENy<=input(2);

ELSEy<=input(3);

ENDIF;ENDPROCESS;ENDrtl;第3章VHDL基本描述语句213.1.4CASE语句第3章VHDL基本描述语句Case语句完整书写形式:

case<表达式>iswhen<选择>=><顺序语句>;

when<选择>=><顺序语句>;

……

whenothers=><顺序语句>;

endcase;Case语句中如果表达式的值与某一个when语句的选择值或与others值相匹配,则执行它们后面所跟的顺序执行语句,执行完顺序语句后将结束该case语句。Case语句中的所有条件必须被枚举,不允许when语句后的选择有相同的。When语句后面的选择值必须是表达式的所有取值,不能遗漏。可以利用others来表示所有具有相同操作的选择。Case语句中的when语句可以颠倒次序而不影响操作,但保留字others必须放在作后面。22当执行到CASE语句时,首先计算CASE和IS之间的表达式的值,然后根据条件语句中与之相同的选择值,执行对应的顺序语句,最后结束CASE语句。第3章VHDL基本描述语句在case语句中的“when<选择>=><顺序语句>;”有四种表示形式:

When值=><顺序语句>;When值|值|…|值=><顺序语句>;--表示并行关系

When值to值=><顺序语句>;--表示范围

Whenothers=><顺序语句>;23CASE语句需要注意的几点(1)CASE语句中每一条语句的选择值只能出现一次,即不能有相同选择值的条件语句出现。(2)CASE语句执行中必须选中,且只能选中所列条件语句中的一条,即CASE语句至少包含一个条件语句。(3)除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则最末一个条件语句中的选择必须用“OTHERS”表示,它代表已给出的所有条件语句中未能列出的其他可能的取值。关键词OTHERS只能出现一次,且只能作为最后一种条件取值。第3章VHDL基本描述语句24例:七段显示译码器Libraryieee;Useieee.std_logic_1164.all;Entityse7isport(input:instd_logic_vector(3downto0);output:outstd_logic_vector(6downto0));Endse7;Architecturese7_arcofse7isBeginprocess(input)3.1.4CASE语句25

Begincaseinputiswhen“0000”=>output<=“0111111”;when“0001”=>output<=“0000110”;when“0010”=>output<=“1011011”;when“0011”=>output<=“1001111”;when“0100”=>output<=“1100110”;when“0101”=>output<=“1101101”;when“0110”=>output<=“1111101”;when“0111”=>output<=“0000111”;when“1000”=>output<=“1111111”;when“1001”=>output<=“1101111”;when“1010”=>output<=“1110111”;when“1011”=>output<=“1111100”;when“1100”=>output<=“0111001”;when“1101”=>output<=“1011110”;when“1110”=>output<=“1111001”;when“1111”=>output<=“1110001”;whenothers=>output<=“0000000”;endcase;endprocess;endse7_arc;3.1.4CASE语句例:七段显示译码器Libraryieee;Useieee.std_logic_1164.all;Entityse7isport(input:instd_logic_vector(3downto0);output:outstd_logic_vector(6downto0));Endse7;Architecturese7_arcofse7isBeginprocess(input)26例3-8译码器

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecoder3_8ISPORT(a,b,c,g1,g2a,g2b:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDdecoder3_8;ARCHITECTURErtlOFdecoder3_8ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

indata<=c&b&a;

PROCESS(indata,g1,g2a,g2b)

BEGIN第3章VHDL基本描述语句27IF(g1=‘1’ANDg2a=‘0’ANDg2b=‘0’)THEN

CASEindataISWHEN“000”=>y<=“11111110”;

WHEN“001”=>y<=“11111101”;

WHEN“010”=>y<=“11111011”;

WHEN“011”=>y<=“11110111”;

WHEN“100”=>y<=“11101111”;

WHEN“101”=>y<=“11011111”;

WHEN“110”=>y<=“10111111”;

WHEN“111”=>y<=“01111111”;

WHENOTHERS=>y<=“XXXXXXXX”;ENDCASE;

ELSEy<=“11111111”;

ENDIF;

ENDPROCESS;

ENDrtl;第3章VHDL基本描述语句283.1.5LOOP语句

LOOP语句就是循环语句,它可以使包含的一组顺序语句被循环执行,其执行的次数受迭代算法控制。在VHDL中常用来描述迭代电路的行为。第3章VHDL基本描述语句VHDL提供了两种循环控制语句:

Forloop循环

Whileloop循环Forloop循环主要用于在规定重复数目的重复情况;whileloop循环将连续执行操作直到控制条件被判断为“false”。29第3章VHDL基本描述语句1.forloop循环

Forloop循环的完整书写格式为:

[循环标号:]for循环变量

in

离散范围loop<顺序处理语句>;

Endloop[循环标号];循环标号作为该forloop循环的标志符;循环变量的值在每次的循环中都将发生变化;循环变量每取一个值,就要执行一次循环体中的顺序处理语句。离散范围用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围最右边的值,实际上也是限定了循环的次数。离散范围的值不一定指定为整数值,也可以是其他类型的。只是要保证数值是离散的就可以。30例:8位奇偶校验电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;第3章VHDL基本描述语句31BEGIN

tmp:=‘0’;

FORiIN0TO7LOOP

tmp:=tmpXORa(i);

ENDLOOP;

y<=tmp;

ENDPROCESS;ENDrtl;第3章VHDL基本描述语句ARCHITECTURErtlOFparity_checkISBEGIN

PROCESS(a)

VARIABLEtmp:STD_LOGIC

322.whileloop循环whileloop循环的完整书写格式为:

[循环标号:]while<条件>loop<顺序处理语句>;

endloop[循环标号];MAX+PlusII不支持whileloop语句。循环标号用来作为该whileloop循环语句的标志符;Whileloop循环语句当检测到保留字while后面的条件满足时才去执行顺序处理语句。Whileloop循环语句在每次执行前都要先检查条件,如检查出条件为“true”就去执行循环体中的顺序处理语句,执行完后返回该循环的开始,将再次检查条件;如果条件为“false”将结束循环,去执行whileloop循环语句后面的其他语句。3.1.5LOOP语句33例:8位奇偶校验电路的WHILE_LOOP设计形式

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTUREbehavOFparity_checkISBEGINPROCESS(a)

VARIABLEtmp:STD_LOGIC第3章VHDL基本描述语句34BEGIN

tmp:=‘0’;

i:=0;

WHILE(i<8)LOOP

tmp:=tmpXORa(i);

i:=i+1;

ENDLOOP;

y<=tmp;

ENDPROCESS;ENDbehav;第3章VHDL基本描述语句在该LOOP语句中,没有给出循环次数的范围,而是给出了循环执行顺序语句的条件;没有自动递增循环变量的功能,而是在顺序处理语句中增加了一条循环次数计算语句,用于循环语句的控制。

循环控制条件为布尔表达式,当条件为“真”时,则进行循环,如果条件为“假”,则结束循环。ARCHITECTUREbehavOFparity_checkISBEGIN

PROCESS(a)

VARIABLEtmp:STD_LOGIC353.1.6next语句VHDL提供了两种跳出循环的操作,一种是跳出本次循环的next语句,另一种是跳出整个循环的exit语句。Next语句用在loop循环语句的内部,它可以有条件或者是无条件地结束当前此次循环并开始下一次的循环。next语句的完整书写格式为:

next[循环标号][when条件];“循环标号”表明了结束本次循环后下一次循环的起始位置。“when条件”则表明了跳出本次循环的条件。当“循环标号”和“when条件”省略后则表明只要执行到该next语句就立即无条件地跳出本次循环,回到本loop循环语句地起始位置进行下一次循环。36例:NEXT语句应用举例┇WHILEdata>1LOOPdata:=data+1;NEXTWHENdata=3data:=data*data;ENDLOOP;N1:FORiIN10DOWNTO1LOOPN2:FORjIN0TOiLOOPNEXTN1WHENi=j;

matrix(i,j):=j*i+1;

ENDLOOPN2;ENDLOOPN1;第3章VHDL基本描述语句37第3章VHDL基本描述语句VHDL提供了exit语句,允许设计人员从目前正在执行的循环中跳出。Exit语句的完整书写格式:

exit[循环标号][when条件];“循环标号”表明了要终止的loop循环标号。“when条件”则表明了终止本循环的条件。当“循环标号”和“when条件”省略后则表明只要执行到该exit语句就立即无条件地跳出本循环,继续执行loop循环语句后面的其他语句。3.1.7exit语句38Exit语句有三种基本的书写格式:一种是没有“循环标志”或“when条件”的书写格式。执行该语句时只从当前所属的loop循环语句中跳出。一种是带有“循环标号”的书写格式。当执行该语句时,将终止循环标号所指示的循环的执行。一种是带有“when条件”的书写格式。当执行到该语句时,只有当条件为真时才会终止循环标号所指示的循环的执行或跳出当前所属的loop循环。第3章VHDL基本描述语句3.1.7exit语句39例:两个元素位矢量a、b进行比较,当发现a与b不同时,跳出循环比较程序并报告比较结果。SIGNALa,b:STD_LOGIC_VECTOR(0TO1);SIGNALa_less_than_b:BOOLEAN;┇a_less_than_b<=FALSE;FORiIN1TO0LOOPIF(a(i)=‘1’ANDb(i)=‘0’)THENa_less_than_b<=FALSE;EXIT;ELSEIF(a(i)=‘0’ANDb(i)=‘1’)THENa_less_than_b<=TRUE;EXIT;ELSENULLENDIF;ENDLOOP;第3章VHDL基本描述语句403.1.8断言语句断言语句可以对VHDL描述中的模型添加限制条件,为设计人员报告一条文本的字符串。断言语句的书写格式:

assert<条件>report<输出信息>severity<出错级别>;在执行过程中,断言语句首先检查条件的布尔表达式的真假。如果布尔表达式为“true”,则向下执行另外一条语句。如果布尔表达式为“false”,断言语句将输出一条设计人员规定的字符串到标准输出终端,并给出输出字符串的出错级别。第3章VHDL基本描述语句41

3.1.9、REPORT语句

REPORT语句不增加硬件任何功能,但提供顺序断言语句的短格式,在仿真时使用REPORT语句可以提高程序的可读性。REPORT语句的书写格式为:REPORT输出信息[SEVERITY出错级别];第3章VHDL基本描述语句42return语句Return语句只能用在函数和过程体中,主要用来结束当前的最内层的函数或者是过程体的执行。在过程体中return语句不能有表达式;而函数体中的return语句必须有一个表达式,它也是结束函数体执行的唯一条件。Return语句的书写格式如下:

return[表达式];null语句Null语句表示一种只占位置的空操作,它不进行任何动作,执行该语句只是使源代码去执行下一个语句。Null语句的书写格式如下:

null;例:casetmpiswhen0=>q<=d0;when1=>q<=d1;when2=>q<=d2;when3=>q<=d3;whenothers=>null;第3章VHDL基本描述语句433.2并行语句

在VHDL中,并行语句在结构体中的执行是同时并发执行的,其书写次序与其执行顺序并无关联,并行语句的执行顺序是由他们的触发事件来决定的。第3章VHDL基本描述语句进程语句块语句并行信号代入并行断言语句并行过程调用语句参数传递语句元件例化语句生成语句并行语句的种类:44第3章VHDL基本描述语句3.2.1并行信号代入语句信号代入语句有两种:在结构体中的进程内使用,作为一种顺序语句;在结构体中的进程之外使用,是一种并行语句,称之为并行信号代入语句。注意:一条信号代入语句和一个信号代入的进程语句是等价的。45第3章VHDL基本描述语句3.2.1并行信号代入语句例:2输入与门Libraryieee;Useieee.std_logic_1164.all;entityand_gateisport(a:instd_logic;b:instd_logic;y:outstd_logic);endand_gate;architecturebehaveofand_gateisbegin

y<=aandb;endbehave;Begin

process(a,b)beginy<=aandb;endprocess;Endbehave;等价于并行信号代入语句46第3章VHDL基本描述语句3.2.1并行信号代入语句信号代入语句有两种:在结构体中的进程内使用,作为一种顺序语句;在结构体中的进程之外使用,是一种并行语句,称之为并行信号代入语句。注意:一条信号代入语句和一个信号代入的进程语句是等价的。47第3章VHDL基本描述语句3.2.1并行信号代入语句在VHDL中提供了三种并行信号代入语句:

•并发信号代入语句

•条件信号代入语句

•选择信号代入语句481.并发信号代入语句信号代入语句在结构体的进程外出现时,它作为并发语句的形式出现。并发信号代入语句在结构体中是并行执行的,它们的执行顺序与书写顺序无关。并发信号代入语句是靠时间驱动的,只有代入符号“<=”右边的对象有事件发生时才会执行该语句。常用来进行加法器、乘法器、除法器和比较器等许多逻辑电路的描述。3.2.1并行信号代入语句第3章VHDL基本描述语句49Libraryieee;Useieee.std_logic_1164.all;

entityadd_1isport(A:instd_logic;B:instd_logic;Cin:instd_logic;Co:outstd_logic;S:outstd_logic);endadd_1;architecturedataflowofadd_1issignaltmp1,tmp2:std_logic;Begin

tmp1<=AxorB;tmp2<=tmp1andCin;S<=tmp1xorCin;Co<=tmp2or(AandB);enddataflow;并发信号代入语句3.2.1并行信号代入语句50条件信号代入语句也是一种并发描述语句,是根据不同的表达式代入目的信号的语句书写格式:

<目的信号><=<表达式1>when<条件1>else<表达式2>when<条件2>else<表达式3>when<条件3>else……<表达式n-1>when<条件>else<表达式n>;功能说明:当VHDL源代码执行到该语句时要先进行条件判断,如果条件满足,就将条件前面的那个表达式的值代入目的信号;如果条件不满足,就去判断下一个条件;最后一个表达式没有条件,也就是说在前面条件都不满足时,就将该表达式的值代入目的信号。3.2.1并行信号代入语句

2.条件信号代入语句51例:采用条件代入语句描述的七段显示译码器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYse7ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);output:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDse7;第3章VHDL基本描述语句52第3章VHDL基本描述语句Architecturertlofse7isBegin

output<="0111111"wheninput="0000"else"0000110"wheninput="0001"else"1011011"wheninput="0010"else"1001111"wheninput="0011"else

"1100110"wheninput="0100"else

"1101101"wheninput="0101"else

"1111101"wheninput="0110"else"0000111"wheninput="0111"else"1111111"wheninput="1000"else

"1101111"wheninput="1001"else"1110111"wheninput="1010"else"1111100"wheninput="1011"else

"1011110"wheninput="1101"else

"1111001"wheninput="1110"else"1110001"wheninput="1111"else

"0111001"wheninput="1100"else"0000000";Endrtl;在七段数码管结构体中,用一个条件代入语句来完成所有状态的显示译码。在保留字WHEN的前面是驱动显示数码管的七位位矢量;在保留字WHEN的后面是译码的条件。53第3章VHDL基本描述语句条件信号代入语句与if语句的区别:(1)If语句是顺序语句,只能在进程中使用;条件信号代入语句是并行语句,必须用在进程之外。(2)If语句中else是可有可无的;条件信号代入语句中的else语句是必须有的。(3)If语句能嵌套使用;条件信号代入语句不能嵌套,不能生成锁存器。(4)使用if语句来描述不需要太多硬件知识;使用条件信号代入语句则要求设计人员具有较多的硬件电路的知识。2.条件信号代入语句543.选择信号代入语句第3章VHDL基本描述语句选择信号代入语句的书写格式:With<表达式>select<目的信号><=<表达式1>when<条件1>,

<表达式2>when<条件2>,

<表达式3>when<条件3>,

……<表达式n>when<条件n>;功能说明:当VHDL源代码执行到该语句时,目的信号根据表达式的当前值来进行表达式代入。当表达式的值符合某个条件时,就将条件前的信号代入目的信号;如果条件不符合,语句继续向下判断,直到找到满足的条件为止。选择信号代入语句与case语句一样,必须把表达式的值在条件中都列出来。55LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(d0:INSTD_LOGIC_VECTOR(7DOWNTO0);

d1:INSTD_LOGIC_VECTOR(7DOWNTO0);

d2:INSTD_LOGIC_VECTOR(7DOWNTO0);

d3:INSTD_LOGIC_VECTOR(7DOWNTO0);

s0:INSTD_LOGIC;

s1:INSTD_LOGIC;

q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmux4;第3章VHDL基本描述语句例:四选一8位总线选择器56ARCHITECTURErtlOFmux4ISSIGNALcomb:STD_LOGIC_VECTOR(1DOWNTO0);;BEGIN

comb<=s1&s0;

WITH

combSELECT

q<=d0WHEN“00”;

d1WHEN“01”;

d2WHEN“10”d3WHENOTHERS;ENDrtl;第3章VHDL基本描述语句例:四选一8位总线选择器573.2.2并行断言语句并行断言语句和顺序断言语句书写格式一致、功能一致。并行断言语句用在结构体中,顺序断言语句只能用在进程、函数和过程中。任何并行断言语句都对应着一个等价的被动进程语句,被动进程语句没有输出,并行断言语句的执行将不会引起任何事件的发生,只是在断言条件为“false”时给出一条信息报告。58例:Libraryieee;

Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitymaxisport(in1:instd_logic_vector(7downto0);in2:instd_logic_vector(7downto0);in3:instd_logic_vector(7downto0);q:instd_logic_vector(7downto0));Endmax;Architecturebehaveofexampleissignalcomb:std_logic_vector(1downto0);Beginassertfalse;report“Thisentityisaexampletodescriptassertstatement”severitynote;Endbehave;

3.2.2并行断言语句593.2.4并行过程调用语句过程调用语句在进程内执行时,它是一种顺序语句;过程调用语句在结构体中的进程之外执行时,它作为并发语句的形式出现。作为并行过程调用语句,在结构体中它们是并行执行的,执行顺序与书写顺序无关。60例:求最大值libraryieee;useieee.std_logic_1164.all;entitymaxisport(in1:instd_logic_vector(7downto0);in2:instd_logic_vector(7downto0);in3:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endmax;architecturertlofmaxis3.2.4并行过程调用语句61ARCHITECTURErtlOFmaxIS

PROCEDURE

maximun(a,b:INSTD_LOGIC_VECTOR;

SIGNALc:OUTSTD_LOGIC_VECTOR)IS

VARIABLEtemp:STD_LOGIC_VECTOR(a’RANGE);

BEGIN

IF(a>b)THENtemp:=a;

ELSE

temp

:=b;

ENDIF;

c<=temp;

END

maximun;

SIGNALtmp1,tmp2:STD_LOGIC_VECTOR(7DOWNTO0);

BEGINmaximun(in1,in2,tmp1);

maximun(tmp1,in3,tmp2);

q<=tmp2;ENDrtl;3.2.4并行过程调用语句62

块(BLOCK)语句可以看作是结构体中的子模块,块语句把许多并行语句组合在一起形成一个子模块,而它本身也是一个并行语句。1、基本结构

[块标号:]BLOCK[保护表达式][类属子句[类属接口表;]];

[端口子句[端口接口表;]];

[块说明部分]BEGIN<并行语句1><并行语句2>┇ENDBLOCK[块标号];第3章VHDL基本描述语句

3.2.5块语句63例:利用块语句描述的全加器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYaddISPORT(A:INSTD_LOGIC;

B:INSTD_LOGIC;

Cin:INSTD_LOGIC;

Co:OUTSTD_LOGIC;

S:OUTSTD_LOGIC);ENDadd;第3章VHDL基本描述语句64ARCHITECTUREdataflowOFaddISBEGINex:BLOCKPORT(a_A:INSTD_LOGIC;

a_B:INSTD_LOGIC;

a_Cin:INSTD_LOGIC;

a_Co:OUTSTD_LOGIC;

a_S:OUTSTD_LOGIC);

PORTMAP(a_A=>A,a_B=>B,a_Cin=>Cin,

a_Co=>Co,a_S=>S);

SIGNALtmp1,tmp2:STD_LOGIC;第3章VHDL基本描述语句65BEGINlabel1:PROCESS(a_A,a_B)BEGINtmp1<=a_AXORa_B;ENDPROCESSlabel1;

label2:PROCESS(tmp1,a_Cin)

BEGINtmp2<=tmp1ANDa_Cin

ENDPROCESSlabel2;

label3:PROCESS(tmp1,a_Cin)

BEGINa_S<=tmp1XORa_Cin

ENDPROCESSlabel3;第3章VHDL基本描述语句66

label4:PROCESS(a_A,a_B,tmp2)BEGINa_Co<=tmp2OR(a_AANDa_B);ENDPROCESSlabel4;ENDBLOCKex;ENDdataflow;

在上面的例子中,结构体内含有4个进程语句,这4个进程语句是并行关系,共同形成了一个块语句。第3章VHDL基本描述语句672、模块间的信号传递和端口映射在编写VHDL程序时,会遇到块内的信号或参数要传递到块外去,块外的信号或参数要传递到块内去的情况。解决以上问题的办法是合理使用PORT和PORTMAP语句。

PORT和PORTMAP语句可以作为块头的定义语句,可以用来扩展或增加块的功能。例:LIBRARYieee;USEieee.std_logic_1164.all;PACKAGEmathISTYPEtw32ISARRAY(31DOWNTO0)OFstd_logicFUNCTIONtw_add(a,b:tw32)RETURNtw32;FUNCTIONtw_sub(a,b:tw32)RETURNtw32;

第3章VHDL基本描述语句68ENDmath;USEwork.math.all;ENTITYcpuIS

PORT(clk,interrupt:INstd_logic;add:OUTtw32;

comt:ININTEGER;data:INOUTtw32);ENDcpu;ARCHITECTUREcpu_blkOFcpuISSIGNALaddr_bus,data_bus:tw32;BEGINALU:BLOCK

PORT(a_bus,b_bus:INtw32;

c_bus:ININTEGER;

第3章VHDL基本描述语句69

d_out:OUTtw32);PORTMAP(a_bus=>addr_bus;

b_bus=>data_bus;

c_bus=>comt;

d_out=>data)BEGIN

d_out<=tw_add(a_bus,b_bus)WHEN

c_bus=0ELSE

tw_sub(a_bus,b_bus)WHENc_bus=1ELSE

a_bus;ENDBLOCKALU;ENDcpu_blk;

第3章VHDL基本描述语句703、模块并发性及执行条件语句的并发执行分为两类:一类是无条件并发执行,另一类是有条件并发执行。有条件并发执行的BLOCK称为GUARDEDBLOCK。

例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffbISPORT(d,clk:INbit;

g,gb:OUTbit);ENDdffb;ARCHITECHTUREexampleOFdffbISBEGIN

第3章VHDL基本描述语句71

B1:BLOCK(clk=‘1’)BEGINg<=GUARDEDd;

gb<=GUARDEDNOT(d);ENDBOLOCKB1;ENDexample;第3章VHDL基本描述语句723.2.6参数传递语句参数传递语句(generic)主要用来传递信息给设计实体的某个具体元件,如用来定义端口宽度、器件延迟时间等参数后并将这些参数传递给设计实体。这些参数是待定的,在模拟时,只要generic语句将待定参数初始化即可。73例:两输入与门Libraryieee;useieee.std_logic_1164.all;Entityand2is

generic(delay:time:=10ns);Port(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDand2;ARCHITECTUREbehaveOFand2ISBEGINc<=aandbafter(delay);ENDbehave;3.2.6参数传递语句74例:例化元件来改变参数值libraryieee;useieee.std_logic_1164.all;entityexampleISport(a1,b1,a2,b2:instd_logic;out1,out2:outstd_logic);endexample;architecturebehaveofexampleis

componentand2

generic(delay:time);port(a,b:instd_logic;c:outstd_logic);endcomponent;Beginu1:and2genericmap(6ns)

portmap(a1,b1,out1);u2:and2genericmap(8ns)portmap(a2,b2,out2);Endbehave;3.2.6参数传递语句参数匹配命令genericmap将二输入与门中的延迟时间参数分别映射为6ns和8ns,以满足不同工艺、不同材料器件的要求。元件例化语句:将端口a映射到信号a1,端口b映射到b1,端口c映射到out1。753.2.7元件例化语句结构体描述方式就是在多层次的设计中,通过调用库中的元件或是已经设计好的模块来完成设计实体功能的描述。在结构体中,描述只表示元件(或模块)和元件(或模块)之间的互连关系,就像网表一样。描述元件间的互连关系就是用元件例化语句实现的。在进行元件例化时,首先要进行例化元件的说明,元件说明部分使用component语句,说明在结构体中所调用的模块。如果所调用的模块在元件库中并不存在时,必须要首先进行元件的创建,然后将其放在工作库中,通过调用工作库来引用该元件。元件例化语句是一种应用十分广泛的语句,主要用于模块化的设计。76component语句的书写格式为:component<引用元件名>[generic<参数说明>;]port<端口说明>;endcomponent;其中:“引用元件名”用来指定结构体中的例化元件,该元件必须已经存在于调用的工作库中;generic语句表示需要参数传递说明。component语句对要引用的元件说明以后,就可以在结构体中进行元件例化以使用该元件,元件例化语句的书写格式为:<标号名:><元件名>[genericmap(参数映射)]portmap(端口映射);其中:标号名是元件例化的唯一标志。映射语句把元件的参数和端口与实际连接的信号对应起来,以进行元件的应用。3.2.7元件例化语句771.位置映射:portmap语句中实际信号的书写顺序与component语句中端口说明中的书写顺序保持一致。3.2.7元件例化语句映射方法:位置映射

温馨提示

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

评论

0/150

提交评论