您的位置 首页 知识

Verilog HDL根底之:条件句子

Verilog HDL基础之if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了3种形式的if语句。case语句是一种多分支选择

if句子

if句子是用来断定所给定的条件是否满意,依据断定的成果(真或假)决议履行给出的两种操作之一。Verilog HDL言语供给了3种方法的if句子。

(1)无分支。

语法方法:

if (表达式) 句子;

例如:

if (a > b) out1 = int1; //若a大于b,将int1赋予out1

(2)单级分支。

语法方法:

if(表达式)句子1;

else 句子2;

例如:

if(a>b) out1=int1; //若a大于b,将int1赋予out1;不然,将int2赋予out1

else out1=int2;

(3)多级分支

语法方法:

if(表达式1) 句子1;

else if(表达式2) 句子2;

else if(表达式3) 句子3;

else if(表达式m) 句子m;

else 句子n;

例如:

if(a>b) out1=int1; //若a大于b,将int1赋予out1

else if(a==b) out1=int2; //不然,假如a等于b,将int2赋予out1

else out1=int3; //不然,将int3赋予out1

关于if句子有如下6点阐明:

(1)3种方法的if句子中,在if后边都有“表达式”,一般为逻辑表达式或联系表达式。体系对表达式的值进行判别,若为0、x或z,按“假”处理;若为1,按“真”处理,履行指定的句子。

(2)第二、第三种方法的if句子中,在每个else前面有一分号,整个句子完毕处有一分号。

这是由于分号是Verilog HDL句子中不行短少的部分,这个分号是if句子中的内嵌套句子所要求的。假如无此分号,则呈现语法过错。

但应留意,不要误认为上面是两个句子(if句子和else句子)。它们都归于同一个if句子。else子句不能作为句子独自运用,它有必要是if句子的一部分,与if配对运用。

(3)在if和else后边能够包括一个内嵌的操作句子,也能够有多个操作句子,此刻用begin和end这两个关键词将几个句子包括起来成为一个复合块句子如下所示。

if(a>b)begin //运用begin_end句子完成多个赋值操作

out1=int1;

out2=int2;

end

else begin

out1=int2;

out2=int1;

end

留意

在end后不需求再加分号,由于begin_end内是一个完好的复合句子,不需再附加分号。

(4)答应必定方法的表达式简写方法,例如:

if(expression) 等同于 if( expression == 1 )

if(!expression) 等同于 if( expression != 1 )

(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块句子来确认配对联系,例如:

if() begin

if() 句子1 (内嵌if)

end

else 句子2

这时begin_end块句子限制了内嵌if句子的规模,因而else与第一个if配对。留意begin_end块句子在if_else句子中的运用,由于有时begin_end块句子的不小心运用会改动逻辑行为,如下所示:

if(index>0) //内嵌for句子,无else分支

for(scani=0;scaniindex;scani=scani+1) //内嵌if句子

if(memory[scani]>0) begin //运用begin_end句子,有else分支

$display(…);

memory[scani]=0;

end

else //此处为内嵌if句子的分支

$display(error-indexiszero);

虽然程序设计者把else写在与第一个if(外层if)同一列上,期望与第一个if对应,但实际上else是与第二个if对应,由于它们相距最近。正确的写法如下:

if(index>0) begin //内嵌for句子,有else分支

for(scani=0;scaniindex;scani=scani+1) //内嵌if句子

if(memory[scani]>0) begin //运用begin_end句子,无else分支

$display(…);

memory[scani]=0;

end

end

else //此处为外部if句子的分支

$display(error-indexiszero);

(6)if_else比如。

下面这段程序用if_else句子来检测变量index以决议modify-seg1、modify-seg2、modify-seg3中哪一个的值应当与index相加作为memory的寻址地址。而且将相加值存入寄存器index以备下次检测运用。程序的前10行界说寄存器和参数。

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(indexsegment2) begin //index<20时,履行下列操作

instruction = segment_area[index + modify_seg1];

index = index + inc_seg1;

end

else if(indexsegment3) begin //20<index<64时,履行下列操作

instruction = segment_area[index + modify_seg2];

index = index + inc_seg2;

end

else if (indexdata) begin //64<index<128时,履行下列操作

instruction = segment_area[index + modify_seg3];

index = index + inc_seg3;

end

else //index>128时,履行下列操作

instruction = segment_area[index];

case句子

case句子是一种多分支挑选句子,if句子只要两个分支可供挑选,而实际问题中常常需求用到多分支挑选。Verilog言语供给的case句子直接处理多分支挑选。case句子一般用于微处理器的指令译码,它的一般方法如下:

(1)case (表达式) case分支项> endcase

(2)casez(表达式) case分支项> endcase

(3)casex(表达式) case分支项> endcase

case分支项>的一般语法格局如下:

分支表达式: 句子

缺省项(default项): 句子

关于case句子的几点阐明如下。

(1)case括弧内的表达式称为操控表达式,case分支项中的表达式称为分支表达式。操控表达式一般表明为操控信号的某些位,分支表达式则用这些操控信号的具体状况值来表明,因而分支表达式又能够称为常量表达式。

(2)当操控表达式的值与分支表达式的值持平时,就履行分支表达式后边的句子。假如一切的分支表达式的值都没有与操控表达式的值相匹配的,就履行default后边的句子。

(3)default项可有可无,一个case句子里只能有一个default项。下面是一个简略的运用case句子的比如。该比如中对寄存器rega译码以确认result的值。

reg [15:0] rega;

reg [9:0] result;

case(rega)

16 d0: result = 10 b0111111111; //rega等于0时

16 d1: result = 10 b1011111111; //rega等于1时

16 d2: result = 10 b1101111111; //rega等于2时

16 d3: result = 10 b1110111111; //rega等于3时

16 d4: result = 10 b1111011111; //rega等于4时

16 d5: result = 10 b1111101111; //rega等于5时

16 d6: result = 10 b1111110111; //rega等于6时

16 d7: result = 10 b1111111011; //rega等于7时

16 d8: result = 10 b1111111101; //rega等于8时

16 d9: result = 10 b1111111110; //rega等于9时

default: result = bx; //rega不等于上面的值时

endcase

(4)每一个case分项的分支表达式的值有必要互不相同,不然就会呈现对立现象(对表达式的同一个值,有多种履行计划)。

(5)履行完case分项后的句子,则跳出该case句子结构,停止case句子的履行。

(6)在用case句子表达式进行比较的进程中,只要当信号的对应位的值能清晰进行比较时,比较才干成功,因而要具体阐明case分项的分支表达式的值。

(7)case句子的一切表达式的值的位宽有必要持平,只要这样操控表达式和分支表达式才干进行对应位的比较。一个经常犯的过错是用bx、bz 来代替nbx、nbz,这样写是不对的,由于信号x、z的缺省宽度是机器的字节宽度,一般是32位(此处 n 是case操控表达式的位宽)。

case句子与if句子的差异主要有以下两点。

(1)与case句子中的操控表达式和多分支表达式比较,if结构中的条件表达式更为直观一些。

(2)关于那些分支表达式中存在不定值x和高阻值z时,case句子供给了处理这种状况的手法。下面的两个比如介绍了处理x、z值case句子。

例1:case句子1。

case (select[1:2])

2 b00: result = 0; //select[1:2]等于00时

2 b01: result = flaga; //select[1:2]等于01时

2 b0x,

2 b0z: result = flaga? bx: 0; //select[1:2]等于0x和0z时,履行表达式

2 b10: result = flagb; //select[1:2]等于10时

2 bx0,

2 bz0: result = flagb? bx :0; //select[1:2]等于x0和z0时,履行表达式

default: result = bx; //select[1:2]不等于上面的值时

endcase

例2:case句子2

case(sig)

1 bz: $display(signal is floating); //sig为高阻时,打印输出

1 bx: $display(signal is unknown); //sig为不定状况时,打印输出

default: $display(signal is %b, sig); //为其他时,即0或1时,打印输出

endcase

针对电路的特性,Verilog HDL供给了case句子的其他两种方法用来处理不用考虑的状况(dont care condition)。其间casez句子用来处理不考虑高阻值z的比较进程,casex句子则将高阻值z和不定值都视为不用关怀的状况。

所谓不用关怀的状况,即在表达式进行比较时,不将该位的状况考虑在内。这样在case句子表达式进行比较时,就能够灵敏地设置,以对信号的某些位进行比较。如表3.10所示为case、casez、casex 的真值表:

表3.10 case句子真值表

case

0

1

x

z

0

1

0

0

0

1

0

1

0

0

x

0

0

1

0

z

0

0

0

1

casez

0

1

x

z

0

1

0

0

1

1

0

1

0

1

x

0

0

1

1

z

1

1

1

1

casex

0

1

x

z

0

1

0

1

1

1

0

1

1

1

x

1

1

1

1

z

1

1

1

1

下面给出两个比如来别离阐明casez句子和casex句子。

例3:casez句子。

reg[7:0] ir;

casez(ir)

8 b1???????: instruction1(ir); //只判别ir的最高位

8 b01??????: instruction2(ir); //只判别ir的高2位

8 b00010???: instruction3(ir); //只判别ir的高5位

8 b000001??: instruction4(ir); //只判别ir的高6位

endcase

例4:casex句子。

reg[7:0] r, mask;

mask = 8bx0x0x0x0;

casex(r^mask) //判别r^mask的成果

8 b001100xx: stat1; //不考虑低2位

8 b1100xx00: stat2; //不考虑第3、4位

8 b00xx0011: stat3; //不考虑第5、6位

8 bxx001100: stat4; //不考虑高2位

Endcase

其他条件句子

上面说到的if句子和case句子都只能使用于always句子内部。假如需求在always句子之外使用条件句子,能够采样这样的语法结构:

assign data = (sel)? a : b;

上面的句子的意义相当于:

if (sel = 1)

data = a;

else

data = b;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/194365.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部