兩者的關系
一個程序塊可以有多個initial和always過程塊。每個initial和always說明語句在仿真的一開始同時立即開始執行;initial語句只執行一次,而always語句則不斷重復的活動著,直到仿真結束。但always塊語句后面跟著的過程快是否運行,滿足則運行一次,滿足則運行一次,直到程序結束。一段程序中使用的initial和always語句的次數不受限制,他們都是同時開始運行的。
(1)、initial語句
1、語句格式
initia
begin
語句一;
語句二;
語句三;
語句四;
end
2.舉例說明
initia
begin
S1 = 0 ;
for(index=0;index
上述例子中在仿真開始對各變量進行初始化,這個初始化過程不需要任何仿真時間,即在0ns時間內,便可以完成存儲器的初始化工作。實例2:initia語句生成激勵波形
initial
begin
s= ‘b00000;
#10 s = ’b00001;
#10 s= ‘b00010;
#10 s = ’b00100;
#10 s= ‘b01000;
#10 s = ’b10000;
```/
end
上面程序塊按照順序依次執行
10 :s=1; 20 :s=2;。。.。。.。
注意一個模塊中可以有許多個initial塊,它們都是并行運行的。initial語句最常見的是用于測試文件里面的初始化語句,用來產生測試環境和設置信號記錄。(2)always語句always語句在仿真過程中不斷的運行著。initial語句只執行一次,而always語句則不斷重復的活動著,直到仿真結束。但always塊語句后面跟著的過程快是否運行,滿足則運行一次,滿足則運行一次,直到程序結束。1、語句格式:always 《時序控制》 《語句》always語句由于其不斷活動的特性,只有和一定的時序控制邏輯結合在一起才有用。如果一個always沒有時序控制,它將會產生死鎖,例如:always clk = ~clk;加上時序控制 always可以用來產生時鐘信號:always #10 clk = ~clk 10個時間單位翻轉一次。always的時序控制可以使邊沿觸發(上升沿或者下降沿)也可以用電平觸發,可以是單個信號也可以是多個信號,中間需要用關鍵字or連接,例如:》 邊沿觸發
always@(posedge clk or negedge rst)
》begin
》end
由兩個沿觸發的always只要其中一個沿到來,就立即執行一次過程塊,然后等待下一次的沿到來。電平觸發
always@(a or b or c)
begin
。。.。
end
由多個電平觸發的的always塊,只要a,b,c中的任何一個發生變化,從高到低或者從低到高都會執行一次過程,這里有個疑問,執行過程塊的時刻是在從低到高變化的時候還是什么時候?一個模塊可以包含多個always塊,它們都是并行執行的2. always塊的or時間控制//有異步復位的電平敏感鎖存器
always@(reset or clock or d)//也可以寫成always@(a,b,c) 用,代替or
begin
if(reset)
q = 1‘b0;
else if(clock)
q = d;
end
//用reset異步下降沿復位,clock的正條邊沿觸發的D寄存器
always@(negedge reset , posedge clk)
if(!reset)
q 《= 0;
else
q 《= d;
always@ (*)的使用用符號always@(*)可以把所有輸入變量都包含進敏感列表例如:
always@(a,b,c,d,e,f,g,h,r,m)
begin
out1 = a?(b+c):(d+e);
out2 = f?(g+h):(r+m)
end
可以用下面代碼來代替
always@(*)
begin
out1 = a?(b+c):(d+e);
out2 = f?(g+h):(r+m)
end
前面所討論的時間控制都需要等待信號值的變化或者事件的觸發,使用符號@和后面的敏感列表來表示。verilog允許另外一種形式表示的電平敏感時序控制(即后面的語句或者語句塊必須等到某個條件誒真是才能執行),具體請看下面例子:always
wait(count_enabel) # 20 count = count +1;
```
上面例子中,仿真器連續監視count_enable的值,若其值為1,在20個時間單位過后執行后面的語句,若其值為0,則不執行后面的語句。若其值始終為1,那么count將每過20個時間單位加1.編輯:hfy
-
仿真器
+關注
關注
14文章
1017瀏覽量
83722 -
時序控制
+關注
關注
0文章
37瀏覽量
11960
發布評論請先 登錄
相關推薦
評論