Menu Close

Verilog repeat 循环语句

repeat 语句也是一种循环语句,repeat 循环语句执行指定循环数,如果循环计数表达式的值不确定,即为 x 或z 时,那么循环次数按 0 处理。repeat循环用在顺序过程,函数(function)或任务(task)等循环语句中,也是一种可综合的语句,其语法格式如下:

repeat(表达式) begin
    执行语句0;
    
    执行语句1;
    
    ...
    
    执行语句n;
end

如果只有一条语句,关键字begin,end也可以省略。表达式可以是数值,变量或由运算符组成的表达式,但表达式最终的结果应该为常数。

例1:利用repeat 循环语句实现参数化乘法器

module para_mult
#(parameter WIDTH = 4)
(
    input      [WIDTH-1:0]   a, b,
    output reg [2*WIDTH-1:0] p
); 
 
reg   [WIDTH*2-1:0] a_r;  //注意a_r的宽度一定要是a的宽度的两倍,否则在                 //左移时会丢失数据。
reg   [WIDTH-1:0] b_r;
 
always@(a,b)
begin
    p = 0;
    a_r = a;
    b_r = b;
 
    repeat (WIDTH)  
    begin
        if(b_r[0])     
            p = p + a_r;
        a_r = a_r << 1;  //左移一位
        b_r = b_r >> 1;  //b_r右移1位,判断b_r[0]是否累加
    end
end
 
endmodule

 

Testbench 测试程序

`timescale 1 ns / 1 ps
 
module tb_test (); 
parameter Period = 20;
parameter WIDTH = 8;
 
reg clk;
 
initial 
begin
    clk = 0;
 
    forever 
        #(Period/2) clk = ~clk;
end
 
reg  rst;
reg  [WIDTH-1:0] a, b;
 
wire [2*WIDTH-1:0] p;
 
initial 
begin
    rst = 1'b1;
    #20
 
    rst = 0;
end
 
always@(posedge clk or posedge rst)
if(rst) 
begin
    a = 0;
    b = 0;
end
else  
begin
    if(a == 2**WIDTH-1)
        b = b + 1;
 
    a = a + 1;
end
 
para_mult   #(.WIDTH(WIDTH))
para_mult_inst
(
    .a (a),
    .b (b),
    .p (p)
);
 
endmodule

 

Modelsim仿真波形如图1:

%title插图%num

图1:

从仿真波形可以看出,利用repeat 配合移位与累加实现乘法运算。

for,forever,while和repeat的异同点:

可综合 可仿真 表达式数量 循环变量调整
for 3 一般包含在表达式中
forever 0 没有循环变量
while 1 执行代码中调整
repeat 1 固定次数

 

作业

  1. 比较下面三段程序有何不同:

(1)

else
begin
    if(a == 2**WIDTH-1)
        b = b + 1;
    a = a + 1;
end

 

(2)

else
begin
    a = a + 1;
    if(a == 2**WIDTH-1)
        b = b + 1;
end

 

(3)

else
begin
    a <= a + 1;
    if(a == 2**WIDTH-1)
        b <= b + 1;
end

 

2. 用repeat语句编写迭代次数为常数的累加器。

 

对应视频:

 

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

1 Comment

发表回复

相关链接