您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 41VHDL数字电路设计教程第6讲 顺序代码
1第6章顺序代码VHDL本质上是一种并发执行的代码,但是出于设计同步时序电路的需要,需要使用一些能够顺序执行的语句块,包括:PROCESS、FUNCTION、PROCEDURE。这些语句块之间仍然是并发执行的,但内部是顺序执行的,称为顺序代码,又称行为描述代码。使用顺序代码不但可以实现时序逻辑,还可以实现组合逻辑。26.1、进程(process)进程(process)内部的语句是一种顺序描述语句,其内部经常包括if,wait,case或loop语句。特点:1、进程与进程,或其它并发语句之间的并发性;2、进程内部的顺序性;3、要么使用敏感信号列表(sensitivitylist),要么使用wait语句,二者不可同时使用。4、进程必须包含在主代码段中,当敏感信号列表中的某个信号发生变化,或者wait语句的条件满足时,process内部的代码就顺序执行一次;3[标记:]process[(敏感信号表)][variablename:type[range][:=初始值]]begin{顺序描述语句}endprocess[标记];语法结构:对临时连线的赋值,不可综合可选,增强代码可读性,命名规则:非关键字4•敏感信号表:进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。格式:信号名称{,信号名称}•注意:若电路模块对某输入信号不“敏感”,则该输入信号不必放入敏感信号列表中。•如同步时序电路中只对clk和rst这两个输入信号敏感,而对data,addr等输入信号不敏感,则敏感信号列表中只需放入clk和rst即可;•在纯组合逻辑电路中,电路模块对任意一个输入信号都是敏感的,所以如果要使用process来实现一段组合逻辑,则必须将所有的输入信号都放入敏感信号列表中。5在使用顺序代码实现一个同步时序电路时,必须对某些信号边沿的跳变进行监视(典型的是时钟信号clock的上升沿或下降沿)通常使用EVENT来监视一个信号是否发生了边沿跳变通常在process中使用敏感信号clk来实现同步时序电路。6例1:带有异步复位端的D触发器data_inqrstclk功能描述:时序逻辑电路的基本单元•当输入的时钟信号为上升沿时,输出信号q等于当前输入值;•异步复位端rst(reset):rst=‘1’时q=‘0’;优先级高于当前输入值;7实现代码LIBRARYieee;USEieee.std_logic_1164.all;entitydffisport(d,clk,rst:INstd_logic;q:OUTstd_logic);enddff;architecturebehaviorofdffisbeginprocess(clk,rst)beginif(rst=‘1’)thenq=0;else(clk’eventANDclk=‘1’)thenq=d;endif;endprocess;endbehavior;任意一个信号发生变化时,process中的所有语句就执行一次8敏感信号表的特点:1、同步进程的敏感信号表中只有时钟信号。如:process(clk)beginif(clk’eventandclk=‘1’)thenifreset=‘1’thendata=“00”;elsedata=in_data;endif;endif;endprocess;92、异步进程敏感信号表中除时钟信号外,还有其它信号。例:process(clk,reset)beginifreset=‘1’thendata=“00”;elsif(clk’eventandclk=‘1’)thendata=in_data;endif;endprocess;103、如果有wait语句,则不允许有敏感信号表。PROCESS(a,b)BEGIN--sequentialstatementsENDPROCESS;PROCESSBEGINWAITON/Untilsignalx/signal_expr;//先--sequentialstatements//后ENDPROCESS;116.2信号和变量的基本知识VHDL中两种动态的传递数值的方法:信号与变量。两者的差异:有效范围的不同:信号:程序包、实体、结构体;全局量。变量:进程、子程序;局部量。赋值方式的不同:变量:=表达式;信号=表达式;赋值行为的不同:信号赋值延迟更新数值、时序电路;变量赋值立即更新数值、组合电路。126.3IF语句只能用于顺序代码,只能在process、function和procedure中出现。语法结构:if(表达式)then语句1;--可以多个语句,不必使用{}语句2;…elsif(表达式)then或者else…endif;131)if语句的门闩控制例:if(ena=‘1’)thenq=d;endif;---没有else描述!综合后生成锁存器(latch)if条件then顺序处理语句;endif;14注意:用if或者case语句做逻辑电路的时候,必须为信号设置默认值,避免生成latch电路。有两种方法:•在if,case语句之前对目标信号进行赋值,采用这种方法,就不必专门写else或者whenothers语句对信号进行默认赋值。•在else或者whenothers语句中对信号进行默认条件下的赋值。如果违反了上述规则,那么会在综合电路的时候形成一个transparentlatch,也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。15条件改为时钟沿,则生成D触发器:16注意:在时序电路中,如果没有在else语句或者whenothers语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。172)if语句的二选择控制格式:用条件来选择两条不同程序执行的路径。if条件then顺序处理语句;else顺序处理语句;endif;183)if语句的多选择控制if语句的多选择控制又称为if语句的嵌套。格式:if条件then顺序处理语句;elsif条件then顺序处理语句;┇elsif条件then顺序处理语句;else顺序处理语句;endif;19典型电路是多选一(四选一)电路。20if_then_elsif语句中隐含了优先级别的判断,最先出现的条件优先级最高,可用于设计具有优先级的电路,如8-3优先级编码器。如果不希望出现优先级的情况,则可使用CASE语句。21例6.2模10计数器计数器digit(3:0)clk功能描述:循环累加clk上升沿的次数,输出到4位的digit。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYcounterISport(clk:INstd_logic;digit:OUTintegerrange0to9);ENDcounter;22ARCHITECTUREcounterofcounterISbegincount:process(clk)variabletemp:integerrange0to10;beginif(clk’eventANDclk=‘1’)thentemp:=temp+1;if(temp=10)thentemp:=0;endif;endif;digit=temp;endprocesscount;endcounter;模10计数时,该段代码有哪些缺陷?有奖竞答!23ARCHITECTUREcounterofcounterISbegincount: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,而是二选一的选择器24ARCHITECTUREcounterofcounterISbegincount:process(clk)variabletemp:integerrange0to10;beginif(clk’eventANDclk=‘1’)thentemp:=temp-1;if(temp=0)thentemp:=10;endif;endif;digit=temp;endprocesscount;endcounter;256.4WAIT语句•用法与IF语句类似,且形式更加多样。•如果在process内部使用了wait语句,则process就不能再使用敏感信号列表。并且wait语句是process内部的第一条语句。•wait条件满足时,process内部代码就执行一次。•常用的三种语法:waiton单个或多个信号;--敏感信号量变化waituntil单个信号条件;--条件满足(可综合)waitfortime;--时间到(只能仿真,不可综合)26例6.5使用waituntil语句设计模10计数器LIBRARYieee;USEieee.std_logic_1164.all;entitycounterisport(clk:INstd_logic;digit:OUTintegerrange0to9);endcounter;architecturecounterofcounterisbeginprocess---没有敏感信号列表variabletemp:integerrange0to10;beginwaituntil(clk’eventANDclk=‘1’);temp:=temp+1;if(temp=10)thentemp:=0;endif;digit=temp;endprocess;endcounter;第一条276.5CASE语句语法结构:CASE表达式ISWHEN条件表达式=顺序执行语句;WHEN条件表达式=顺序执行语句;........ENDCASE;注意:在每个测试条件下case语句允许执行多个赋值操作,而with/select语句只允许执行一个赋值操作。28例:CASEcontrolISwhen“00”=x=a;y=b;when“01”=x=b;y=c;whenOTHERS=x=“0000”;y=“zzzz”;ENDCASE;代表了所有未列出的可能情况。注意:可使用关键字NULL来表示操作没有发生,如:whenothers=null;296.6LOOP语句•当一段代码需要多次重复、顺序地执行时,loop语句非常有效。•只能在process、function和procedure中使用;•与generate语句的最大不同:generate语句复制建立某项操作的0个或多个备份,这些备份并行地执行某项操作,与先后顺序无关;loop语句则按顺序、循环地执行某项操作。30LOOP语句的语法结构:•FOR/LOOP:循环固定次数[label:]FOR循环变量IN范围LOOP(顺序描述语句)ENDLOOP[label];•WHILE/LOOP:循环执行直到某个条件不再满足[label:]WHILE条件表达式LOOP(顺序描述语句)ENDLOOP[label];上/下界必须是静态值,有一个计数比较模块来加以控制31•EXIT:结束整个循环操作[label:]EXIT[label][WHEN条件表达式];•NEXT:跳出本次循环操作[label:]NEXT[loop_label][WHEN条件表达式];例:FORiIN0TOdata’rangeLOOPcasedata(i)iswhen‘0’=count:=count+1;whenothers=EXIT;endcase;ENDloop;32例6.8逐级进位加法器(vs并行进位加法器)功能描述:最为常用的基本功能模块。•输入矢量a和b为8位无符号数
本文标题:41VHDL数字电路设计教程第6讲 顺序代码
链接地址:https://www.777doc.com/doc-4297000 .html