在Mealy狀態機中,輸出是由輸入和現態決定的。而狀態機的次態是由輸入的變化和現態決定的。這個特點決定了再verilog中實現的方式。建議簡單的狀態機就使用兩段式always結構。
一個always中進行狀態的轉換,一個always中進行輸出狀態的變化。
剛剛已經說過,狀態的變化是有輸入時鍾和輸入信號的狀態決定的。這里輸入信號不屬於敏感信號變量,因為狀態的轉換只是在輸入時鍾信號的邊沿發生變化。但是在always內部中會使用輸入信號的狀態,依據輸入信號的狀態進行轉換。
狀態機的輸出是輸入信號和現態決定的。此時輸入信號和現態均屬於這個always的敏感信號。因為這個時候輸出並不是只有在輸入時鍾信號的邊沿發生變化,而是隨着現態和輸入信號的變化而變化。
在書寫always結構的時候,理解這點還是很重要的。下面就看看具體的代碼吧。
module mealy_state_machine(IN,CP,Y,CR);
input IN,CP,CR;
output Y;
reg [1:0]state;
parameter S0=2'b00,S1=2'b10,S2=2'b11;
reg Y;
always @(posedge CP or negedge CR)
begin
if(~CR)begin state<=0;end
else
begin
case(state)
S0:state<=S0;
S1:
begin
if(IN)state<=S2;
else state<=S0;
end
S2:begin
if(IN)state<=S2;
else state<=S0;
end
endcase
end
end
always @(state or IN)
begin
case(state)
S0:Y<=0;
S1:Y<=0;
S2:begin
if(IN)Y<=0;
else Y<=1;
end
endcase
end
endmodule
下面是狀態轉移圖,狀態轉移圖和預定的狀態轉移圖是一樣的。這也說明代碼描述的功能沒錯。
上面的狀態轉移圖是對應 康華光電子技術基礎 數字部分(第五版)中P267。但是后面P307中代碼描述這個電路圖好像有點問題。最后綜合出來的狀態機和要求的狀態機不一樣。但是我一直沒看出錯誤來,所以還請大家多多指導。