verilog条件语句例程课件

上传人:des****85 文档编号:331553628 上传时间:2022-08-23 格式:PPTX 页数:98 大小:277.29KB
返回 下载 相关 举报
verilog条件语句例程课件_第1页
第1页 / 共98页
verilog条件语句例程课件_第2页
第2页 / 共98页
verilog条件语句例程课件_第3页
第3页 / 共98页
verilog条件语句例程课件_第4页
第4页 / 共98页
verilog条件语句例程课件_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《verilog条件语句例程课件》由会员分享,可在线阅读,更多相关《verilog条件语句例程课件(98页珍藏版)》请在金锄头文库上搜索。

1、编译的警告Warning:Design contains 2 input pin(s)that do not drive logicWarning:No output dependent on input pin clk1Warning:No output dependent on input pin clk2module shift_regester(data_in,data_out,clk1);input data_in,clk1;output data_out;reg1:7 reg_data;reg data_out;integer i;always(negedge clk1)begin

2、data_out=reg_data1;for(i=1;i=7;i=i+1)reg_datai=reg_datai+1;reg_data7=data_in;endendmodule6.5条件语句 与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有ifelse和caseendcase两种结构,用法和C程序语言中类似。两者相较,ifelse用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是caseendcase风格的代码If_else语句Case语

3、句6.5.1if-else条件语句if-else条件分支语句的作用是根据指定的判断条件是否满足来确定下一步要执行的操作。它在使用时可以采用如下三种形式:(1)使用形式1:if ()语句或语句块;在if-else条件分支语句的这种使用形式中没有出现else项这种情况下条件分支语句的执行过程将是:如果指定的“”成立(也就是这个条件表达式的逻辑值为“1”),则执行条件分支语句内给出的“语句或语句块”,然后退出条件分支语句的执行。如果“”不成立(也就是条件表达式的逻辑值为“0”、“x”或“z”时),则不执行条件分支语句内给出的“语句或语句块”,而是直接退出条件分支语句的执行。一条没有elseelse选

4、项的ifif语句映射到硬件上,形成的是一个锁存器例如下面这条条件分支语句:if(enable=1)out=data_in;在执行时就会根据条件表达式“enable=1”是否成立来决定是否执行赋值语句“out=data_in;”:如果enable取值为“1”,则赋值语句得到执行,输出信号out得到data的值;如果enable的值为“0”、“x”或“z”(取值不为“1”),则不执行指定的赋值语句,输出信号out保持原有值不变。(2)使用形式2:if()语句或语句块1else 语句或语句块2 这种形式的条件分支语句将以如下方式得到执行:如果指定的“”成立(也就是这个条件表达式的逻辑值为“1”),则

5、执行条件分支语句第一行所指定的“语句或语句块1”,然后结束条件分支语句的执行。如果“”不成立,则执行由条件分支语句内第二行的else项所指定的“语句或语句块2”,然后结束条件分支语句的执行。一条带有elseelse选项的ifif语句映射到硬件上,通常形成的是一个多路选择器(MUXMUX)例如,下面这条条件分支语句:if(select=1)out=input1;else out=input0;在执行时会根据条件表达式“select=1”是否成立来决定执行两条过程赋值语句中的哪一条。如果select取值为“1”,则第一行if这一项所指定的赋值语句“out=input1;”得到执行,输出信号out得

6、到input1的取值;如果select取值不为“1”(取值为“0”、“x”或“z”),则执行第二行else项所指定的赋值语句“out=input0;”,输出信号out将得到input0的取值。(3)使用形式3:if ()语句或语句块1else if()语句或语句块2else if()语句或语句块nelse 语句或语句块n+1在这种使用形式中一共出现了n+1个条件分支项,其中每个分支项都指定了当该分支项的条件满足时所要执行的操作。在执行这种形式的if-else条件分支语句时,将按照各分支项的排列顺序对各个条件表达式是否成立作出判断,当遇到某一项的条件表达式成立时,就执行这一项所指定的“语句或语句

7、块”。比如假设“”成立,那么就执行“语句或语句块m”。如果所有的条件表达式都不成立,则执行最后的else项(这一项没有给出条件表达式)所指定的操作(语句或语句块n+1)。这种形式的if-else条件分支语句实现了一种多路分支选择控制。比如在例6-21给出的模块中就使用了这种形式的if-else条件分支语句。【例例6-21】第三种形式的if-else条件分支语句。module sel_from_three(q,sela,selb,a,b,c);input sela,selb,a,b,c;output q;reg q;always (sela or selb or a or b or c)begi

8、nif(sela)q=a;else if(selb)q=b;else q=c;endendmodule在例6-21模块内的if-else条件分支语句中出现了三个分支项,这个条件分支语句在执行时将依次对控制信号sela和selb的取值是否为“1”进行判断:(1)如果sela的取值为1,则第一个分支项的条件表达式“(sela)”成立,因而第一个分支项所指定的赋值操作“q=a;”将得到执行。(2)如果sela的取值不为1,而selb的取值为1,则第二个分支项的条件表达式“(selb)”成立,因而第二个分支项所指定的赋值操作“q=b;”将得到执行。(3)如果sela和selb的取值都不为1,则“(se

9、la)”和“(selb)”这两个条件表达式都不成立,这时else分支项所指定的赋值操作“q=c;”将得到执行。(4)如果sela和selb的取值都是1,那么第一个条件表达式“(sela)”以及第二个条件表达式“(selb)”都是成立的。在这种情形下,由于首先被检测为成立的条件表达式是第一个分支项的条件表达式“(sela)”,所以此时将执行第一分支项指定的赋值操作q=a;”。图6.11 例6-21所示模块描述的电路功能因此,例621所示模块描述的是图6.11所示的硬件电路功能。由上例条件表达式取值的第四种情况我们可以看出:这种形式的if-else条件分支语句(第三种使用形式)内各个条件表达式的排

10、列顺序决定了对各个条件进行判断的先后次序,这种排列顺序隐含着一种优先级关系,也就是说排在前面的分支项所指定的操作具有较高的优先级。比如,在前面讨论过的例中条件分支语句的第四种执行情况下,虽然两个条件表达式都是成立的,但是由于条件表达式“(sela)”排在“(selb)”的前面,所以“(sela)”这一项所对应的赋值语句“q=a;”具有较高优先级,因此这时得到执行的将是语句“q=a;”而不是“q=b;”。说明(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。系统对表达式的值进行判断,若为0,x,z,按“假”处理,若为1,按“真”处理,执行指定的语句。(2)第二、第

11、三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。例如:If(ab)out1=int1;else out1 b)begin out1=int1;out2=int2;endelse begin out1=int2;out2=int1;end注意在end后不需要再加分号。因为begin_end内是一个完整的复合语句,不需再附加分号(4).允许一定形式的表达式简写方式。如下面的例子:if(expression)等同与 if(expression=1)if(!expression)等同与 if(expression!=1)描述一个具有同步清零功能(低电平有效)的上升沿D D触发

12、器module dff_sync(q,d,clear,clk);module dff_sync(q,d,clear,clk);output q;output q;input d,clear,clk;input d,clear,clk;reg q;reg q;always(posedge clk)always(posedge clk)if(!clear)if(!clear)q=0;/q=0;/清零清零 elseelse q=d;/q0)for(scani=0;scani0)begin$display(.);memoryscani=0;endelse/*WRONG*/$display(error-

13、indexiszero)错误if(index0)if(index0)beginbeginfor(scani=0;scaniindex;scani=scani+1)for(scani=0;scani0)if(memoryscani0)beginbegin$display(.);$display(.);memoryscani=0;memoryscani=0;endendendendelse /*WRONG*/else /*WRONG*/$display(error-indexiszero);$display(error-indexiszero);正确正确(6).if_else例子。下面的例子是取自

14、某程序中的一部分。这部分程序用if_else语句来检测变量index以决定三个寄存器modify_segn中哪一个的值应当与index相加作为memory的寻址地址。并且将相加值存入寄存器index以备下次检测使用。程序的前十行定义寄存器和参数/定义寄存器和参数。reg 31:0 instruction,segment_area255:0;reg 7:0 index;reg 5:0 modify_seg1,modify_seg2,modify_seg3;parametersegment1=0,inc_seg1=1,segment2=20,inc_seg2=2,segment3=64,inc_s

15、eg3=4,data=128;/检测寄存器index的值if(indexsegment2)begininstruction=segment_areaindex+modify_seg1;index=index+inc_seg1;endelse if(indexsegment3)begininstruction=segment_areaindex+modify_seg2;index=index+inc_seg2;endelse if(indexdata)begininstruction=segment_areaindex+modify_seg3;index=index+inc_seg3;endel

16、seinstruction=segment_areaindex 模为60的BCD码加法计数器module count60(qout,cout,data,load,reset,clk);output7:0 qout;output cout;input7:0 data;input load,cin,clk,reset;reg7:0 qout;always (posedge clk)begin if(reset)qout=0;else if(load)qout=data;else if(in)beginif(qout3:0=9)begin qout3:0=0;if(qout7:4=5)qout7:4=0;else qout7:4=qout7:4+1;endelse qout3:0=qout3:0+1;end end assign cout=(qout=8h59)&cin)?1:0;endmodule1/2分频器的设计module half_clk(reset,clk_in,clk_out);input clk_in,reset;output clk_out;reg clk_out;alway

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号