07 Verilog语法_条件与循环语句

发布时间 2024-01-07 12:31:52作者: 米联客(milianke)

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

1概述

本节主要讲解Verilog语法条件、循环语句,需要掌握if、case、casex、casez、while、for、repeat、forever语句的用法。

2条件语句

2.1 if

if语句是用来判定所给的条件是否满足,根据判定的结果(布尔值)决定执行给出的两种操作之一,Verilog语言给出三种形式的if语句:

(1)if(表达式)语句;例:

always@(negedge clk or negedge rst) //always触发条件

begin

    if (!rst_n) //rst_n为0时满足条件,进入执行语句

        q <= 0; //q赋值0

end

(2)if(表达式)

语句1;

else

语句2;例:

always@(negedge clk or negedge rst) //always触发条件

begin

    if (!rst_n) //rst_n为0时满足条件,进入执行语句

        q <= 0; //q赋值0

    else

        q <= 1; //rst_nw为非0的时候进入执行语句,q赋值1

end

(3)if(表达式)

语句1;

else if (表达式1)

语句2;

else if (表达式2)

语句……;

else if (表达式n-21)

语句n-2;

else if (表达式n-1)

语句n-1;

else

语句n;例:

always@(negedge clk or negedge rst) //always触发条件

begin

    if (!rst_n) //rst_n为0时满足条件,进入执行语句

        q <= 0; //q赋值0

    else if(s == 2'b00) //s为2'b00时满足条件,进入执行语句

        q <= d[0]; //q赋值d[0]

    else if(s == 2'b01) //s为 2'b01时满足条件,进入执行语句

        q <= d[1]; //q赋值d[1]

    else if(s == 2'b10) //s为 2'b10时满足条件,进入执行语句

        q <= d[2];       //q赋值d[2]

    else if(s == 2'b11) //s为2'b11时满足条件,进入执行语句

        q <= d[3]; //q赋值d[3]

    else

        ;

end

三种格式的if语句在if后都有表达式,该表达式一般为逻辑表达式或者关系表达式。系统对表达式的值进行判断,若为0 ,x,z,按假处理;若为1,按真处理,执行指定的语句。

三种形式的if语句,每个else前有一个";"整个语句结束的时候有一个";"。例:

if (!rst_n) //rst_n为0时满足条件,进入执行语句

        q <= 0; //q赋值0,用";"隔开

    else

        q <= 1; //q赋值1,用";"隔开

因为分号是Verilog语法不可缺少的部分,是if内嵌语句所要求的。如果没有分号,将报语法错误。

在if和else后可以内嵌操作语句,比如,begin end,里面可以同时执行多条语句。例:

    if(s == 2'b00) //当s等于2'b00进入执行语句

    begin

        q <= d[0]; //q赋值d[0],用";"隔开

        q1 <= d[0]; //q1赋值d[0],用";"隔开

        q2 <= d[1]; //q2赋值d[1],用";"隔开

        q3 <= d[2]; //q3赋值d[2],用";"隔开

    end

    else //当s不等于2'b00进入执行语句

    begin

        q <= d[1]; //q赋值d[1],用";"隔开

        q <= d[0]; //q赋值d[0],用";"隔开

        q1 <= d[0]; //q1赋值d[0],用";"隔开

        q2 <= d[1]; //q2赋值d[1],用";"隔开

        q3 <= d[2]; //q3赋值d[2],用";"隔开

    end

同时允许多个if语句进行嵌套使用。

if(表达式)

if(表达式1)

语句1;

else

语句2;

else

if(表达式2)

语句3;

else

语句4;

2.2 case

case语句是一种多路分支选择语句,if语句只有两个分支可以选择,而实际应用中常用到多路选择,case的一般形式如下:

(1)case(表达式)<case分支>endcase

(2)casex(表达式)<case分支>endcase

(3)casez(表达式)<case分支>endcase

case分支项一般格式如下:

分支表达式:语句;

默认项(default项):语句;例:

    case(s) //判断参数为s

        2'b00:q <= d[0]; //s为2'b00,q赋值d[0]

        2'b01:q <= d[1]; //s为2'b01,q赋值d[1]

        2'b10:q <= d[2]; //s为2'b10,q赋值d[2]

        2'b11:q <= d[3]; //s为2'b11,q赋值d[3]

        default:q <= 0;

    endcase

case后的表达式称为控制表达式,case分支项里面的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。

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

default项可有可无,一个case语句里只准有一个default项。

每一个case分项的分支表达式的值必须互不相同,否则就会出现问题,即对表达式的同一个值,将出现多种执行方案,产生矛盾。

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

在用case语句表达式进行比较的过程中,只有当对应位的值能明确进行比较时,比较才能成功。因此,要注意详细说明case分项的分支表达式的值。

case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较。

下面给出case,casex,casez的真值表:

case

0

1

x

z

 

casez

0

1

x

z

 

casex

0

1

x

z

0

1

0

0

0

 

0

1

0

0

1

 

0

1

0

1

1

1

0

1

0

0

 

1

0

1

0

1

 

1

0

1

1

1

x

0

0

1

0

 

x

0

0

1

1

 

x

1

1

1

1

z

0

0

0

1

 

z

1

1

1

1

 

z

1

1

1

1

通过真值表,可以看到case,casex,casez依次增加了等价了的范围,因此,使用时需要分析清楚应用逻辑的表达是否正确。

3循环语句

Verilog 中的循环语句有 4 个,分别是 forever,repeat,while和for循环。

3.1 forever语句

forever语句的格式如下:

forever 语句;或

forever

begin

多条语句;

end

forever语句常用来产生仿真的周期性波形,它与always语句的区别是不能直接写在程序中,必须写在initial里。例:

reg clk ; //reg变量clk

initial

begin

    clk  = 1 ; //reg变量clk赋初值

    forever

begin

        clk =!clk ;//reg变量clk翻转

        #10 ;

    end

end

此时,forever产生了一个周期性的交变信号,通常用来生成时钟信号。

forever 语句表示一直循环,可以不需要任何条件表达式,一旦开始执行便无限循环的执行下去,只有系统函数 $finish 可以退出 forever。

3.2 repeat语句

repeat语句的格式如下:

repeat(循环次数表达式)语句;

repeat(循环次数表达式)

begin

多条语句;

end

其表达式通常为常量表达式。如果循环次数是个变量,则循环次数是开始执行 repeat 循环时变量信号的值。即执行期间,变量信号值发生了变化,repeat 执行次数也不会改变。例:

reg [3:0]  data;

initial

begin

    data = 4'b0000 ; //data赋初值

    repeat (10) //下列操作循环10次

begin

        #10 ;

        data = data + 1'b1 ;

    end

end

此时,repeat (10)执行了10次变量data的累加操作。

3.3 while语句

while语句的格式如下:

while(表达式)语句;

while(表达式)

begin

多条语句;

end

当表达式为真时执行循环里面的语句,当表达式为假时,跳出循环。例:

reg [3:0] data;

initial

begin

    data = 4'b0000 ; //data赋初值

    while (data <=10) //while (data <=10),变量data的累加值小于10时继续循环,大于10后跳出循环

begin

       #10 ;

       data = data + 1'b1 ;

    end

end

此时,while (data <=10),变量data的累加值小于10时继续循环,大于10后跳出循环。

3.4 for语句

for语句的一般形式如下:

for(表达式1;表达式2;表达式3)语句;

它的执行过程如下:

(1)先求解表达式1。

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

(3)求解表达式3。

(4)执行第(2)步。

(5)结束for语句,进行下面的语句执行。

for语句的应用形式如下:

for(循环变量赋初始值;循环结束条件;循环变量增加)

执行语句;

for语句的功能可以用while语句同样实现,如下:

begin

循环变量赋初始值;

while(循环结束条件)

begin

执行语句;

循环变量增加;

end

end例:

integer i;

reg [3:0]  data;

initial begin

    data = 4'b0000; //data赋初值

    for (i=0; i<=10; i=i+1) //for循环执行在条件i<=10时进行data变量的累加

    begin

        #10;

        data = data + 1'b1;

    end

end

此时,for循环执行在条件i<=10时进行data变量的累加。