FPGA设计及应用 课件 第4-6章 VHDL描述语句-包集、元件子程序_第1页
FPGA设计及应用 课件 第4-6章 VHDL描述语句-包集、元件子程序_第2页
FPGA设计及应用 课件 第4-6章 VHDL描述语句-包集、元件子程序_第3页
FPGA设计及应用 课件 第4-6章 VHDL描述语句-包集、元件子程序_第4页
FPGA设计及应用 课件 第4-6章 VHDL描述语句-包集、元件子程序_第5页
已阅读5页,还剩175页未读 继续免费阅读

下载本文档

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

文档简介

FPGA技术及应用4.1VHDL描述语句概述VHDL是什么?硬件描述语言:用于描述数字系统的结构与行为。三大核心组成实体(Entity):定义电路输入/输出接口。结构体(Architecture):描述内部逻辑与行为。进程(Process):实现时序与控制逻辑。VHDL通过实体-结构体-进程三级结构,清晰定义电路接口、功能与时序,是数字系统设计的基础工具。VHDL结构与示例实体声明(接口):结构体(实现):进程(时序控制):ENTITYgateISPORT(a,b:INBIT;y:OUTBIT);ENDENTITY;ARCHITECTUREdataflowOFgateISBEGINy<=aANDb;ENDARCHITECTURE;PROCESS(a,b)BEGINIFa='1'THENy<=b;ENDIF;ENDPROCESS;4.2顺序语句什么是顺序语句?执行特点:仿真时按书写顺序依次执行,实际硬件中不一定按相同顺序实现使用范围:仅能在进程(Process)、过程(Procedure)和函数(Function)中使用功能分类:时序控制(wait语句)、条件判断(if/case语句)、循环迭代(loop语句)、子程序调用(过程/函数)常用顺序语句类型:赋值语句、控制语句、跳转语句、辅助语句信号赋值变量赋值if/case/loop/waitexit/next/returnnull(空操作)assert/report进程(process)

进程(process)内部的语句是一种顺序描述语句,其内部经常包括if,wait,case或loop语句。特点:

1、进程与进程,或其它并发语句之间的并发性;

2、进程内部的顺序性;

3、要么使用敏感信号列表(sensitivitylist),要么使用wait语句,二者不可同时使用。

4、进程必须包含在主代码段中,当敏感信号列表中的某个信号发生变化,或者wait语句的条件满足时,process内部的代码就顺序执行一次。语法结构:6[标记:]process[(敏感信号表)]

[variablename:type[range][:=初始值]]begin{顺序描述语句}

endprocess[标记];对临时连线的赋值,不可综合可选,增强代码可读性,命名规则:非关键字7敏感信号表:进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。格式:信号名称{,信号名称}注意:若电路模块对某输入信号不“敏感”,则该输入信号不必放入敏感信号列表中。如同步时序电路中只对clk和rst这两个输入信号敏感,而对data,addr等输入信号不敏感,则敏感信号列表中只需放入clk和rst即可;在纯组合逻辑电路中,电路模块对任意一个输入信号都是敏感的,所以如果要使用process来实现一段组合逻辑,则必须将所有的输入信号都放入敏感信号列表中。在使用顺序代码实现一个同步时序电路时,必须对某些信号边沿的跳变进行监视(典型的是时钟信号clk的上升沿或下降沿);通常使用EVENT(或者STABLE)来监视一个信号是否发生了边沿跳变;通常在process中使用敏感信号clk来实现同步时序电路。9例:带有异步复位端的D触发器data_inqrstclk功能描述:时序逻辑电路的基本单元当输入的时钟信号为上升沿时,输出信号q等于当前输入值;异步复位端rst(reset):rst=‘1’时q=‘0’;优先级高于当前输入值。10实现代码LIBRARYieee;USEieee.std_logic_1164.all;entitydffis

port(d,clk,rst:INstd_logic;q:OUTstd_logic);enddff;architecturebehaviorofdffisbegin

process(clk,rst)

begin

if(rst=‘1’)then

q<=0;

elsif

(clk’eventANDclk=‘1’)thenq<=d;

endif;

end

process;endbehavior;

任意一个信号发生变化时,process中的所有语句就执行一次.D触发器的仿真波形敏感信号表的特点:同步进程的敏感信号表中只有时钟信号。如:

process(clk) begin if(clk’eventandclk=‘1’)then

ifreset=‘1’then data<=“00”; else

data<=in_data; endif; endif; endprocess;异步进程敏感信号表中除时钟信号外,还有其它信号。例:

process(clk,reset)begin

ifreset=‘1’thendata<=“00”;elsif(clk’eventandclk=‘1’)thendata<=in_data;endif;endprocess;14如果有wait语句,则不允许有敏感信号表。

PROCESS(a,b)BEGIN--sequentialstatementsENDPROCESS;

PROCESSBEGIN

WAITON/Untilsignalx/signal_expr;//先

--sequentialstatements//后

ENDPROCESS;赋值语句

赋值语句将一个值或表达式的运算结果传递给某一数据对象,如变量、信号或由此组成的数组。VHDL设计实体内的数据传递以及端口数据的读写都是通过赋值语句的运行实现的。变量赋值语句使用范围仅在进程、过程和函数中使用。书写格式[<语句标号>:]<目的变量>:=<表达式>示例:a:=7;b:=b+1;特性:赋值立即生效、类型必须严格匹配、表达式可包含信号量。注意:变量必须先声明后使用

变量为局部量,仅在定义域

内有效信号赋值语句使用范围只有简单形式的信号赋值语句能够在进程、过程和函数中使用。书写格式[<语句标号>:]<信号名><=[<延迟机制>]<波形><波形>::={<表达式>[after<时间表达式>]}{,…}示例:基础赋值:a<=notbafter10ns;

多波形赋值:y<=0after5ns,1after15ns;特性:数据类型和位长必须匹配、非立即生效、值暂存于驱动器、支持延迟机制延迟机制与敏感控制两种延迟模型:传输延迟(Transport):脉冲完全不失真复现惯性延迟(Inertial):受电路惯性影响(默认)敏感信号控制:MUX:PROCESS(A,B,SEL)IS--a、b和sel为进程语句的敏感信号BEGINCASESELISWHEN'0'=>Y<=AAFTER5NS;--IfSEL='0',thenassignAtoYWHEN'1'=>Y<=BAFTER5NS;--IfSEL='1',thenassignBtoYENDCASE;ENDPROCESSMUX;关键注意事项:延迟时间从赋值时刻计算、敏感信号变化激活进程执行、赋值语句本身

不消耗时间wait语句功能作用替代进程敏感信号列表、控制进程的挂起与执行、提供进程同步机制四种基本形式1.WAIT-无限等待2.WAITON-信号变化等待3.WAITUNTIL-条件等待

4.WAITFOR-超时等待特性:布尔表达式必须包含至少一个信号量、进程挂起时内部变量不再改变、通过信号变化触发等待解除WAITON语句书写格式[<语句标号>:]WAITON<信号名>{,…};功能特点等待指定信号变化、信号变化后激活进程两种等价形式:WAITON语句和简化版本,即敏感信号表等待语句显式WAITONHALF_ADD:PROCESSISBEGINSUM<=AxorB;CARRY<=AandB;WAITONA,B;

--A和B为敏感信号,任一发生变化都将激活进程ENDPROCESSHALF_ADD;敏感信号列表HALF_ADD:PROCESS(A,B)IS--敏感信号为A和B,WAITON语句被激活BEGINSUM<=AxorB;CARRY<=AandB;ENDPROCESSHALF_ADD;WAITUNTIL与WAITFOR语句WAITUNTIL语句书写格式:[<语句标号>:]WAITUNTIL<布尔表达式>;特点:建立隐式敏感信号表达式示例:WAITUNTIL((X+Y)<100);执行:信号X或Y任何一个变化时均会评估条件,条件为真时继续执行。WAITFOR语句书写格式:[<语句标号>:]WAITFOR<时间表达式>;特点:指定等待时间示例:WAITFOR10NS;WAITFOR(X+Y);执行:时间到达后继续执行。组合等待语句书写格式[<语句标号>:]wait[on<信号名>{,…}][until<布尔表达式>][for<时间表达式>]特点多个条件任意组合,任一条件满足即解除等待应用场景对比

等待类型适用场景特点WAITON信号驱动信号变化触发WAITUNTIL条件同步条件满足触发WAITFOR定时操作时间到达触发if语句只能用于顺序代码,只能在process、function和procedure中出现。语法结构:

if(表达式)then

语句1;--可以多个语句,不必使用{}

语句2;

elsif(表达式)then

或者else

endif;24if语句的门闩控制

例:if(ena=‘1’)thenq<=d;

endif;---没有else描述!综合后生成锁存器(latch)if条件then

顺序处理语句;endif;注意:用if或者case语句做逻辑电路的时候,必须为信号设置默认值,避免生成latch电路。有两种方法:在if,case语句之前对目标信号进行赋值,采用这种方法,就不必专门写else。whenothers语句对信号进行默认赋值。在else或者whenothers语句中对信号进行默认条件下的赋值。如果违反了上述规则,那么会在综合电路的时候形成一个transparentlatch,也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。27条件改为时钟沿,则生成D触发器:注意:在时序电路中,如果没有在else语句或者whenothers语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。

29if语句的二选择控制

格式:

用条件来选择两条不同程序执行的路径。if条件then

顺序处理语句;else

顺序处理语句;endif;30if语句的多选择控制if语句的多选择控制又称为if语句的嵌套。

格式:

if

条件1

then

顺序处理语句1;elsif

条件2

then

顺序处理语句2;┇elsif

条件n

then

顺序处理语句n;else

顺序处理语句n+1;endif;31典型电路是多选一(四选一)电路。if_then_elsif语句中隐含了优先级别的判断,最先出现的条件优先级最高,可用于设计具有优先级的电路,如8-3优先级编码器。如果不希望出现优先级的情况,则可使用CASE语句。33例2模10计数器计数器digit(3:0)clk功能描述:循环累加clk上升沿的次数,输出到4位的digit。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYcounterISport(clk:INstd_logic;digit:OUTintegerrange0to9);ENDcounter;3434ARCHITECTUREcounterofcounterISbegincount:process(clk)variabletemp:integerrange0to10;beginif(clk’eventANDclk=‘1’)thentemp:=temp+1;

if(temp=10)thentemp:=0;endif;endif;digit<=temp;endprocesscount;endcounter;未赋初值,因为4位宽,所以可能>10而<=15:周期的浪费!另,不能从0开始计数!可加复位信号4bit位宽常数比较电路,代价较大,如何优化?与常数0进行比较,递减计数,一个简单的“与”即可,不必构建复杂的全比较器!不是latch而是二选一的选择器35ARCHITECTUREcounterofcounterISbegincount:process(clk)variabletemp:integerrange0to10;beginif(clk’eventANDclk=‘1’)thentemp:=temp-1;if(temp=0)thentemp:=10;endif;endif;digit<=temp;endprocesscount;endcounter;改进后,判断case语句36语法结构:

CASE选择项IS

WHEN选择值1=>顺序执行语句1;

WHEN选择值2=>顺序执行语句2;

........WHENOTHERS=>顺序语句n;ENDCASE;特点:在每选择值必须覆盖所有可能情况、选择值不允许重复、分支条件并行处理、when子句顺序不影响执行结果。37例1:

CASEcontrolISwhen“00”=>x<=a;y<=b;when“01”=>x<=b;y<=c;whenOTHERS=>x<=“0000”;y<=“zzzz”;ENDCASE;代表了所有未列出的可能情况。注意:可使用关键字NULL来表示操作没有发生,如:

whenothers=>null;38例2:4位二进制加法器

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBinary_AdderISPORT(A,B:INSTD_LOGIC_VECTOR(3DOWNTO0);CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDBinary_Adder;ARCHITECTUREbehavioralOFBinary_AdderISBEGIN

PROCESS(A,B,CIN)BEGIN

CASECINIS

WHEN'0'=>SUM<=A+B;COUT<='0'WHENSUM>"1001"ELSE'1';

WHEN'1'=>SUM<=A+B+1;COUT<='0'WHENSUM>"1001"ELSE'1';ENDCASE;ENDPROCESS;ENDbehavioral;39CASE语句和IF语句的比较

原则上说来,IF/ELSE语句中ELSE的出现可能会造成综合后的电路中出现优先级解码器。(CASE语句中不会出现这种情况),但在实际综合时综合工具的优化功能往往不会出现这种情况。因此,使用IF语句和CASE语句编写的代码在综合优化后最终生成的电路结构通常是一样的。注意编码风格!

例子:------------IF语句----------IF(sel=“00”)thenx<=a;elsif(sel=“01”)thenx<=b;elsif(sel=“10”)thenx<=c;elsex<=d;ENDIF;----------CASE语句----------CASEselISwhen“00”=>x<=a;when“01”=>x<=b;when“10”=>x<=c;whenothers=>x<=d;endcase;loop语句loop语句的使用使用情况:当一段代码需要多次重复、顺序地执行时,loop语句非常有效。使用范围:只能在process、function和procedure中使用;三种基本形式对比

类型特点适用场景loop无限循环特殊硬件建模forloop固定次数循环数组遍历、固定迭代whileloop条件循环条件满足时循环loop语句书写格式:[<语句标号>:]loop{<顺序语句>;}Endloop[<语句标号>];forloop语句书写格式:[<语句标号>:]for<循环变量>in<离散范围>loop{<顺序语句>;}endloop[<语句标号>]说明离散范围:定义变量取值范围和循环次数(递增:TO/递减:DOWNTO)执行:变量每取一个值就执行一次循环体whileloop语句书写格式:

[<语句标号>:]while<布尔表达式>loop{<顺序语句>;}endloop[<语句标号>];特点:条件控制循环,即在每次迭代前要测试<布尔表达式>是否为真,如果是真,执行迭代,否则迭代结束。43例:12位乘法器

USEIEEE.STD_LOGIC_1164.ALL;ENTITYmultiplierISPORT(A,B:INSTD_LOGIC_VECTOR(11DOWNTO0);P:OUTSTD_LOGIC_VECTOR(23DOWNTO0) );ENDmultiplier;ARCHITECTUREbehavioralOFmultiplierISBEGINPROCESS(A,B)VARIABLETEMP:STD_LOGIC_VECTOR(23DOWNTO0);BEGINTEMP:=(OTHERS=>'0');

FORIIN0TO11LOOPFORJIN0TO11LOOPIF(A(I)='1'ANDB(J)='1')THENTEMP(I+J):=TEMP(I+J)+'1';ENDIF;

ENDLOOP;ENDLOOP;P<=TEMP;ENDPROCESS;ENDbehavioral;exit语句功能作用循环控制语句,提前终止循环执行,跳转到指定位置继续执行。语法格式:exit[<语句标号>][when<条件>];执行规则:有条件退出:’exitwhen条件’-条件为真时退出无条件退出:’exit’-立即退出循环带标号退出:跳转到指定标号位置无标号退出:跳到当前循环endloop后注意:在多重循环中,只能退出exit所在层的循环。45例:4变量的卡诺图最小化算法

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYKarnaugh_mapISPORT(A,B,C,D:INSTD_LOGIC_VECTOR(1DOWNTO0);F:OUTSTD_LOGIC);ENDKarnaugh_map;ARCHITECTUREbehavioralOFkarnaugh_mapISBEGINPROCESS(A,B,C,D)VARIABLEMIN_TERMS:STD_LOGIC_VECTOR(15DOWNTO0):=(OTHERS=>'0');VARIABLEDONT_CARE:STD_LOGIC_VECTOR(15DOWNTO0):=(OTHERS=>'0');VARIABLENUM_TERMS:INTEGER:=16;BEGIN

FORIIN0TO15LOOP

IF(A(I/4)='0'ANDB((I/2)MOD2)='0'ANDC(IMOD2)='0')THEN

IF(F(I)='1')THENMIN_TERMS(I):='1';NUM_TERMS:=NUM_TERMS-1;

ELSEDONT_CARE(I):='1';

ENDIF;ENDIF;

ENDLOOP;

46LOOP

EXITWHENNUM_TERMS=0;FORIIN0TO15LOOPIF(MIN_TERMS(I)='1')THENFORJINI+1TO15LOOPIF(MIN_TERMS(J)='1')THENIF(I/4=J/4)THENIF(MIN_TERMS(I-2*(I/4)+J-I)/='1')THENMIN_TERMS(I-2*(I/4)+J-I):='1';NUM_TERMS:=NUM_TERMS-1;ENDIF;ELSIF(I/2=J/2)THENIF(MIN_TERMS(I-I/2*2+2*(J/4)+J/2-I/2*2)/='1')THENMIN_TERMS(I-I/2*2+2*(J/4)+J/2-I/2*2):='1';NUM_TERMS:=NUM_TERMS-1;ENDIF;ELSIF(IMOD2=JMOD2)THENIF(MIN_TERMS(I+2*(J-I)/4)/='1')THENMIN_TERMS(I+2*(J-I)/4):='1';NUM_TERMS:=NUM_TERMS-1;ENDIF;ENDIF;ENDIF;

ENDLOOP;ENDIF;ENDLOOP;ENDLOOP;F<='1'WHENMIN_TERMS/=(OTHERS=>'0')ELSE'0';ENDPROCESS;ENDbehavioral;next语句功能作用循环控制语句,跳过当前迭代的剩余语句,直接开始下一次循环迭代。书写格式:next[<语句标号>][when<条件>];执行规则:有条件跳过:’nextwhen条件’-条件为真时跳过无条件跳过:’next’-立即跳过本次迭代带标号跳转:跳转到指定标号位置开始新迭代无标号跳转:回到当前循环开始处注意:只能用于当前循环层内部,不能跨越多重循环跳转,与exit语句功能完全不同。48例:4状态有限状态机-next语句实现状态转移LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYFinite_state_machineISPORT(CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;DATA_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);DATA_OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);FINISHED:OUTSTD_LOGIC);ENDFinite_state_machine;ARCHITECTUREbehavioralOFFinite_state_machineISTYPESTATE_TYPEIS(S0,S1,S2,S3);SIGNALCURRENT_STATE,NEXT_STATE:STATE_TYPE:=S0;SIGNALCOUNTER:NATURAL:=0;BEGINPROCESS(CLK,RESET)BEGINIFRESET='1'THENCURRENT_STATE<=S0;COUNTER<=0;ELSIFRISING_EDGE(CLK)THENCURRENT_STATE<=NEXT_STATE;ENDIF;

ENDPROCESS;第一个PROCESS过程

功能:状态更新逻辑

-复位信号为高时:状态重置为S0,计数器清零

-时钟上升沿时:当前状态更新为下一状态

49PROCESS(CURRENT_STATE,DATA_IN,COUNTER)BEGINCASECURRENT_STATEISWHENS0=>IFCOUNTER<10THEN

NEXT_STATE<=S0;COUNTER<=COUNTER+1;ELSE

NEXT_STATE<=S1;COUNTER<=0;ENDIF;WHENS1=>IFDATA_IN="00000000"THEN

NEXT_STATE<=S2;ELSE

NEXT_STATE<=S3;ENDIF;WHENS2=>

NEXT_STATE<=S3;WHENS3=>

NEXT_STATE<=S0;ENDCASE;ENDPROCESS;第二个PROCESS过程

功能:下一状态判断逻辑

-根据当前状态、输入数据和计数器值确定下一状态

-根据条件判断,使用next语句实现状态转移,并对计数器进行更新

PROCESS(CURRENT_STATE,DATA_IN)BEGINCASECURRENT_STATEISWHENS0=>DATA_OUT<="00000000";WHENS1=>DATA_OUT<=DATA_IN;WHENS2=>DATA_OUT<="11111111";WHENS3=>DATA_OUT<="01010101";ENDCASE;

ENDPROCESS;PROCESS(CURRENT_STATE)BEGINCASECURRENT_STATEISWHENS0=>FINISHED<='0';WHENS1=>FINISHED<='0';WHENS2=>FINISHED<='0';WHENS3=>FINISHED<='1';ENDCASE;ENDPROCESS;ENDbehavioral;第四个PROCESS过程

功能:完成信号生成逻辑

-状态S3时输出高电平完成信号

-其他状态时输出低电平完成信号

第三个PROCESS过程

功能:数据输出逻辑

-根据当前状态和输入数据生成输出数据

-不同状态对应不同的输出数据模式

return语句使用范围仅能在过程(PROCEDURE)和函数(FUNCTION)中使用书写格式过程中使用为:[<语句标号>:]return;函数中使用为:[<语句标号>:]return<表达式>;功能作用:过程中:立即中止执行并返回函数中:返回结果值并终止函数执行说明:return可出现在函数/过程的任意位置,函数中的return必须带返回值,且返回值类型必须与函数声明一致。52例:函数中return语句使用FUNCTIONcalculate_average(A,B,C,D:INTEGER)RETURNREALISVARIABLESUM:INTEGER:=A+B+C+D;VARIABLEAVERAGE:REAL;BEGINIFSUM=0THENRETURN0.0;--如果和为0,直接返回0作为平均值ELSEAVERAGE:=REAL(SUM)/4.0;--计算并存储平均值IFAVERAGE>100.0THENRETURN100.0;--如果平均值大于100,直接返回100ELSERETURNAVERAGE;--否则返回计算得到的平均值ENDIF;ENDIF;ENDFUNCTION;注意:尽管这个例子模拟了一个具有返回值的函数,但在VHDL中,我们通常使用信号来代替返回值。null语句功能作用空操作语句-执行时不进行任何实际操作书写格式[<语句标号>:]null;执行效果不产生任何硬件逻辑立即继续执行下一条语句相当于一个空占位符典型使用场景在case语句中显式处理所有可能分支作为待完善代码的临时占位满足语法完整性要求示例代码casestateiswhenS0=>do_something;

whenS1=>null;--显式表示无操作

whenothers=>null;endcase;assert语句功能作用设计验证与调试工具、用于仿真时错误检测和警告生成、综合时会被自动忽略,不影响硬件实现书写格式assert<条件表达式>[report<报告信息>][severity<错误级别>];执行规则条件表达式为真:继续执行下一条语句条件表达式为假:输出报告信息和错误级别报告信息默认值缺省report时:默认消息"assertionviolation"缺省severity时:默认错误级别ERROR错误严重级别

级别说明使用场景NOTE提示信息一般性提示WARNING警告信息潜在问题提示ERROR错误信息功能错误(默认级别)FAILURE严重错误系统级严重错误57例:assert语句验证乘法器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmultiplierISGENERIC(WIDTH:INTEGER:=8);PORT(A,B:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);RESULT:OUTSTD_LOGIC_VECTOR(2*WIDTH-1DOWNTO0);CLK:INSTD_LOGIC;RESET:INSTD_LOGIC);ENDmultiplier;ARCHITECTUREbehavioralOFmultiplierISBEGINPROCESS(CLK,RESET)BEGINIFRESET='1'THENRESULT<=(OTHERS=>'0');58ELSIFRISING_EDGE(CLK)THENASSERTA'LENGTH=B'LENGTHREPORT"INVALIDINPUTLENGTHS"SEVERITYERROR;ASSERTRESULT'LENGTH=A'LENGTH+B'LENGTHREPORT"INVALIDOUTPUTLENGTH"SEVERITYERROR;FORIIN0TOWIDTH-1LOOPIFB(I)='1'THENRESULT<=STD_LOGIC_VECTOR(UNSIGNED(RESULT)+(UNSIGNED(A)<<I));ENDIF;ENDLOOP;ENDIF;ENDPROCESS;ENDbehavioral;第二个assert语句

用于检查输出RESULT的长度是否等于输入信号的长度之和。如果长度不正确,将生成一个错误报告。

第一个assert语句

用于检查输入A和B的长度是否相等。如果长度不相等,将生成一个错误报告。

report语句基本特性无条件执行:总是产生信息报告调试工具:用于仿真时输出状态信息版本要求:仅VHDL-1993及以后标准支持书写格式[<语句标号>:]report<报告信息>[severity<错误级别>];与assert的等价关系缺省severity时相当于:assertfalsereport"信息"severitynote;错误级别选项NOTE→WARNING→ERROR→FAILURE(缺省时为NOTE级别)60例:除法器零除检测-report语句使用LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdividerISGENERIC(WIDTH:INTEGER:=8);PORT(DIVIDEND,DIVISOR:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);QUOTIENT,REMAINDER:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);ISVALID:OUTSTD_LOGIC);ENDdivider;ARCHITECTUREbehavioralOFdividerISBEGIN

PROCESS(DIVIDEND,DIVISOR)VARIABLEDIVIDEND_TEMP:STD_LOGIC_VECTOR(WIDTHDOWNTO0);VARIABLEDIVISOR_TEMP:STD_LOGIC_VECTOR(WIDTHDOWNTO0);VARIABLEQUOTIENT_TEMP:STD_LOGIC_VECTOR(WIDTHDOWNTO0);VARIABLEREMAINDER_TEMP:STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);BEGINDIVIDEND_TEMP:=DIVIDEND;DIVISOR_TEMP:=DIVISOR;QUOTIENT_TEMP:=(OTHERS=>'0');61REMAINDER_TEMP:=(OTHERS=>'0');FORIINWIDTH-1DOWNTO0LOOPIFDIVIDEND_TEMP(WIDTHDOWNTOWIDTH-I)>=DIVISOR_TEMPTHENQUOTIENT_TEMP(I):='1';DIVIDEND_TEMP:=STD_LOGIC_VECTOR(UNSIGNED(DIVIDEND_TEMP)-UNSIGNED(DIVISOR_TEMP));ENDIF;ENDLOOP;ISVALID<='1'WHENDIVISOR_TEMP(WIDTH)='0'ELSE'0';QUOTIENT<=QUOTIENT_TEMP(WIDTH-1DOWNTO0);REMAINDER<=DIVIDEND_TEMP(WIDTH-2DOWNTO0);IFISVALID='0'THEN

REPORT"DIVISIONBYZEROERROR"SEVERITYERROR;ENDIF;ENDPROCESS;ENDbehavioral;report语句

检测是否存在除以零的情况。如果ISVALID信号为“0”,则表示除数为零,将生成一个错误报告。

过程调用语句特点在process中调用预定义的过程可作为顺序语句或并行语句使用实现模块化设计和代码复用书写格式[<语句标号>:]<过程名>[(实参数列表)];实参类型信号(signal)变量(variable)常量(constant)63例:三级处理流水线LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcomplexmoduleISGENERIC(WIDTH:INTEGER:=8);PORT(INPUT:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);OUTPUT:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);CLK:INSTD_LOGIC);ENDcomplexmodule;ARCHITECTUREbehavioralOFcomplexmoduleISSIGNALINTERMEDIATE1:STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNALINTERMEDIATE2:STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

PROCEDURESTAGE1(IN_SIGNAL:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);OUT_SIGNAL:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0))IS

BEGIN--STAGE1LOGICGOESHEREOUT_SIGNAL<=IN_SIGNAL;--PLACEHOLDERLOGIC

ENDSTAGE1;第一级处理

接收原始输入信号,进行初步处理。

64

PROCEDURESTAGE2(IN_SIGNAL:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);OUT_SIGNAL:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0))IS

BEGIN--STAGE2LOGICGOESHEREOUT_SIGNAL<=IN_SIGNAL;--PLACEHOLDERLOGIC

ENDSTAGE2;

PROCEDURESTAGE3(IN_SIGNAL:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);OUT_SIGNAL:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0))IS

BEGIN--STAGE3LOGICGOESHEREOUT_SIGNAL<=IN_SIGNAL;--PLACEHOLDERLOGIC

ENDSTAGE3;BEGIN

PROCESS(CLK)BEGINIFRISING_EDGE(CLK)THENSTAGE1(INPUT,INTERMEDIATE1);STAGE2(INTERMEDIATE1,INTERMEDIATE2);STAGE3(INTERMEDIATE2,OUTPUT);ENDIF;ENDPROCESS;ENDbehavioral;过程调用语句

按顺序调用不同的阶段。

第三级处理

接收STAGE2的输出,进行最终处理并产生最终输出。

第二级处理

接收STAGE1的输出,进行中间处理。

4.3并行语句概述现有的软件编程语言,如机器语言、汇编语言、结构化语言如C语言、面向对象语言乃至形式化语言—本质上都是依据冯.诺依曼模型,由CPU以指令方式串行执行—语句都是逐行顺序执行的,称之为程序。VHDL代码--模拟硬件电路的实际执行方式,所有的逻辑门在任何时刻都处于执行状态,称之为代码--按执行顺序可分为两大类:

并行(Concurrent)代码(硬件电路本质)顺序(Sequential)代码并行语句通过在一个过程中使用并行关键字(ParallelKeywords)来实现。常见的并行关键字包括并行信号赋值语句(ConcurrentSignalAssignment)、并行过程调用语句(ConcurrentProcedureCall)并行断言语句(ConcurrentAssertion)。VHDL结构体中的并行语句主要有八种:进程(process)、块(block)、并行信号赋值、并行过程调用、并行断言、类属(generic)、元件例化和生成(generate)语句。注意:并行是指并行语句之间没有执行顺序的先后之分,但不意味着并行语句内部也一定是并行执行的。libraryieee;use.std_logic_1164.all;entity

en_na

IS

genric(…);

port(……);

end

en_na;architecturearc_naofen_naISsignal……begin……process(clk,…)variable…begin……end

process;……

endarch_name;并行语句顺序语句回顾VHDL代码结构!注意定义信号和变量的位置!并行执行和顺序执行组合逻辑VS并行执行代码时序逻辑VS顺序执行代码69VHDL代码本质上是并行执行的。但在另一方面,为了实现某些本质上具有串行执行特点的功能,如时序相关的功能,VHDL代码也提供了能够顺序执行的语句,如:

process/function/procedure语句或结构。process/function/procedure内部的代码才是顺序执行的(往往在设计时序电路时),但这些语句或结构之间仍然是并发执行的。并行代码又称“数据流代码”。70例:一段包含3个并行描述语句的代码并行代码要点:除卫氏块(guardedblock)外,仅使用并发描述语句无法实现同步时序电路(异步时序电路是可以的;)

通常只使用并发描述语句实现组合逻辑电路;顺序代码要点:要实现时序逻辑电路,必须使用顺行描述语句;顺行代码可同时实现组合逻辑电路与时序逻辑电路。进程语句工作原理敏感信号触发:任一敏感信号变化激活进程顺序执行:进程内部语句按顺序执行循环运行:执行完毕→挂起→等待下次激活书写格式[进程标号:]PROCESS[(敏感信号参数表)][IS] [进程说明部分] BEGIN

顺序描述语句 ENDPROCESS[进程标号];关键特性进程间并行执行,进程内顺序执行、通过信号完成进程间通信、敏感信号列表必须完整,否则可能导致仿真差异。72敏感信号表:进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。格式:信号名称{,信号名称}注意:若电路模块对某输入信号不“敏感”,则该输入信号不必放入敏感信号列表中。如同步时序电路中只对clk和rst这两个输入信号敏感,而对data,addr等输入信号不敏感,则敏感信号列表中只需放入clk和rst即可;在纯组合逻辑电路中,电路模块对任意一个输入信号都是敏感的,所以如果要使用process来实现一段组合逻辑,则必须将所有的输入信号都放入敏感信号列表中。在使用顺序代码实现一个同步时序电路时,必须对某些信号边沿的跳变进行监视,信号边沿检测方法如下表:重要设计规则一个进程只对应一个时钟信号的同步时序逻辑敏感信号列表或wait语句二选一,不能同时使用进程说明部分不能定义信号和共享变量多个条件语句允许,但只能有一个时钟边沿检测

边沿类型检测方法1检测方法2上升沿信号'EVENTAND信号='1'RISING_EDGE(信号)下降沿信号'EVENTAND信号='0'FALLING_EDGE(信号)74例:二输入与门真值表如下程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexampleISPORT(A:INSTD_LOGIC;B:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDexample;ARCHITECTUREbehaveOFexampleISBEGINABY000100010111

P1:PROCESS(A,B)VARIABLECOMB:STD_LOGIC_VECTOR(1DOWNTO0);BEGINCOMB:=A&B;CASECOMBISWHEN"00"=>Y<='0';WHEN"10"=>Y<='0';WHEN"01"=>Y<='0';WHEN"11"=>Y<='1';WHENOTHERS=>Y<='X';ENDCASE;ENDPROCESSP1;ENDbehave;块语句块语句将一系列并行描述语句进行组合,目的是改善并行语句及其结构的可读性。可使结构体层次鲜明,结构明确。两种类型的块:简单块(simpleblock)卫氏块(guardedblock)简单块概念仅仅是一种对原有代码进行区域分割的方式。将一系列的并发描述语句放在一个简单块中的目的是增强代码的可读性和可维护性。语法结构:块标号:BLOCK

接口说明

类属说明BEGIN

并行语句ENDBLOCK块标号;块标号是必须的

这两部分是对BLOCK的接口设置及外界信号的连接状况加以说明

77例:使用简单块对一段构造体代码进行规整

architectureexample...begin....block1:block

begin....endblockblock1;....block2:block

begin....endblockblock2;....

endexample;注意:块语句的使用不影响逻辑功能以下两种描述结果相同:描述一

a1:out1<=‘1’after2ns;a2:out2<=‘1’after2ns;a3:out3<=‘1’after2ns;描述二

a1:out1<=‘1’after2ns;blk1:blockbegina2:out2<=‘1’after2ns;a3:out3<=‘1’after2ns;endblockblk1;卫氏块概念仅仅是一与simpleblock相比,多了一个卫氏表达式。只有当卫氏表达式的值为真时,含有关键字guarded的语句才能执行(相当于条件执行语句,容易生成latch,小心!)。语法结构:块标号:BLOCK(卫氏表达式)

接口说明

类属说明

begin

guarded语句和其它并性描述语句

ENDBLOCK块标号;80例:用guardedblock实现锁存器功能描述:只有当clk=‘1’时,才执行语句q<=dLIBRARYieee;

USEieee.std_logic_1164.all;

entitylatchis

port(d,clk:INstd_logic;q:OUTstd_logic);

endlatch;

architecturelatchoflatchisbegin

b1:block

(clk=‘1’)

begin

q<=guardedd;

endblockb1;

endlatch;

卫氏表达式卫氏语句并行信号赋值语句基本概念并行执行:结构体中的多条赋值语句同时执行

格式统一:`赋值目标<=表达式`硬件描述:直接描述电路行为,与书写顺序无关两种主要类型条件信号赋值语句:带优先级的条件判断

选择信号赋值语句:无优先级的并行选择

核心特点所有赋值语句并发执行、执行结果与书写顺序无关、通过信号变化触发执行。条件信号赋值语句书写格式赋值目标<=表达式1WHEN赋值条件1ELSE

表达式2WHEN赋值条件2ELSE ...

表达式n;特点有优先级:条件按顺序判断,第一个满足的条件生效

必须完整:需要覆盖所有可能情况适用场景:多条件且有优先级要求的逻辑条件赋值语句举例:IF(SIGNAL_VALUE>THRESHOLD){OUTPUT_SIGNAL=MAX_VALUE;}ELSE{OUTPUT_SIGNAL=MIN_VALUE;}如果输入大于阈值输出最大值,否则输出最小值选择信号赋值语句书写格式WITH选择表达式SELECT赋值目标信号<=表达式1WHEN选择值1,

表达式2WHEN选择值2, ...

表达式nWHEN选择值n;特点无优先级,所有条件并行判断;选择值必须互斥且全覆盖;必须完整,需要`WHENOTHERS`处理剩余情况85例:4选1数据选择器

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexampleISPORT(A,B,C,D:INSTD_LOGIC_VECTOR(3DOWNTO0); S:INSTD_LOGIC_VECTOR(1DOWNTO0);Y:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDexample;ARCHITECTUREbehaveOFexampleISBEGIN WITHSSELECT Y<=AWHEN"00", BWHEN"01", CWHEN"10", DWHEN"11", "0000"WHENOTHERS;ENDbehave;SY00A01B10C11D真值表程序两种语句对比设计选择建议

使用条件信号赋值:当条件有优先级要求时

使用选择信号赋值:当选择值互斥且并行判断时

都必须保证条件全覆盖,避免锁存器产生

特性条件信号赋值选择信号赋值优先级有无执行方式顺序判断并行匹配条件要求条件表达式选择值完整性需要全覆盖必须互斥且全覆盖并行过程调用语句基本概念并行执行:同时调用多个过程

功能封装:将功能模块化为过程

效率提升:提高系统并行处理能力书写格式PROCEDURE过程名(参数说明)BEGIN

功能描述语句ENDPROCEDURE过程名;过程名(参数表);重要规则调用语句后必须加分号;参数必须是常量或信号,不能是变量;参数需明确方向:IN,OUT,INOUT;返回值通过输出参数传递。88例:过程的使用ARCHITECTUREbehavioralOFexampleIS

PROCEDUREPROC1(INPUT:INSTD_LOGIC;OUTPUT:OUTSTD_LOGIC)ISBEGIN--过程的实现OUTPUT<=NOTINPUT;ENDPROCEDURE;

PROCEDUREPROC2(INPUT:INSTD_LOGIC;OUTPUT:OUTSTD_LOGIC)ISBEGIN--过程的实现OUTPUT<=INPUT;ENDPROCEDURE;BEGIN--信号声明SIGNALA,B,C:STD_LOGIC;--并行调用两个过程PROC1(A,B);PROC2(B,C);ENDbehavioral;

PROC1对信号A取反,结果存入BPROC2将信号B直通,结果存入C两个过程调用并行执行并行断言语句基本功能条件检查:对表达式真假性进行并行判断仿真调试:主要用于程序仿真和测试阶段

人机对话:提供警告或错误信息输出书写格式assert条件[report输出信息][severity级别]基本功能条件检查:对表达式真假性进行并行判断仿真调试:主要用于程序仿真和测试阶段错误严重级别(严重程度从低到高)NOTE:提示信息➪WARNING:警告信息➪ERROR:错误信息(默认级别)➪FAILURE:严重错误信息。90例:ARCHITECTUREbehavioralOFexampleISBEGIN--

温馨提示

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

评论

0/150

提交评论