首页 > 其他分享 >verilog 循环语句

verilog 循环语句

时间:2023-07-14 15:44:06浏览次数:27  
标签:语句 begin repeat end while 循环 verilog

循环语句

在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。

1) forever 连续的执行语句。

2) repeat  连续执行一条语句 n 次。

3) while   执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),则语句一次也不能被执行。

4) for通过以下三个步骤来决定语句的循环执行。

a)先给控制循环次数的变量赋初值。

b)判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。

Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。

while 循环

while 循环语法格式如下:

while (condition) begin
    …
end

while 循环中止条件为 condition 为假。

如果开始执行到 while 循环时 condition 已经为假,那么循环语句一次也不会执行。

当然,执行语句只有一条时,关键字 begin 与 end 可以省略。

下面代码执行时,counter 执行了 11 次。

`timescale 1ns/1ns
module test ;
    reg [3:0]    counter ;
    initial begin
        counter = 'b0 ;
        while (counter<=10) begin
            #10 ;
            counter = counter + 1'b1 ;
        end
    end
   //stop the simulation
    always begin
        #10 ;  if ($time >= 1000) $finish ;
    end
endmodule

仿真结果如下:

for 循环

for 循环语法格式如下:

for(initial_assignment; condition ; step_assignment)  begin
    …
end

initial_assignment 为初始条件。

condition 为终止条件,condition 为假时,立即跳出循环。

step_assignment 为改变控制变量的过程赋值语句,通常为增加或减少循环变量计数。

一般来说,因为初始条件和自加操作等过程都已经包含在 for 循环中,所以 for 循环写法比 while 更为紧凑,但也不是所有的情况下都能使用 for 循环来代替 while 循环。

下面 for 循环的例子,实现了与 while 循环中例子一样的效果。需要注意的是,i = i + 1 不能像 C 语言那样写成 i++ 的形式,i = i -1 也不能写成 i -- 的形式。

// for 循环语句
integer      i ;
reg [3:0]    counter2 ;
initial begin
    counter2 = 'b0 ;
    for (i=0; i<=10; i=i+1) begin
        #10 ;
        counter2 = counter2 + 1'b1 ;
    end
end

repeat 循环

repeat 循环语法格式如下:



repeat (loop_times)begin…end

repeat 的功能是执行固定次数的循环,它不能像 while 循环那样用一个逻辑表达式来确定循环是否继续执行。repeat 循环的次数必须是一个常量、变量或信号。如果循环次数是变量信号,则循环次数是开始执行 repeat 循环时变量信号的值。即便执行期间,循环次数代表的变量信号值发生了变化,repeat 执行次数也不会改变。

下面 repeat 循环例子,实现了与 while 循环中的例子一样的效果。

// repeat 循环语句
reg [3:0]    counter3 ;
initial begin
    counter3 = 'b0 ;
    repeat (11) begin  //重复11次
        #10 ;
        counter3 = counter3 + 1'b1 ;
    end
end

下面 repeat 循环例子,实现了连续存储 8 个数据的功能:

always @(posedge clk or negedge rstn) begin
    j = 0  ;
    if (!rstn) begin
        repeat (8) begin
            buffer[j]   <= 'b0 ;      //没有延迟的赋值,即同时赋值为0
            j = j + 1 ;
        end
    end
    else if (enable) begin
        repeat (8) begin
            @(posedge clk) buffer[j]    <= counter3 ;       //在下一个clk的上升沿赋值
            j = j + 1 ;
        end
     end
end

仿真结果如下图。

由图可知,rstn 拉高时,buffer 的 8 个向量同时赋值为 0。

第二个时钟周期后,buffer 依次被 counter3 赋值,实现了连续存储 8 个数据的功能。

forever 循环

forever 循环语法格式如下:



forever begin…end

forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。

forever 相当于 while(1) 。

通常,forever 循环是和时序控制结构配合使用的。

例如,使用 forever 语句产生一个时钟:

reg          clk ;
initial begin
    clk       = 0 ;
    forever begin
        clk = ~clk ;
        #5 ;
    end
end

例如,使用 forever 语句实现一个时钟边沿控制的寄存器间数据传输功能:

reg    clk ;
reg    data_in, data_temp ;
initial begin
    forever @(posedge clk)      data_temp = data_in ;
end

 testbench 仿真

`timescale 1ns/1ns 
module test ;
    reg  ai, bi ; 
    initial begin
        ai         = 0 ;
        #25 ;      ai        = 1 ;
        #35 ;      ai        = 0 ;        //absolute 60ns
        #40 ;      ai        = 1 ;        //absolute 100ns
        #10 ;      ai        = 0 ;        //absolute 110ns
    end
    initial begin
        bi         = 1 ;
        #70 ;      bi        = 0 ;        //absolute 70ns
        #20 ;      bi        = 1 ;        //absolute 90ns
    end
    //at proper time stop the simulation
    initial begin
        forever begin
            #100;
            //$display("---gyc---%d", $time);
            if ($time >= 1000) begin
                $finish ;
            end
        end
   end
endmodule

 

标签:语句,begin,repeat,end,while,循环,verilog
From: https://www.cnblogs.com/lanlancky/p/17553862.html

相关文章

  • java倒序循环
    Java倒序循环在Java编程中,循环是一种常见的控制结构,用于重复执行一段代码。循环可以按照不同的方向进行迭代,包括正序和倒序。倒序循环是指从一个特定的值开始,然后逐渐减小到另一个特定的值。本文将介绍如何在Java中实现倒序循环,并提供一些代码示例。for循环的倒序迭代在Java中,使......
  • java学习day03:循环结构
    我在B站上大学......
  • 循环结构,相关操作字符的库函数,数组
    一,三大循环语句1.while循环当你不知道循环次数时,可以使用while循环#include<stdio.h>intmain(){ inti=123; intj=0; while(i!=j) { scanf("%d",&j); } printf("匹配成功\n"); return0;}以上代码的循环判断条件是i!=j当条件一直成立时,它就会一......
  • CRC循环冗余校验计算过程
    储备知识:同或运算(同0异1)异或运算(同1异0)CRC校验中,多项式可表示为\((\sum_{i=1}^{j}C_iX^i)+1,C=0,1\)注:使用多项式算术是为了在进行二进制计算时无需考虑进位问题CRC中用到的除数,由多项式的各项系数组成运算举例:设多项式为X6+X4+X2+X+1,进行校验的数据设为1101011011可得......
  • m基于FPGA的64QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步
    1.算法仿真效果 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera6.6d StarterEdition 其中Vivado2019.2仿真结果如下:     仿真结果导入matlab可以看星座图:  Quartusii18.0+ModelSim-Altera6.6d StarterEditi......
  • 如何解决 React.useEffect() 的无限循环
    [如何解决React.useEffect()的无限循环-react.useeffect](https://www.51cto.com/article/654928.html)使用useEffect()时,你可能会遇到一个陷阱,那就是组件渲染的无限循环。在这篇文章中,会讲一下产生无限循环的常见场景以及如何避免它们。 useEffect()主要用来管理副作用,比......
  • vue 模拟滚动条循环滚动
    <template><el-cardclass="card-duty"><template#header><divclass="card-header"><span>重大警情</span></div></template>......
  • 循环结构 遗漏点
    switch只记录和c++不同的default的位置和省略情况default可以放在任意位置,也可以省略case穿透不写break会引发case穿透现象就是一直往下执行,直到遇到break或执行完了switch在JDK12的新特性intnumber=10;switch(number){case1->System.out.println("......
  • 【shell】循环执行命令行
    在shell下面循环执行命令行,但不想用cron任务,只用纯粹的shell指令,要怎样实现呢。比如,现在要执行,查看当前目录下文件个数,及各文件的大小,要每隔5秒钟查看一次如果手动执行的话,要先输入ls|wc-l(查看当前目录下,文件的个数)然后再通过du-sh*来查看每个文件的大小如......
  • 分支语句、循环语句
    一、ifelse语句悬空else  else与距离最近的未匹配的if匹配  常量==变量  减少出错机率二、字符串的输入与输出——getcharputchar  (1)   字符串结尾含有“\n” 第一个scanf——“123456” 第二个getchar——“\n”为假 (2) 字符串结尾......