在Verilog HDL語(yǔ)言中,時(shí)序邏輯電路使用always語(yǔ)句塊來(lái)實(shí)現(xiàn)。例如,實(shí)現(xiàn)一個(gè)帶有異步復(fù)位信號(hào)的D觸發(fā)器如下。
例1:帶異步復(fù)位的D觸發(fā)器1。
wire Din;
wire clock,rst;
reg Dout;
always @ (posedge clock or negedge rst) //帶有異步復(fù)位
if(rst == 1’b0) Dout <= 1’b0;
else Dout <= Din; //D觸發(fā)器數(shù)據(jù)輸出
在例1中,每當(dāng)時(shí)鐘clock上升沿到來(lái)后,輸出信號(hào)Dout的值便更新為輸入信號(hào)Din的值。當(dāng)復(fù)位信號(hào)下降沿到來(lái)時(shí),Dout的值就會(huì)變成0。必須注意的是,在時(shí)序邏輯電路中,通常使用非阻塞賦值,即使用“<=”。當(dāng)always塊整個(gè)完成之后,值才會(huì)更新,例如:
例2:帶異步復(fù)位的D觸發(fā)器2。
wire Din;
wire clock,rst;
reg Dout;
always @ (posedge clock or negedge rst) //帶有異步復(fù)位
if(rst == 1’b0) out <= 1’b0;
else begin
Dout <= Din; //D觸發(fā)器輸出值還處于鎖定狀態(tài)
Dout <= 1’b1; //D觸發(fā)器輸出值依然處于鎖定狀態(tài)
End //D觸發(fā)器的輸出為1
在例2中,Dout首先被賦值為Din,此時(shí)Dout的值并沒(méi)有發(fā)生改變;接著Dout又被賦值為1,此時(shí)Dout的值依然沒(méi)發(fā)生改變;直到這個(gè)always模塊完成,Dout的值才變成最后被賦的值,此例中Dout的值為1。
在時(shí)序邏輯電路中,always的時(shí)間控制是沿觸發(fā)的,可以單個(gè)信號(hào)也可以多個(gè)信號(hào),中間需要用關(guān)鍵字“or”連接,例如:
always @(posedge clock or posedge reset) begin //由兩個(gè)沿觸發(fā)的always塊
…
end
其中有一個(gè)時(shí)鐘信號(hào)和一個(gè)異步復(fù)位信號(hào)。
always @(posedge clock1 or posedge clock2 or posedge reset) begin
//由3個(gè)沿觸發(fā)的always塊
…
end
其中有兩個(gè)時(shí)鐘信號(hào)和一個(gè)異步復(fù)位信號(hào)。
一般而言,同步時(shí)序邏輯電路更穩(wěn)定,所以建議盡量使用一個(gè)時(shí)鐘觸發(fā)。