问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 70 人浏览分享

开启左侧

第七课 Verilog 语法_条件与循环语句

[复制链接]
70 0
AMD-FPGA课程
AMD课程: 04-FPGA编程基础 » Verilog编程语法入门
1 概述
       本节主要讲解 Verilog 语法条件、循环语句,需要掌握 ifcasecasexcasezwhileforrepeatforever 句的用法。

2 条件语句
2.1 if
       if 语句是用来判定所给的条件是否满足,根据判定的结果(布尔值)决定执行给出的两种操作之一,Verilog 言给出三种形式的 if 语句:
       1if(表达式)语句;例:
always@(negedge clk or negedge rst) //always 触发条件
begin
if (!rst_n)
//rst_n 为 0 时满足条件,进入执行语句
q <= 0;
//q 赋值 0
end
       2if(表达式)
                     语句 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
       3if(表达式)
                     语句 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 xz,按假处理;若为 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 的一
般形式如下:
       1case(表达式)<case 分支>endcase
       2casex(表达式)<case 分支>endcase
       3casez(表达式)<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 语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较。
       下面给出 casecasexcasez 的真值表:
image.jpg
       通过真值表,可以看到 casecasexcasez 依次增加了等价了的范围,因此,使用时需要分析清楚应用逻辑的表达是否正确。

3 循环语句
       Verilog 中的循环语句有 4 个,分别是 foreverrepeatwhile 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 变量的累加。






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

10

粉丝

119

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版