最近我在搞一个FPGA的编程开发,学习了Verilog语言,这里想跟大家分享一下过程块的相关知识。
1、initial语句
即由关键字initial语句引导的过程块。这种过程块在执行的过程中只会执行一次,且在仿真初始时刻(即0时刻)开始执行,一直到当前状态结束,在一个模块中的各个initial过程块之间都是并发执行的。
initial过程块的语法格式如下所示:
initial [时序控制] //可选 过程赋值语句等等 |
下面简单的写一个小模块
module test; reg x,y;
initial x = 1'b0;//单个过程申明语句无需在语句块中 initial begin #10; x = 1'b1; #10; y = 1'b1; end
initial #100 $ finish; //测试中的系统任务结束 endmodule |
说明:一般情况下,initial模块用于在仿真过程中进行初始化、监视、波形生成和其他操作,并且在整个仿真过程中仅执行一次。(变量赋值(初始化赋值等等)可以在其中声明)
2、always语句
即由关键字always语句引导的过程块。always语句块在0时刻开始顺序执行其中的行为语句。当过程块内最后一条语句执行完毕后,在时序控制条件下循环再次执行过程块中的第一条语句,知道仿真结束。当仿真缺少时间控制时会造成仿真死锁。故此,always块常用于数字电路中反复执行的活动建模。
其语法格式为:
always [时序控制] //可选 过程赋值语句等等 |
下面我们给出两个实例:
always语句块带阻塞赋值语句如下:
clk = 1'b0; always #10 clk = ~clk; |
说明:重复执行clock变量的求反造作,从时刻0开始不断循环,直到仿真结束。
always语句块带有非阻塞赋值语句如下:
reg clk; reg [5:0] in ,a,b; always @(posedge clk) //在clk上升沿触发事件控制 begin a <= in; b <= a; end |
说明:为了避免无意义的循环执行,加入时序控制。时序控制的方法之一是加入时延控制(“#”)或者是事件控制(clk上升沿事件)。