5.1 条件语句(if-else)
只能在initial、always引导的begin-end的过程块语句中使用
5.2 case语句
case语句在always块中也常用于组合逻辑,这时更好使用阻塞赋值
p72 5.18 四选一MUX
/******************************p72 5.18 四选一MUX********************************/
module mux4(out,i0,i1,i2,i3,s1,s0);
output reg out;
input i0,i1,i2,i3;
input s0,s1;
always@(*) begin
case({s1,s0})
2'b00: out=i0;
2'b01: out=i1;
2'b10: out=i2;
2'b11: out=i3;
default: out=1'bx;
endcase
end
endmodule
5.5 循环语句
1. forever语句
必须写在initial块的begin-end结构里
2. repeat语句
p60 5.5 repeat+加法+移位实现乘法器
/******************************p60 5.5 repeat+加法+移位实现乘法器********************************/
module xx( );
parameter size=8,longsize=16;
reg [size-1:0] opa,opb;
reg [longsize-1:0] result;
begin : mult
reg [longsize-1:0] shift_opa,shift_opb;
shift_opa = opa;
shift_opb = opb;
result = 0;
repeat (size) begin
if(shift_opb[0]) begin
result = result + shift_opa;
shift_opa = shift_opa << 1;//被乘数每次向高位移一位,相当于*2,若乘数最低位为1,则*2后的被乘数加到result上去
shift_opb = shift_opb >> 1;//乘数每次向低位移一位,shift_opb[0]改变
end
end
end
3. while语句
p61 5.6 while循环语句对rega这个8位二进制数中值为1的位进行计数
/******************************p61 5.6 while循环语句对rega这个8位二进制数中值为1的位进行计数********************************/
reg [7:0] rega;
begin : countls
reg [7:0] tmpreg;
count = 0;
tmpreg = rega;
while(tmpreg) begin //tmpreg不等于0时,即为1
if(tmpreg[0]) begin
count = count + 1;
tmpreg = tmpreg >> 1;
end
end
end
4. for语句
跟C的用法一样
5.7 for语句初始化memory
/******************************p62 5.7 for语句初始化memory********************************/
parameter memsize=255;
reg [7:0] mem [memsize-1:0];
begin ; init_mem
reg [7:0] tempi;
for( tempi=0 ; tempi<memsize ; tempi=tempi+1)
mem[tempi] = 0;
end
p62 5.8 for语句实现乘法器
/**************************************************************/
parameter size=8, longsize=16;
reg [size-1:0] opa,opb;
reg [longsize-1:0] result;
begin : mult
integer i;
result = 0;
for(i=0 ; i<size ; i=i+1)
if(opb[i])
result = result + (opa << i);
end
//比repeat好用的地方在于:多了一个计数值i
p62 5.6 for循环语句对rega这个8位二进制数中值为1的位进行计数
/******************************p62 5.6 for循环语句对rega这个8位二进制数中值为1的位进行计数********************************/
reg [7:0] rega;
begin : count1s
integer i;
count = 0;
for(i=0 ; i<8 ; i=i+1)
count = (rega[i]) ? (count+1) : count;
end
5.6 顺序块&并行块
并行块略
重点复习下顺序块的禁用disable
要禁用一个块,首先块要有名字
p66 5.13 while语句从最低位开始查找第一个为1的位
/******************************p66 5.13 while语句从最低位开始查找第一个为1的位********************************/
reg [15:0] num;
integer i;
initial begin
num = 16'b1100_0111_0000_0010;
i = 0;
begin : block1
while(i<16)
if(!num[i]) i=i+1;
else begin
$display( "最低位的1在第 %d 位" , i);
disable block1;//禁用block1
end
end
end
5.7 generate 生成块
以下文章对generate块用法说的比较明白,其实也没啥神秘,就是循环的时候常用,大多数时候用for都可以代替之。