精华内容
下载资源
问答
  • while条件语句

    千次阅读 多人点赞 2020-11-27 09:37:50
    while条件语句 (条件满足一直循环,适合做守护进程,死循环,while是读整行,for遇见空格就另起一行) 语法 while 条件 do 指令 done 案例: 每个2秒记录一次系统负载情况 while true; do 也可以写成 while :;do #!/...

    while条件语句 (条件满足一直循环,适合做守护进程,死循环,while是读整行,for遇见空格就另起一行)

    语法
    while 条件
    do
    指令
    done

    案例:
    每个2秒记录一次系统负载情况

    while true; do 也可以写成 while :;do
    
    #!/bin/bash
    while true
     do
     uptime
     sleep 2
    done
    

    注:while true表示条件永远为真,因此会一直循环下去,像死循环,我们称为守护进程

    用while写一个脚本1+…100的和

    #!/bin/bash
    sum=0
    i=1
    while ((i<=100))
      do
      ((sum=sum+i))
      ((i++))
    done
     echo "sum=$sum"
    

    这种算法如果数很大,计算效果很慢,推荐使用求和公式((sum=100*(100+1)/2)) echo $sum
    相加到1000000用time可以比对出时间
    time ./while2.sh
    sum=500000500000

    real 0m7.463s
    user 0m7.191s
    sys 0m0.272s
    #!/bin/bash
    i=1000000
    ((sum=1000000*(1000000+1)/2))
    echo $sum

    time ./sum.sh
    500000500000

    real 0m0.004s
    user 0m0.002s
    sys 0m0.000s

    while 读入文件用法:
    格式:
    while read line;do #通过read命令读取文件的每一行内容存入line变量中
    ………. #执行过程
    done < /要导入的文件路径

    案例:统计access_apache.log日志中所有行的日志各文件访问字节总量

    #!/bin/bash
    sum=0
    while read line                   #用read读入每一行
      do
      size=`echo $line|awk '{print $10}'`
      [ "$size" == "-" ] && continue      #结束本次循环继续下面循环
      ((sum=sum+$size))
    done<access_apache.log           #放在done后面可以读入文件         
    [  -n "$size" ] && echo "$sum"
    
    展开全文
  • FPGA学习笔记(四)————Verilog HDL条件语句与循环语句 文章目录FPGA学习笔记(四)————Verilog HDL条件语句与循环语句1.if--else语句2.case语句3.forever语句4.repeat语句5.while语句6.for语句7.disable语句 1....

    FPGA学习笔记(四)————Verilog HDL条件语句与循环语句

    1.if–else语句

    • 其格式与C语言中的if–else语句类似,使用方法有以下3种:

      //形式1:只有if的形式
      if(表达式)  语句1;
      if(表达式)
          begin
              表达式1;
          end
      //形式2:if--else形式
      if(表达式)
          语句或语句块1;
      else
          语句或语句块2;
      //形式3:if--else嵌套形式
      if ( 表达式1)    语句1;     
      else if ( 表达式2 )  语句2;
      else if ( 表达式3 )  语句3;
      ........
      else if ( 表达式m )  语句m;
      else               语句n;
      //例如:
      if ( a > b )      out = int1;
      else if ( a == b)  out1= int2;
      else           out1 = int3; 
      
      
    • 表达式:一般为逻辑表达式或关系表达式,也可能是一位的变量。

    • 系统对表达式的值进行判断,若为0,x,z,按“假”处理;若为1,按“真”处理,执行指定语句。

    • 语句可是单句,也可是多句,多句时用“begin - end”语句括起来。对于if语句的嵌套,若不清楚if和else的匹配,最好用begin-end语句括起来。

    • 条件语句必须在过程块中使用:

      always@(a,b,int1,int2) 
           begin
          if(a>b)
              begin      
                  out1=int1;     
                  out2=int2;        
              end
          else
             begin       
                 out1=int2;       
                 out2=int1;      
             end
       end
      
    • 允许一定形式的表达式简写方式:

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

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

    • if语句的嵌套,即在if语句中又包含一个或多个if语句称为if语句的嵌套。应当注意if与else的配对关系,else总是与它上面的最近的if配对。

    • if-else 嵌套形式隐含优先级关系:

       always@(sela or selb or a or b or c)
          begin
            if(sela)  q=a;
            else if(selb) q=b;
      	      else q=c;
          end
      

    在这里插入图片描述

    2.case语句

    • Verilog语言提供的case语句直接处理多分支选择,通常用于描述译码器、数据选择器、状态机及微处理器的指令译码等,它的一般形式如下:

      case(表达式)
          分支表达式1:语句1;
          分支表达式2:语句2;
          ···
          分支表达式n:语句n;
          default: 语句n+1; //如果前面列出了表达式所有可能取值,default语句可以省略
      endcase      
      
    • case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。

    • 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句;如果所有的分支表达式的值都没有与控制表达式的值相匹配,就执行default后面的语句。

    • 分支表达式后面的语句也可以是由begin-end括起来的语句块。

    • default项可有可无,一个case语句里只准有一个default项。同样,case也只能在块语句中使用。

    //case语句实现3-8译码器的部分代码如下:
         wire[2:0] sel;
         reg[7:0]  res;
         always @ (sel or res)
          begin
    //case语句;
      case (sel)
           3’b000 : res=8’b00000001;
           3’b001 : res=8’b00000010;
           3’b010 : res=8’b00000100;
           3’b011 : res=8’b00001000;
           3’b100 : res=8’b00010000;
           3’b101:  res=8’b00100000;
           3’b110 : res=8’b01000000;
           default:  res=8’b10000000;
       endcase
     end
    
    • case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较。一个经常犯的错误是用’bx,'bz来替代n’bx,n’bz,这样写是不对的,因为信号x,z的默认宽度是机器的字节宽度,通常是32位。

    • 执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行。

    • 在case语句中,表达式与分支表达式1到分支表达式n之间的比较是一种全等比较(===),必须保证两者的对应位全等。如果表达式的值和分支表达式的值同时为不定值或者同时为高阻态,则认为是相等的

      case01xz
      01000
      10100
      x0010
      z0001
      case ( a )
           2’b1x:out = 1;   // 只有a = 1x,才有out = 1
           2’b1z:out = 0;    // 只有a = 1z,才有out = 0
         ...
      endcase
      
    • case(select[1,2])
           2'b00: result   = 0;
           2'b01: result   = flaga;
           2'b0x,
           2'b0z: result   = flaga ? 'bx:0;
           2'b10: result   = flagb;
           2'bx0,
           2'bz0: result   = 0;
          default: result   = flagb ? 'bz:0;
       endcase
      //当多个分项可以共用一个语句或语句块。其分支表达式之间用“,”隔开。
      
    • case语句还有两种变种,即casez语句和casex语句。

    • casez:

      ​ 忽略比较过程中值为z的位,即如果比较的双方(表达式的值与分支表达式的值)有一方的某一位的值是z,那么对这些位的比较就不予考虑,只需关注其他位的比较结果。

    • casex:

      ​ 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即将z和x均视为无关值。

      casez01xz
      01001
      10101
      x0011
      z1111
      //在分支表达式中,z常用?代替。
      casez(a)
               3'b1?? :  out1 = 1;//如果a=100、101、110、111或1xx,1zz等,都有out1 = 1。
           
               3'b0?1 :  out2 = 1; //如果a=001、011、0x1、0z1,都有out2 = 1
              .......
      endcase
      
      casex01xz
      01011
      10111
      x1111
      z1111
      例如:
          casex(a)
      	         2'b1x:out=1;  
                ..................
           endcase
      //如果a=10、11、1x、1z,都有out=1。
      
    • if语句条件不完备情况

      如果if语句和case语句的条件描述不完备,会造成不必要的锁存器 。

      一般不可能列出所有分支,因为每一变量至少有4种取值0,1,z,x。为包含所有分支,可在if语句最后加上else;在case语句的最后加上default语句。

    • 回顾一下锁存器和寄存器的区别:

    在这里插入图片描述

    always@(a or b) 
            begin 
               if(a == 1’b1)
                    y = b;
           end
    

    在这里插入图片描述

    always@(posedge clk) 
            begin 
              if(a == 1’b1)
                  y <= b;
           end
    //毛刺通过D触发器被滤除
    

    在这里插入图片描述
    在这里插入图片描述

    • 对FPGA来说,它的基本逻辑单元由多输入查找表、 D触发器构成,并不存在锁存器结构,因此如果在FPGA设计中使用锁存器,需要更多的资源来搭建锁存器,反而会更消耗资源。

    • 所以在FPGA设计中,应该避免锁存器。在时序逻辑电路中,可以将锁存器改为带使能端的D触发器;在组合电路中,可以通过更改代码以覆盖所有条件分支等方式避免产生锁存器。

       always @(al or d)
          begin
           if(al)
                q<=d;
          end
          //有锁存器
      always @(al or d)
        begin
          if(al)   q<=d;
          else    q<=0
        end
          //无锁存器
      
    • 检查一下上边的"always"块,if语句保证了只有当al=1时,q才取d的值。这段程序没有写出 al = 0 时的结果, 那么当al=0时会怎么样呢?

      在"always"块内,如果在给定的条件下变量没有赋值,这个变量将保持原值,也就是说会生成一个锁存器!

    • 避免偶然生成锁存器的错误。如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。

    3.forever语句

    forever语句的格式如下:
          forever   语句;
        或者:    
           forever
              begin            
                  语句1;
                  语句2;
                  ……
              end
    
    • forever表示永久循环,无条件地无限次执行其后的语句,相当于while(1),直到遇到系统任务$finish$stop,如果需要从循环中退出,可以使用disable

    • 循环语句多用于生成时钟等周期性波形,它与always语句不同之处在于不能独立写在程序中,而必须写在initial块中。

      initial
          begin
               clk = 0;
               forever #25 clk = ~clk;     
          end
      
    • forever应该是过程块中最后一条语句。其后的语句将永远不会执行。

    • forever语句不可综合,通常用于testbench描述。

      ...
      reg clk;
      initial
            begin
            clk = 0;
            forever //这种行为描述方式可以非常灵活的描述时钟,可以控制时钟的开始时间及周期占空比。仿真效率也高。
                  begin
                       #10 clk = 1;
                       #10 clk = 0;
                 end
      end
      ...
      

    4.repeat语句

    • repeat语句是最简单的循环语句,用于循环次数已知的情况。

      repeat语句的表达形式为:

      repeat(循环次数)
           begin
               操作1;
      	     操作2;
               ………
           end
      
    • 下例实现连续8次循环左移的操作:

      if (rotate == 1)
        repeat (8)     
         begin
             temp = data[15];
             data = {data << 1,temp};  // data循环左移8次
         end
      

    5.while语句

    • while语句通过控制某个变量的取值来控制循环次数。一般表达形式:

      while(条件)
          begin
                操作1;
                操作2;
                ………
           end
      

      在使用while语句时,一般在循环体内更新条件的取值,以保证在适当的时候退出循环。

    • 下例实现连续4次循环的操作

      i = 0;
      while(i < 4)
          begin
             a = a + 1;
             //更新条件取值,使循环4次退出循环
       	   i = i + 1; 
          end
      
    • 可见在while结构中只要表达式为真(不为0),则重复执行一条语句(或语句块)

      //其功能为:统计tempreg中 1 的个数
      . . .
      reg [7: 0] tempreg;
      reg [3: 0] count;
      . . .
            count = 0;
            while (tempreg) 
            begin
                  if (tempreg[0]) 
                      count = count + 1;
                  tempreg = tempreg >> 1; // Shift right
            end
      end
      . . .
      /*
      Tempreg:
       1011
       0101
       0010
       0001
       0000
      */
      

    6.for语句

    • for语句可以实现所有的循环结构。其表达形式如下:

      for(循环变量赋初值;条件表达式;更新循环变量)
             begin
                操作1:
                操作2;
                ………
             end
      
    • 它的执行过程如下:

      (1)先对循环变量赋初值。

      (2)计算条件表达式,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面的第(3)步。若为假(0),则结束循环,转到第5步。

      (3) 若条件表达式为真,在执行指定的语句后,执行更新循环变量。

      (4) 转回上面的第(2)步骤继续执行。

      (5) 执行for语句下面的语句。

    for(i = 0; i <4; i =i+1)
        begin 
    		a = a+1;
         end
    
    • 例:用for语句来实现8位数据中低4位左移到高4位;

          integer i;
          reg [7:0] datain;
      
         always @ (posedge clk)
           begin
                for(i=4;i<=7;i=i+1)
                    begin
                       datain[i]  <=  datain [i-4];
                    end
           end   
      
    • 例:编写 在一个时钟周期内用for语句计算出13路脉冲信号为高电平的个数。

         input clk,rst;
         input [12:0]  datain;    
         output [3:0]  numout;    
         reg [3:0] i;
         reg [3:0] num;
        always @ (posedge clk) 
          begin
              if ( !rst )  //重置信号
                   num <= 0;  
             else 
                begin
                    for ( i = 0; i < 13; i = i + 1)   //用for循环进行计算
                        if ( datain [i ] )  num  <= num +1;                   
                 end
          end
      

    7.disable语句

    • 在有些特殊的情况下,需要使用disable强制退出循环。
    • 使用disable语句强制退出循环,首先要给循环部分起个名字,方法是在begin后添加“: 名字”。即disable语句可以中止有名字的begin…end块和fork…join块。
    • 语句块可以具有自己的名字,这称为命名块。

    命名块的特点是:

    命名块中可以声明局部变量;

    命名块是设计层次的一部分,命名块中声明的变量可以通过层次名引用进行访问

    命名块可以被禁用,例如停止其执行。

     //命名块
     module top;
      initial
        begin : block1
           integer i;
           ……….
         end
       
     initial
        fork : block2
           reg i;
           ……….
           ……….
         join
    
    • Verilog通过关键字disable提供了一种中止命名块执行的方法。

      disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。

      对块语句的禁用导致本块语句终止执行,紧接在块后面的那条语句被执行。

    • 例:(在C语言中break和continue的区别)

      begin  :continue
            a = 0; b =0;
            for(i=0;i<4;i = i+1)
             begin
                a = a+1;
                if(i==2) disable continue;
                b = b+1;
             end
       end
       ……………….;//a做3次加1操作后强制退出循环;而b只做2次加1操作。
      
           a=0; 
           b=0;
           for( i=0; i<4; i=i+1)
             begin: continue
      	    a = a+1;
                     if( i ==2) disable continue;
                     b= b+1;
              end
            ……………………….;
      //中止一次循环,继续下一次循环; a做4次加1操作, b只做3次加1操作.
      
    展开全文
  • Java 条件语句&switch case 语句

    千次阅读 2020-05-17 17:15:41
    Java 条件语句 1.if语句 一个 if 语句包含一个布尔表达式和一条或多条语句。 if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块...

    Java 条件语句

    1.if语句

    一个 if 语句包含一个布尔表达式和一条或多条语句。

    if(布尔表达式) {
       //如果布尔表达式为true将执行的语句
    }
    

    如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。
    例子:

    public class Test {
       public static void main(String args[]){
          int x = 10;
          if( x < 20 ){
             System.out.print("这是 if 语句");
          }
       }
    }
    

    2.if…else语句

    if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行。

    if(布尔表达式){
       //如果布尔表达式的值为true
    }else{
       //如果布尔表达式的值为false
    }
    

    例子:

    public class Test {
     
       public static void main(String args[]){
          int x = 30;
     
          if( x < 20 ){
             System.out.print("这是 if 语句");
          }else{
             System.out.print("这是 else 语句");
          }
       }
    }
    

    3.if…else if…else 语句

    使用 if,else if,else 语句的时候,需要注意下面几点:

    • if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。

    • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。

    • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。

    if(布尔表达式 1){
       //如果布尔表达式 1的值为true执行代码
    }else if(布尔表达式 2){
       //如果布尔表达式 2的值为true执行代码
    }else if(布尔表达式 3){
       //如果布尔表达式 3的值为true执行代码
    }else {
       //如果以上布尔表达式都不为true执行代码
    }
    

    例子:

    public class Test {
       public static void main(String args[]){
          int x = 30;
     
          if( x == 10 ){
             System.out.print("Value of X is 10");
          }else if( x == 20 ){
             System.out.print("Value of X is 20");
          }else if( x == 30 ){
             System.out.print("Value of X is 30");
          }else{
             System.out.print("这是 else 语句");
          }
       }
    }
    //--------------------------------------------------------------------------------
    //结果 :Value of X is 30
    

    4.嵌套的 if…else 语句

    使用嵌套的 if…else 语句是合法的。也就是说你可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。

    if(布尔表达式 1){
       如果布尔表达式 1的值为true执行代码
       if(布尔表达式 2){
          如果布尔表达式 2的值为true执行代码
       }
    }
    

    例子:

    public class Test {
     
       public static void main(String args[]){
          int x = 30;
          int y = 10;
     
          if( x == 30 ){
             if( y == 10 ){
                 System.out.print("X = 30 and Y = 10");
              }
           }
        }
    }
    //----------------------------------------------------------------------------------------
    //结果:X = 30 and Y = 10
    

    Java switch case 语句

    switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

    1.语法

    switch(expression){
        case value :
           //语句
           break; //可选
        case value :
           //语句
           break; //可选
        //你可以有任意数量的case语句
        default : //可选
           //语句
    }
    

    switch case 语句有如下规则:

    • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

    • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。

    • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

    • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。

    • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。

    • switch 语句可以包含一个 default 分支,该分支一般是 switch语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default分支不需要 break 语句。

    switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。

    public class Test {
       public static void main(String[] args){
          char grade = 'C';
          switch(grade) {
             case 'A' :
                System.out.println("优秀");
                break;
             case 'B' :
             case 'C' :
                System.out.println("良好");
                break;
             case 'D' :
                System.out.println("及格");
                break;
             case 'F' :
                System.out.println("你需要再努力努力");
                break;
             default :
                System.out.println("未知等级");
          }
          System.out.println("你的等级是 " + grade);
       }
    }
    //---------------------------------------------------------------------------------------
    //结果:
    //良好
    //你的等级是 C
    

    如果 case 语句块中没有 break 语句时,JVM 并不会顺序输出每一个 case 对应的返回值,而是继续匹配,匹配不成功则返回默认 case。

    public class Test {
       public static void main(String args[]){
          int i = 5;
          switch(i){
             case 0:
                System.out.println("0");
             case 1:
                System.out.println("1");
             case 2:
                System.out.println("2");
             default:
                System.out.println("default");
          }
       }
    }
    //--------------------------------------------------------------------------------
    //结果:default
    

    如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。

    public class Test {
       public static void main(String args[]){
          int i = 1;
          switch(i){
             case 0:
                System.out.println("0");
             case 1:
                System.out.println("1");
             case 2:
                System.out.println("2");
             default:
                System.out.println("default");
          }
       }
    }
    //结果:1
    //2
    //default
    

    如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。

    public class Test {
       public static void main(String args[]){
          int i = 1;
          switch(i){
             case 0:
                System.out.println("0");
             case 1:
                System.out.println("1");
             case 2:
                System.out.println("2");
             case 3:
                System.out.println("3"); break;
             default:
                System.out.println("default");
          }
       }
    }
    //结果:1,2,3
    
    展开全文
  • Verilog HDL基础之:条件语句

    千次阅读 2020-01-05 20:58:00
    if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了3种形式的if语句。 (1)无分支。 语法形式: if (表达式) 语句; 例如: if (a >...

    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;

    展开全文
  • Golang 条件语句

    千次阅读 2020-08-04 10:53:20
    在Go语言中,条件语句主要包括有if 、 switch 与 select。 注意: Go语言中没有三目运算符,不支持 ?: 形式的条件判断。 if 语句 最简单的if语句 最简单的 if 语句的基本语法: if 条件判断 { // 在当前条件判断为...
  • 【Linux】shell脚本实战-if单双分支条件语句详解

    千次阅读 热门讨论 2020-08-05 22:05:31
    在所有的编程语言里面,if条件语句几乎是最简单的语句格式,且用途最广。 当if后面的<条件表达式>成立(真)的时候,就会执行then后面的指令或语句,否则,就会忽略then后面的指令或语句,转而执行fi下面的...
  • Shell编程之条件语句(详细的图文解读)

    千次阅读 多人点赞 2020-12-16 22:12:26
    Shell编程之条件语句(详细的图文解读) 目录一、条件测试语句(一)、文件测试(二)、整数值比较(三)、字符串比较(四)、逻辑测试二、 if语句(一)、if语句单分支结构(二)、双分支 if 语句(三)、多分支 if...
  • if条件语句

    千次阅读 2019-03-30 11:05:03
    JavaScript基本语句条件语句if语句if...else语句 条件语句 所谓条件控制语句就是对语句中不同条件的值进行判断,进而根据不同的条件执行不同的语句。条件的控制语句主要有两类:一类是if语句以及该语句的各种变种:...
  • 文章目录前言多分支语句的语法多分支语句举例:1....如果你还没有学习单双分支条件语句,建议参考下方链接学习: 【Linux】shell脚本实战-if单双分支条件语句详解 多分支语句的语法 语法结构: if条件测试操作1 ; the
  • Verilog -赋值语句 -条件语句

    千次阅读 2019-07-11 20:37:45
    1赋值 阻塞赋值: = 非阻塞赋值: ...组合逻辑:输出随着输入时刻改变 ...if-else条件语句简写 如 if(a)等同于 if(a == 1) if(!a)等同于 if(a !=1 ) 其他常用方法和C语言类似 2、 case表达式
  • c# switch 条件语句的用法

    千次阅读 2019-07-25 22:44:23
    switch条件语句是一种很常用的选择语句,它与if条件语句不同,它只针对某个表达式的值作出判断,从而决定执行哪一段代码。 switch条件语句用到的关键字: switch case break default 。 switch条件语句的格式...
  • for循环语句和if条件语句

    万次阅读 2019-01-22 01:16:10
    for循环语句和if条件语句 for语句和if语句可多层嵌套使用 for语句: for(初始化条件a;判断是否符合条件b;循环继续下去的条件c){  循环体  }   第一步:执行a  第二步:执行b,判断是否符合条件,如果符合条件...
  • C/C++条件语句

    千次阅读 2019-03-28 08:52:49
    C/C++条件语句 C/C++的条件语句有几种,以下将介绍它们: 第一种是if语句,格式为: if(/判断条件/){ //执行代码 1 } if语句的结构很简单,但是只能根据单一的条件进行判断,我们可以在if语句进行扩充。代码如下:...
  • python: 条件语句、断言

    千次阅读 2018-01-21 21:58:20
    1、语句块并非一种语句语句块是一组满足一定条件时执行一次或多次的语句语句块的创建方式是在代码前放置空格缩进 2、同一段语句块中的每行语句都要保持同样的缩进,如果缩进不同,python编译器就会认为不属于同...
  • Go语言条件语句

    万次阅读 2020-01-23 12:49:33
    Go语言条件语句 GO语言学习教程 www.lsdcloud.com 1 程序的流程结构 程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。 顺序结构:从上向下,逐行执行。 选择结构:条件满足,某些代码才会执行。0-1次...
  • if条件语句和switch语句

    千次阅读 2019-05-15 17:57:29
    1.if条件语句 使用if条件语句,可选择是否要执行紧跟在条件之后的的语句。关键字if之后是作为条件的“布尔表达式”,如果该表达式返回的结果为true,则执行其后的语句,若为false,则不执行if条件之后的语句。 (1)...
  • 学习到了if条件语句的三种语句格式

    千次阅读 2019-09-07 23:10:14
    主要是因为之前已经学过了,是由于最近受某篇博主的启发,尝试把自己所学的东西写进博客里面,这样更容易掌握自己所学的内容,下面就来用自己的语言来表达自己今晚学到的三个if条件语句 1.if 条件语句,编写格式: ...
  • 条件语句和循环语句

    千次阅读 2017-09-02 11:30:37
    条件语句 if语句有三种用法 1.if(表达式){...} //如果表达式的值为真,则执行括号内的复合语句 2.if(表达式){语句1} else{语句2} //如果表达式的值为真,则执行语句1,否则执行语句2 3.if(表达式){语句1} else ...
  • JavaSE基础(14) 条件语句(if、switch)

    千次阅读 2018-08-09 11:19:18
    条件语句:程序的运行是有条件的,满足条件就执行,不满足就不执行 1.if: ①单条件语句: if( 条件判断语句 ){ 当条件判断语句为true,就执行该代码块,为false就不执行 } ②双条件语句: if(条件判断语句)...
  • Groovy 条件语句

    千次阅读 2019-06-15 03:12:35
    在groovy中支持如下 条件语句 1:if/else if/else if ( ... ) { ... } else if (...) { ... } else { ... } 2:switch / case Groovy中的switch语句向后兼容Java代码 Switch supports the following kinds of...
  • if else 条件语句

    千次阅读 2019-05-27 14:09:53
    @JAVA 中的 if…else条件语句 if …else 条件格式 . if(条件判断语句) { 执行语句块//满足条件执行,不满足跳过 } esle 执行语句块 // 习题 1 “某电商网站进行双十一活动,商品总价满300...
  • Matlab编程语言(五)--条件语句

    万次阅读 2019-04-03 15:23:13
    条件语句可用于在运行时选择要执行的代码块。最简单的条件语句为if语句。例如: 通过使用可选关键字elseif,else,即if语句可以包含嵌套。例如: 再者,针对一组已知值测试相等性时,可以使用switch语句。例如:...
  • Python中条件语句里if else语句的使用
  • 从println语句中,可以看到显示在range语句中定义的整个数字范围。 get语句用于从定义的范围中获取一个对象,它将索引值作为参数。 [5, 6, 7, 8, 9, 10] 7 7、运算符优先级 下表按优先级顺序列出了...
  • # if条件语句 # 句式:if 表达式:block(没有else); c=11 if c==1: print("满足条件时只有这一句输出,不满足条件表达式时没有其他输出") # 句式2:if 表达式:block,else:block; # 示例1: a=18 if a>=18:...
  • 4.Python中条件语句使用方法(if语句、if嵌套)

    万次阅读 多人点赞 2019-04-09 11:33:05
    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 1.if条件语句的基本用法: if 判断条件: 执行语句…… else: 执行...
  • 条件运算符(三目) var check=(condition)?value1:value2; ...条件语句 1、if(condition){ } 2、if(condition){ } else { } 3、if(condition){ } else if(condition1){ } ...
  • Oracle条件语句

    千次阅读 2017-04-24 22:13:50
    条件语句主要作用是根据条件的变化选择执行不同的代码。 1、if语句 【实例】指定一个月份数值,然后使用if...then...elsif语句判断它所属的季节,并输出季节信息。 declare month int:=10; --定义整型变量并赋值 ...
  • Mongodb多条件语句查询

    千次阅读 2019-10-26 14:47:39
    针对Mongodb多个条件查询(and,or) ①and查询语句 db.getCollection('表名').find( {$and:[{"条件1":value},{"条件2":value 2}]} ) ②or 查询语句 db.getCollection('表名'). find( { $or:[{"条件":value}] } )...
  • 条件语句 if then if x< 0 then x=-x; if then do: - end if x< 0 then do : put 'x ; x=-x; end ; if then else 注意;没有elseif 4.select 用法 select ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,130,916
精华内容 452,366
关键字:

条件语句