微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Verilog HDL基础之:其他常用语句

Verilog HDL基础之:其他常用语句

时间:06-05 来源:互联网 点击:

束。在一个模块中,使用initial和always语句的次数是不受限制的。task和function语句可以在程序模块中的一处或多处调用,其具体使用方法在第4章中详细介绍。这里只对initial和always语句加以介绍。

1.initial语句

initial语句的格式如下:

initial begin

语句1;

语句2;

......

语句n;

end

举例说明。

例3:initial语句1。

initial begin

areg=0; //初始化寄存器areg

for(index=0; indexsize; index=index+1)

memory[index]=0; //初始化一个memory

end

在这个例子中用initial语句在仿真开始时对各变量进行初始化。

例4:initial语句2。

initial begin

inputs = b000000; //初始时刻为0

#10 inputs = b011001; //赋值时刻为10

#10 inputs = b011011; //赋值时刻为20

#10 inputs = b011000; //赋值时刻为30

#10 inputs = b001000; //赋值时刻为40

end

从这个例子中,我们可以看到initial语句的另一个用途,即用initial语句来生成激励波形作为电路的测试仿真信号。一个模块中可以有多个initial块,它们都是并行运行的。initial块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。

2.always语句

always语句在仿真过程中是不断重复执行的,其声明格式如下:

always 时序控制> 语句>

always语句由于其不断重复执行的特性,只有和一定的时序控制结合在一起才有用。如果一个always语句没有时序控制,则这个always语句将会发成一个仿真死锁,例如:

always areg = ~areg;

这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生仿真死锁。如果加上时序控制,则这个always语句将变为一条非常有用的描述语句,例如:

always #half_period areg = ~areg;

这个例子生成了一个周期为period(2×half_period) 的无限延续的信号波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。

reg[7:0] counter;

reg tick;

always @(posedge areg) begin

tick = ~tick; //tick反相

counter = counter + 1; //计数器递增

end

这个例子中,每当areg信号的上升沿出现时,把tick信号反相,并且把counter增加1。这种时间控制是always语句最常用的。

always 的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用关键字 or 连接,如:

always @(posedge clock or posedge reset) begin //由两个沿触发的always块

end

always @( a or b or c ) begin //由多个电平触发的always块

end

沿触发的always块常常描述时序逻辑,如果符合,可综合风格要求,用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑。电平触发的always块常常用来描述组合逻辑和带锁存器的组合逻辑,如果符合,可综合风格要求,转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top