Verilog逻辑设计中的循环语句和运算符

描述

“ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括循环语句(forever、repeat、while和for)、运算符。”

01

循环语句

在Verilog中存在着4种类型的循环语句(forever、repeat、while和for),其中“while”与“for”的使用方法与C语言中的基本类似。  

“forever”语句

语句格式如下: forever         begin                    //add codes         end  

forever语句经常用于仿真时产生周期性的波形,但是必须写在initial块中。示例代码如下
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  reg    a;  initial begin    a = 0;    forever      begin        #5 a = ~a;      end  end
仿真效果如下:

Verilog

  可以看出,clk每5ns实现一次电平翻转。  
  • “repeat”语句

语句格式如下: repeat(重复次数)          begin          // add codes end示意代码如下:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  parameter      times = 3;  reg    [7:0]    b_1,b_2;  initial    begin      b_1 = 0;      #10;      b_1 = 8'b0000_0100;      #10;    end  always@(b_1)    begin      b_2 = b_1;        repeat(times)        begin          b_2 = b_2 << 1;        end    end
仿真结果如下:

Verilog

在10ns的时候,b_1赋值为8’b0000_0100,这时候repeat语句触发,b_2变成了8’b0010_0000,可见b_2右移了三位,也就是repeat内的语句重复执行了3次。

 

  • “while”语句

语句格式如下: while(表达式)         begin         end while后面的表达式为真时,while将会一直执行,直到表达式为假时,才结束执行while语句。示例代码如下

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  reg    [7:0]    c_1,c_2;  initial    begin      c_1 = 0;      #10;      c_1 = 1;      c_2 = 8'b0000_0001;      while(c_1)        begin          c_2 = c_2 << 1;          #10;          if(c_2 == 8'b0001_0000)            c_1 = 0;          else            c_1 = 1;        end    end
仿真结果如下:  

Verilog

可以看出,当c_1==1的时候,while中的语句在不停的执行,当c_1==0时,程序跳出while,不在执行。  
  • “for”语句

for语句的语句形式:    for(表达式1;表达式2;表达式3)        begin        end 它的执行过程如下:
  1. 先求表达式1;

  2. 求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步;

  3. 求解表达式3;

  4. 转回上面第2步继续执行;

  5. 循环结束,执行 for 语句下面的语句。

    示例代码如下:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  reg    [7:0]    d_1,d_2;  initial    begin      d_2 = 10;      #10;      for(d_1=1;d_1<5;d_1=d_1+1)        begin          d_2 = d_2 + 3;          #5;        end    end

 

Verilog

02

运算符

  • 基本算术运算符

  1. +     (加法运算符);

  2. -     (减法运算符);

  3. *       (加法运算符);

  4. /        (除法运算符);

  5. %      (模运算符或者求余运算符,要求%两侧均为整型数据,结果取第一个操作数的符号位,-10%3的结果是-1,11%-3的结果是2);

 

  • 赋值运算符

  1. =;

  2. <=;

 

  • 关系运算符

  1. >        (大于);

  2. >=      (大于等于);

  3. <        (小于);

  4. <=      (小于等于);

  5. ==     (等于);

  6. !=       (不等于);

  7. ===   (等于,可以比较含有X和Z的操作数,在仿真中用的比较多);

  8. !==    (不等于,可以比较含有X和Z的操作数,在仿真中用的比较多)。

 

  • 逻辑运算符

  1. &&   (逻辑与);

  2. ||       (逻辑或);

  3. !      (逻辑非)。

 
  • 条件运算符

    ?:

    例子:y=x?a:b(当x为真时,y=a,当x为假时,y=b)。

 

  • 位运算符

    位运算符的操作数是几位,结果也是几位。

  1. ~       (取反);

  2. &      (按位与);

  3. |        (按位或);

  4. ^       (按位异或,XOR,相同为0,不同为1);

  5. ^~     (按位同或,相同为1,不同为0);

  6. ~&    (与非,先按与的操作,然后结果取反);

  7. ~|      (或非,先按或的操作,然后结果取反)。

 
  • 移位运算符

  1. <<     (左移,左移一位相当于乘2);

  2. >>     (右移,右移一位相当于除以2)。

 

  • 拼接运算符

    {s1,s2,s3,s4}:将两个或者多个信号拼接起来。

 

  • 缩减运算符(一元简约运算符)

    缩减运算符对单个操作数进行与、或、非递推运算,最后的结果是1位的二进制数。具体过程如下:

  1. 先将操作数的第1位和第2位进行与、或、非运算;

  2. 运算的结果与第3位进行与、或、非运算;

  3. 一次类推,知道最后一位。

例子:
  •  
  •  
  •  
reg    [3:0]     a;reg              b;b = &a;   等同于   b = ((a[0]&a[1])&a[2])&a[3]。
审核编辑:郭婷


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分