Verilog循环语句实例分析
这篇文章主要介绍了Verilog循环语句实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Verilog循环语句实例分析文章都会有所收获,下面我们一起来看看吧。
关键词:while, for, repeat, forever
Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。
while 循环while 循环语法格式如下:
while(condition)begin…end
while 循环中止条件为 condition 为假。
如果开始执行到 while 循环时 condition 已经为假,那么循环语句一次也不会执行。
当然,执行语句只有一条时,关键字 begin 与 end 可以省略。
下面代码执行时,counter 执行了 11 次。
实例
`timescale1ns/1nsmoduletest;reg[3:0]counter;initialbegincounter='b0;while(counterb1;endend//stopthesimulationalwaysbegin#10;if($time>=1000)$finish;endendmodule
仿真结果如下:
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循环语句integeri;reg[3:0]counter2;initialbegincounter2='b0;for(i=0;ib1;endendrepeat 循环
repeat 循环语法格式如下:
repeat(loop_times)begin…end
repeat 的功能是执行固定次数的循环,它不能像 while 循环那样用一个逻辑表达式来确定循环是否继续执行。repeat 循环的次数必须是一个常量、变量或信号。如果循环次数是变量信号,则循环次数是开始执行 repeat 循环时变量信号的值。即便执行期间,循环次数代表的变量信号值发生了变化,repeat 执行次数也不会改变。
下面 repeat 循环例子,实现了与 while 循环中的例子一样的效果。
实例
//repeat循环语句reg[3:0]counter3;initialbegincounter3='b0;repeat(11)begin//重复11次#10;counter3=counter3+1'b1;endend
下面 repeat 循环例子,实现了连续存储 8 个数据的功能:
实例
always@(posedgeclkornegedgerstn)beginj=0;if(!rstn)beginrepeat(8)beginbuffer[j]'b0;//没有延迟的赋值,即同时赋值为0j=j+1;endendelseif(enable)beginrepeat(8)begin@(posedgeclk)buffer[j]
仿真结果如下图。
由图可知,rstn 拉高时,buffer 的 8 个向量同时赋值为 0。
第二个时钟周期后,buffer 依次被 counter3 赋值,实现了连续存储 8 个数据的功能。
forever 循环forever 循环语法格式如下:
foreverbegin…end
forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。
forever 相当于 while(1) 。
通常,forever 循环是和时序控制结构配合使用的。
例如,使用 forever 语句产生一个时钟:
实例
regclk;initialbeginclk=0;foreverbeginclk=~clk;#5;endend
例如,使用 forever 语句实现一个时钟边沿控制的寄存器间数据传输功能:
实例
regclk;regdata_in,data_temp;initialbeginforever@(posedgeclk)data_temp=data_in;end
关于“Verilog循环语句实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Verilog循环语句实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。