Verilog循环语句关键字是Verilog HDL中的一种重要语句,它用于控制程序的执行流程。Verilog循环语句关键字包括for、while、repeat和forever。
for循环是最常用的Verilog循环语句,它由三个部分组成:初始化部分、条件部分和迭代部分。在for循环中,首先会执行初始化部分,然后检查条件部分是否为真,如果为真就执行循环体;如果条件不为真就跳出for循环。在执行完一轮循环体之后,会执行迭代部分;然后再次检查条件是否为真;如此重复直至条件不为真时退出for循环。
// for 循环例子 for (i=0; i<10; i=i+1) begin // 循环体 end
while循环也是一个常用的Verilog循环语句。它只有一个条件部分;当while条件满足时就会执行while循环体;当while条件不再满足时就会退出while循环。
// while 循环例子 i = 0; while (i < 10) begin // 循环体 i = i + 1; // 迭代 end
repeat-until语句也是一个常用的Verilog循环语句。它有一个repeat-until块和一个until条件检测部分。在repeat-until中,首先会执行repeat-until块中的代码;然后再去检测until条件是否成立;如果成立就退出repeat-until语句;如果不成立就重复上述步驟直至until条件满足时退出repeat-until语句。
// repeat - until 循 環例子 i = 0; // 初始化 repeat (10) begin // repeat - until 块 // 復迴體 i = i + 1; // 迴圈遞增 if (i == 10) begin // until 條件測試 $finish; // 達成 until 條件時離開 repeat - until 迴圈 end end
Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。
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(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 (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 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
点击这里下载源码
cover-view基础库 1.4.0 开始支持,低版本需做兼容处理。覆盖在原生组件之上的文本视图。可覆盖的原生组件包括map、video、canva...
navigator基础库 1.0.0 开始支持,低版本需做兼容处理。页面链接。属性名类型默认值说明targetStringself在哪个目标上发生跳转,...
wx.openVideoEditor(Object object)基础库 2.12.0 开始支持,低版本需做兼容处理。打开视频编辑器参数Object object属性类型默认...
wx.playVoice(Object object)从基础库1.6.0开始,本接口停止维护,请使用wx.createInnerAudioContext代替开始播放语音。同时只允...
温度传感器LM35系列是精密集成电路温度器件,输出电压与摄氏温度成线性比例。LM35器件优于以开尔文校准的线性温度传感器,因为用...
如果你是一个经验丰富的Node开发人员,你肯定知道semver- 然而这里给你的依赖管理系统可能只有粗略的指导建议而不是固定的版本号...
数据连接是任何数据分析的常见要求。可能需要在单个源中连接来自不同表的数据,或者从多个源连接数据。Tableau提供了使用“Data...
灵活的快捷键使得编程过程手不离键盘效果如下图新建html基本模板后,当前光标处于title标签内,此时我们给HTML设置title:hellohbui...