1.狀態機的異步置位與復位
異步置位與復位是與時鐘無關的.當異步置位與復位到來時它們立即分別置觸發器的輸出爲1或0,不需要等到時鐘沿到來才置位或復位。把它們列入always塊的事件控制括號內就能觸發always塊的執行,因此,當它們到來時就能立即執行指定的操作。
狀態機的異步置位與復位是用always塊和事件控制實現的。先讓我們來看一下事件控制的語法:
事件控制語法
@( <沿關鍵詞 時鐘信號or 沿關鍵詞 復位信號or 沿關鍵詞 置位信號> )
沿關鍵詞包括 posedge(用於高電平有效的set、reset或上升沿觸發的時鐘)和 negedge(用於低電平有效的set、reset或下降沿觸發的時鐘),信號可以按任意順序列出
事件控制實例
- 異步、高電平有效的置位(時鐘的上升沿)
@(posedge clk or posedge set) - 異步低電平有效的復位(時鐘的上升沿)
@(posedge clk or negedge reset) - 異步低電平有效的置位和高電平有效的復位(時鐘的上升沿)
@( posedge clk or negedge set or posedge reset ) - 帶異步高電平有效的置位與復位的always塊樣板
always @(posedge clk or posedge set or posedge reset)
begin
if(reset)
begin
/*置輸出爲0*/
end
else
if(set)
begin
/*置輸出爲1*/
end
else
begin
/*與時鐘同步的邏輯*/
end
end
- 帶異步高電平有效的置/復位端的D觸發器實例
module dff1( q, qb, d, clk, set, reset );
input d, clk, set, reset;
output q, qb;
//聲明q和qb爲reg類型,因爲它需要在always塊內賦值
reg q, qb;
always @( posedge clk or posedge set or posedge reset )//這個帶了很多信號
begin
if(reset)
begin
q = 0;
qb = 1;
end
else
if (set)
begin
q = 1;
qb = 0;
end
else
begin
q = d;
qb = ~d;
end
end
endmodule
2.狀態機的同步置位與復位
同步置位與復位是指只有在時鐘的有效跳變沿時刻置位或復位信號才能使觸發器置位或復位(即,使觸發器的輸出分別轉變爲邏輯1或0)
不要把set和reset信號名列入always塊的事件控制表達式,因爲當它們有變化時不應觸發always塊的執行。相反,always塊的執行應只由時鐘有效跳變沿觸發,是否置位或復位應在always塊中首先檢查set和reset信號的電平。
事件控制語法:
@(<沿關鍵詞 時鐘信號>)
其中沿關鍵詞指 posedge(正沿觸發)或 negedge(負沿觸發)
事件控制實例
- 正沿觸發
@(posedge clk) - 負沿觸發
@(negedge clk) - 同步的具有高電平有效的置位與復位端的always塊樣板
always @(posedge clk)
begin
if(reset)
begin
/*置輸出爲0*/
end
else
if(set)
begin
/*置輸出爲1*/
end
else
begin
/*與時鐘同步的邏輯*/
end
end//只帶復位信號與時鐘信號
- 同步的具有高電平有效的置位/復位端的D觸發器
module dff2( q, qb, d, clk, set, reset);
input d, clk, set, reset;
output q, qb;
reg q, qb;
always @(posedge clk)
begin
if(reset)
begin
q=0;
qb=1;
end
else
if(set)
begin
q=1;
qb=0;
end
else
begin
q=d;
qb=~d;
end
end
endmodule