Verilog HDL基础之:其他常用语句
循环语句
在Verilog HDL中存在着4种类型的循环语句,用来控制执行语句的执行次数。
(1)forever:连续的执行语句。
(2)repeat:连续执行一条语句 n 次。
(3)while:执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),则语句一次也不能被执行。
(4)for通过以下3个步骤来决定语句的循环执行。
① 先给控制循环次数的变量赋初值。
② 判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到步骤③。
③ 执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回步骤②。
下面将详细地对各种循环语句进行介绍。
1.forever语句
forever语句的格式如下:
forever 语句;
或者:
forever begin
多条语句
end
forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同之处在于它不能独立写在程序中,而必须写在initial块中。
2.repeat语句
repeat语句的格式如下:
repeat(表达式) 语句;
或者:
repeat(表达式) begin
多条语句
end
在repeat语句中,其表达式通常为常量表达式。下面的例子中使用repeat循环语句及加法和移位操作来实现一个乘法器。
parameter size=8,longsize=16; //参数声明
reg [size:1] opa, opb; //寄存器声明
reg [longsize:1] result;
begin: mult //为begin_end模块定名模块名
reg [longsize:1] shift_opa, shift_opb; //寄存器声明
shift_opa = opa; //将opa、opb的值赋为shift_opa、shift_opb
shift_opb = opb;
result = 0;
repeat(size) begin //循环次数
if(shift_opb[1])
result = result + shift_opa; //加法操作
shift_opa = shift_opa 1; //左移1位
shift_opb = shift_opb >>1; //右移1位
end
end
3.while语句
while语句的格式如下:
while(表达式) 语句
或者:
while(表达式) begin
多条语句
end
下面举一个while语句的例子,该例子用while循环语句对rega这个8位二进制数中值为1的位进行计数。
begin: count1s
reg[7:0] tempreg;
count=0;
tempreg = rega;
while(tempreg) begin //当tempreg中有不为0的位时,循环执行
if(tempreg[0]) count = count + 1; //低位为1时,计数
tempreg = tempreg>>1; //否则右移1位,此时高位用0填补
end
end
4.for语句
for语句的一般形式为:
for(表达式1;表达式2;表达式3) 语句
它的执行过程如下。
① 先求解表达式1。
② 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行步骤③;若为假(0),则结束循环,转到步骤⑤。
③ 若表达式为真,在执行指定的语句后,求解表达式3。
④ 转到步骤②继续执行。
⑤ 执行for语句下面的语句。
for语句最简单的应用形式是很易理解的,其形式如下:
for(循环变量赋初值;循环结束条件;循环变量增值)
执行语句
for循环语句实际上相当于采用while循环语句建立以下的循环结构:
begin
循环变量赋初值;
while(循环结束条件) begin
执行语句
循环变量增值;
end
end
这样对于需要8条语句才能完成的一个循环控制,for循环语句只需两条即可。
下面分别举两个使用for循环语句的例子。例1用for语句来初始化memory。例2则用for循环语句来实现前面用repeat语句实现的乘法器。
例1:for语句1。
begin: init_mem
reg[7:0] tempi;
for(tempi=0;tempimemsize;tempi=tempi+1) //使用for循环语句初始化存储器
memory[tempi]=0;
end
例2:for语句2。
parameter size = 8, longsize = 16;
reg[size:1] opa, opb;
reg[longsize:1] result;
begin: mult
integer bindex;
result=0;
for( bindex=1; bindex=size; bindex=bindex+1 )//使用for循环语句实现前面的乘法器
if(opb[bindex])
result = result + (opa(bindex-1)); //加法并移位
end
在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法,如下所示:
begin: count1s
reg[7:0] tempreg;
count=0;
for( tempreg=rega; tempreg; tempreg=tempreg>>1 )//循环变量增值表达式使用右移操作
if(tempreg[0])
count=count+1;
end
结构说明语句
Verilog语言中的任何过程模块都从属于以下4种结构的说明语句。
(1)initial说明语句。
(2)always说明语句。
(3)task说明语句。
(4)function说明语句。
initial和always说明语句在仿真的一开始即开始执行。initial语句只执行一次,always语句则是不断地重复执行,直到仿真过程结
VerilogHDL 华清远见 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)