Menu Close

Verilog for 循环语句

Verilog for 循环语句在Verilog 语法中,定义了多种循环语句,其中for是应用最广泛的一种语句,不仅可以在顺序语句中使用,在并发语句中也有相应的模型(generate)。for 循环语句可以用在实体模块中,也可以用在仿真模块中。在实体模块中for循环语句是可综合的。

  1. 顺序语句中使用for 循环操作
  2. for循环语句的格式


说明:如果只有一条语句,begin和end关键字可以省略。

一般在for循环中循环变量都使用integer类型。例如:


 

for循环执行步骤如下:

step1: 求解表达式1;

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

step3: 执行,在执行指定的语句后,求解表达式3。

step4: 返回,返回上面的第2步骤继续执行。

step5: 结束循环,执行for循环之后的语句。

 

例1 :利用for循环实现二进制到格雷码转换

十进制,二进制和格雷码的对照表:

十进制 二进制 格雷码 十进制格雷码
0 0000 0000 0
1 0001 0001 1
2 0010 0011 3
3 0011 0010 2
4 0100 0110 6
5 0101 0111 7
6 0110 0101 5
7 0111 0100 4
8 1000 1100 12
9 1001 1101 13
10 1010 1111 15
11 1011 1110 14
12 1100 1010 10
13 1101 1011 11
14 1110 1001 9
15 1111 1000 8


 

 

仿真程序:


 

Modelsim的仿真波形如图1:

图1

for循环也可以用在always过程中,甚至在时钟边沿驱动的always过程中。

例2:利用for循环实现4 x 4乘法器


 

在时钟边沿驱动的always过程中,每次有上升沿的时候,for循环执行一遍。for循环的这种用法也是可综合的。当循环次数较多时,程序的编码效率较高。

仿真程序如下:


 

Modelsim仿真波形如图1:

图1

2.在并发过程中使用for循环

    • 并发过程for循环语句的格式


其实在并发语句中的循环是由generate创建的,generate创建过程本身也是一个独立的语法结构,不仅能使用for循环,还能使用if,case等语法结构。可以认为在并发过程中,generate创建了顺序语句过程,因此if,case,for这些原本只能在顺序语句使用的语法结构,在这里也能使用。generate for还支持循环嵌套。


例:存储器初始化


generate for 与普通的for循环不同点

  • generate for 每次循环都会生成一个例化,虽然没有明确指出例化过程,但例化结果是真实存在的。如果在generate 过成中使用always过程 ,generate 生成的for循环,always只能在for循环之内;而一般for循环,for在always之内。如:

更详细的能容,在generate过程中描述。

 

作业题:在例2仿真程序中有如下语句:

always@(posedge clk)

begin

ta <= ta + 1;

if(ta == 15)

tb <= tb + 1;

end

如果替换成的语句如下:

always@(posedge clk)

begin

ta = ta + 1;

if(ta == 15)

tb = tb + 1;

end

请比较两段代码的结果有何不同?

 

练习题:

完善下面的代码,实现输入0,1位数的统计,并在输出端最高位加奇校验。b[7:0] 为a中1的个数统计,b[8] 为b[7:0] 的奇校验。

module statistic_parity

(

input  [253:0]   a,

output [8:0]         b

)

 

endmodule

 

对应视频:

Posted in FPGA, FPGA 教材教案, Quartus II, Verilog