Verilog HDL基础之:条件语句
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、case
VerilogHDL 华清远见 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)