夏宇闻复习笔记第5章:条件语句&循环语句&块语句&生成语句

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都可以代替之。

https://blog.csdn.net/qq_38428056/article/details/84821982?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

https://blog.csdn.net/Reborn_Lee/article/details/99738300?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.nonecase

https://blog.csdn.net/qq_22168673/article/details/88025415?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值