verilog 6.5-7语句

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(index>0) for(scani=0;scani<index; scani=scani+1) if(memory[scani]>0) begin $display("..."); memory[scani]=0; end else /*WRONG*/ $display("error-indexiszero") 错误
if(index>0) begin for(scani=0;scani<index;scani=scani+1) if(memory[scani]>0) begin $display("..."); memory[scani]=0; end end
else /*WRONG*/ $display("error-indexiszero"); 正确
b 二选一 MUX a se1b se1a
图6.11 例6-21所示模块描述的电路功能
c
二选一 MUX
q
因此,例6-21所示模块描述的是图6.11所示的硬件电路功能。
由上例条件表达式取值的第四种情况我们可以看出:这种形式的
if-else条件分支语句(第三种使用形式)内各个条件表达式的排 列顺序决定了对各个条件进行判断的先后次序,这种排列顺序隐
两个always过程块分别用来监测清零控制信号clear和时 钟clk的变化,其中第一个always过程块用于实现清零功 能;第二个always过程块则用于实现正常的D触发器功能。
而且在第二个always过程块中还考虑了清零信号与时钟信
号同时发生跳变的情况,由于其中的if-else条件分支语 句中对清零信号的处理优先于对时钟信号的处理,所以在
说明
(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑 表达式或关系表达式。系统对表达式的值进行判断,若0,x,z, 按“假”处理,若为1,按“真”处理,执行指定的语句。 (2)第二、第三种形式的if语句中,在每个else前面有一分号, 整个语句结束处有一分号。 例如: If (a>b) out1 <=int1; else out1 <=int2; 分号是Verilog HDL语句中不可缺少的部分,这个分号是if语 句中的内嵌套语句所要求的。如果无此分号,则出现语法错误。 但应注意,不要误认为上面是两个语句(if语句和else语句)。 它们都属于同一个if语句Else子句不能作为语句单独使用,它必 须是if语句的一部分,与if配对使用。
例如下面这条条件分支语句: if(enable == 1) out = data_in; 在执行时就会根据条件表达式“enable==1”是否成立来决定 是否执行赋值语句“out=data_in;”:如果enable取值为 “1”,则赋值语句得到执行,输出信号out得到data的值;如 果enable的值为“0”、“x”或“z”(取值不为“1”),则不 执行指定的赋值语句,输出信号out保持原有值不变。 (2) 使用形式2: if ( <条件表达式> ) 语句或语句块1 else 语句或语句块2 这种形式的条件分支语句将以如下方式得到执行: 如果指定的“<条件表达式>”成立(也就是这个条件 表达式的逻辑值为“1”),则执行条件分支语句第一行所指 定的“语句或语句块1”,然后结束条件分支语句的执行。 如果“<条件表达式>”不成立,则执行由条件分支语 句内第二行的else项所指定的“语句或语句块2”,然后结 束条件分支语句的执行。
含着一种优先级关系,也就是说排在前面的分支项所指定的操作
具有较高的优先级。比如,在前面讨论过的例中条件分支语句的 第四种执行情况下,虽然两个条件表达式都是成立的,但是由于
条件表达式“(sela)”排在“Байду номын сангаасselb)”的前面,所以“(sela)”
这一项所对应的赋值语句“q=a;”具有较高优先级,因此这时 得到执行的将是语句“q=a;”而不是“q=b;”。
项没有给出条件表达式)所指定的操作(语句或语句块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) begin
这种情况下也能正确实现异步清零功能。
(5).if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌 套。一般形式如下: if(expression1) if(expression2) 语句1 (内嵌if) else 语句2 else if(expression3) 语句3 (内嵌if) else 语句4 应当注意if与else的配对关系,else总是与它上 面的最近的if配对。如果if与else的数目不一样,为 了实现程序设计者的企图,可以用begin_end块语句来 确定配对关系
描述一个具有异步清零功能(低电平有效)的上升沿D触发器(不能综合) module dff_asyn2(q,d,clear,clk); output q; input d,clear,clk; reg q; always @(clear) //该过程块用来处理清零操作
if(!clear) q=0; //异步清零 always @(negedge clk)//该过程块用来实现正常的D触发器功能 if(!clear) q=0;//考虑clear信号和clk信号在同一时刻发生变化的情况 else q=d; //正常D触发器功能 endmodule
if (sela) q = a;
else if (selb) q = b; else q = c;
end
endmodule
在例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,则“(sela)”和“(selb)”这 两个条件表达式都不成立,这时else分支项所指定的赋值操作“q=c;” 将得到执行。 (4) 如果sela和selb的取值都是1,那么第一个条件表达式“(sela)” 以及第二个条件表达式“(selb)”都是成立的。在这种情形下,由于首先 被检测为成立的条件表达式是第一个分支项的条件表达式“(sela)”,所 以此时将执行第一分支项指定的赋值操作q=a;”。
例如: if( ) begin if( ) 语句1 (内嵌if) end else 语句2 这时begin_end块语句限定了内嵌if语句的范围, 因此else与第一个if配对。注意begin_end块语句在 if_else语句中的使用。因为有时begin_end块语句 的不慎使用会改变逻辑行为
判断
一条带有else选项的if语句映射到硬件上,通常形成的是一个 多路选择器(MUX) 例如,下面这条条件分支语句: if(select==1) out=input1; else out=input0; 在执行时会根据条件表达式“select==1”是否成立来 决定执行两条过程赋值语句中的哪一条。如果select 取值为“1”,则第一行if这一项所指定的赋值语句 “out=input1;”得到执行,输出信号out得到input1的 取值;如果select取值不为“1”(取值为“0”、“x”或 “z”),则执行第二行else项所指定的赋值语句 “out=input0;”,输出信号out将得到input0的取值。
6.5 条件语句
与常用的高级程序语言一样,为了描述较为复杂 的时序关系,Verilog HDL提供了条件语句供分支判 断时使用。在可综合风格的Verilog HDL模型中常用 的条件语句有if„else和case„endcase两种结构, 用法和C程序语言中类似。两者相较,if„else用于 不很复杂的分支关系,实际编写可综合风格的模 块、特别是用状态机构成的模块时,更常用的是 case„endcase风格的代码
(3) 使用形式3: if …… else if (<条件表达式n>) 语句或语句块n (<条件表达式1>) 语句或语句块1
else if (<条件表达式2>)
语句或语句块2
else
语句或语句块n+1
在这种使用形式中一共出现了n+1个条件分支项,其中每个分 支项都指定了当该分支项的条件满足时所要执行的操作。
//定义寄存器和参数。 reg [31:0] instruction, segment_area[255:0]; reg [7:0] index; reg [5:0] modify_seg1, modify_seg2, modify_seg3; parameter segment1=0, inc_seg1=1, segment2=20, inc_seg2=2, segment3=64, inc_seg3=4, data=128; //检测寄存器index的值 if(index<segment2) begin instruction = segment_area[index + modify_seg1]; index = index + inc_seg1; end
在执行这种形式的if-else条件分支语句时,将按照各分支项 的排列顺序对各个条件表达式是否成立作出判断,当遇到某一项 的条件表达式成立时,就执行这一项所指定的“语句或语句块”。 比如假设“<条件表达式m>”成立,那么就执行“语句或语句块 m”。
如果所有的条件表达式都不成立,则执行最后的else项(这一
注意在end后不需要再加分号。因为begin_end内是一个完整的 复合语句,不需再附加分号
(4).允许一定形式的表达式简写方式。如下面的例子: if(expression) 等同与 if( expression == 1 ) if(!expression) 等同与 if( expression != 1 ) 描述一个具有同步清零功能(低电平有效)的上升沿D触发器 module dff_sync(q, d, clear, clk); output q; input d, clear, clk; reg q; always @(posedge clk) if(!clear) q<=0;//清零 else q<=d;//正常D触发器 ednmodule
(3).在if和else后面可以包含一个内嵌的操作语句(如上例), 也可以有多个操作语句,此时用begin和end这两个关键词 将几个语句包含起来成为一个复合块语句。如:
if(a>b) begin out1<=int1;out2<=int2; end else begin out1<=int2; out2<=int1; end
(6).if_else例子。 下面的例子是取自某程序中的一部分。这部分程序 用if_else语句来检测变量index以决定三个寄存器 modify_segn中哪一个的值应当与index相加作为 memory的寻址地址。并且将相加值存入寄存器 index以备下次检测使用。程序的前十行定义寄存 器和参数
If_else语句 Case语句
6.5.1 if-else条件语句
if-else条件分支语句的作用是根据指定的判断条件是否满足来 确定下一步要执行的操作。它在使用时可以采用如下三种形式: (1) 使用形式1: if ( <条件表达式> ) 语句或语句块;
在if-else条件分支语句的这种使用形式中没有出现else项 这种情况下条件分支语句的执行过程将是: 如果指定的“<条件表达式>”成立(也就是这个条件表达式的 逻辑值为“1”),则执行条件分支语句内给出的“语句或语句 块”,然后退出条件分支语句的执行。 如果“<条件表达式>”不成立(也就是条件表达式的逻辑值为 “0”、“x”或“z”时),则不执行条件分支语句内给出的“语 句或语句块”,而是直接退出条件分支语句的执行。 一条没有else选项的if语句映射到硬件上,形成的是一个锁存器
相关文档
最新文档