0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

合理高效地使用狀態(tài)機是數(shù)字電路中的重要技能

OpenFPGA ? 來源:OpenFPGA ? 2023-02-22 09:17 ? 次閱讀

1題目說明

在許多(較舊的)串行通信協(xié)議中,每個數(shù)據(jù)字節(jié)都與一個起始位和一個停止位一起發(fā)送,以幫助接收器從位流中分隔字節(jié)。一種常見的方案是使用一個起始位 (0)、8 個數(shù)據(jù)位和 1 個停止位 (1)。當(dāng)沒有傳輸任何內(nèi)容(空閑)時,該線路也處于邏輯 1。

設(shè)計一個有限狀態(tài)機,當(dāng)給定比特流時,該機器將識別何時正確接收了字節(jié)。它需要識別起始位,等待所有 8 個數(shù)據(jù)位,然后驗證停止位是否正確。如果停止位沒有按預(yù)期出現(xiàn),則 FSM 必須等到它找到停止位,然后才能嘗試接收下一個字節(jié)。

一些時序圖

無錯誤:

63413946-b249-11ed-bfe3-dac502259ad0.png

未找到停止位。第一個字節(jié)被丟棄:

636dd820-b249-11ed-bfe3-dac502259ad0.png

模塊端口聲明

moduletop_module(
inputclk,
inputin,
inputreset,//Synchronousreset
outputdone
);

2題目解析

串口接收問題,題目沒給狀態(tài)圖,需要自己繪制:

638b53f0-b249-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogicin,
inputlogicreset,//Synchronousreset
outputlogicdone
);

//definestate
typedefenumlogic[3:0]{idle=4'd0,start=4'd1,
receive_1=4'd2,receive_2=4'd3,
receive_3=4'd4,receive_4=4'd5,
receive_5=4'd6,receive_6=4'd7,
receive_7=4'd8,receive_8=4'd9,
stop=4'd10,waite=4'd11
}state_def;

state_defcur_state,next_state;

varlogic[3:0]state_cout;
//describestatetransitionlogicusecombinationallogic

always_combbegin
case(cur_state)
idle:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

start:begin
next_state=receive_1;
end

receive_1:begin
next_state=receive_2;
end

receive_2:begin
next_state=receive_3;
end

receive_3:begin
next_state=receive_4;
end

receive_4:begin
next_state=receive_5;
end

receive_5:begin
next_state=receive_6;
end

receive_6:begin
next_state=receive_7;
end

receive_7:begin
next_state=receive_8;
end

receive_8:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=stop;
end
end

stop:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

waite:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=idle;
end
end
default:begin
next_state=idle;
end
endcase
end

//descibestatesequencerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?idle?;
????end????
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?done?=?(cur_state?==?stop)?;?

endmodule
63ba56fa-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

63e6a070-b249-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

這一題就結(jié)束了。

Part3Problem 135-Fsm_serialdata

3題目說明

上一題用一個有限狀態(tài)機可以識別串行比特流中的字節(jié)何時被正確接收,添加一個數(shù)據(jù)路徑將輸出正確接收的數(shù)據(jù)字節(jié)。out_byte在done為1時需要有效,否則不關(guān)心。

請注意,串行協(xié)議首先發(fā)送最低有效位。

一些時序圖

無錯誤:

64350d6e-b249-11ed-bfe3-dac502259ad0.png

模塊端口聲明

moduletop_module(
inputclk,
inputin,
inputreset,//Synchronousreset
output[7:0]out_byte,
outputdone
);

4題目解析

狀態(tài)機與上題一致。

moduletop_module(
inputlogicclk,
inputlogicin,
inputlogicreset,//Synchronousreset
output[7:0]out_byte,
outputlogicdone
);

//definestate
typedefenumlogic[3:0]{idle=4'd0,start=4'd1,
receive_1=4'd2,receive_2=4'd3,
receive_3=4'd4,receive_4=4'd5,
receive_5=4'd6,receive_6=4'd7,
receive_7=4'd8,receive_8=4'd9,
stop=4'd10,waite=4'd11
}state_def;

state_defcur_state,next_state;

varlogic[3:0]state_cout;
//describestatetransitionlogicusecombinationallogic

always_combbegin
case(cur_state)
idle:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

start:begin
next_state=receive_1;
end

receive_1:begin
next_state=receive_2;
end

receive_2:begin
next_state=receive_3;
end

receive_3:begin
next_state=receive_4;
end

receive_4:begin
next_state=receive_5;
end

receive_5:begin
next_state=receive_6;
end

receive_6:begin
next_state=receive_7;
end

receive_7:begin
next_state=receive_8;
end

receive_8:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=stop;
end
end

stop:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

waite:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=idle;
end
end
default:begin
next_state=idle;
end
endcase
end

//descibestatesequencerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?idle?;
????end????
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?done?=?(cur_state?==?stop)?;
assign?out_byte?=?done???out_bytes_temp?:?8'd0?;

var?logic?[7:0]?out_bytes_temp?;
always_ff?@(?posedge?clk?)?begin?
????if?(next_state?==?receive_1)?begin
????????out_bytes_temp[0]?<=?in?;
????end
????else?if?(next_state?==?receive_2)?begin
????????out_bytes_temp[1]?<=?in?;
????end
????else?if?(next_state?==?receive_3)?begin
????????out_bytes_temp[2]?<=?in?;
????end
????else?if?(next_state?==?receive_4)?begin
????????out_bytes_temp[3]?<=?in?;
????end?
????else?if?(next_state?==?receive_5)?begin
????????out_bytes_temp[4]?<=?in?;
????end
????else?if?(next_state?==?receive_6)?begin
????????out_bytes_temp[5]?<=?in?;
????end
????else?if?(next_state?==?receive_7)?begin
????????out_bytes_temp[6]?<=?in?;
????end
????else?if?(next_state?==?receive_8)?begin
????????out_bytes_temp[7]?<=?in?;
????end
????
end

endmodule

645b7ce2-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

648fa80a-b249-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

這一題就結(jié)束了。

Part4Problem 136-Fsm_serialdp

5題目說明

這題仍然是在前面的基礎(chǔ)上進行進化,增添了奇偶校驗位。奇偶校驗(Parity Check)是一種校驗代碼傳輸正確性的方法。根據(jù)被傳輸?shù)囊唤M二進制代碼的數(shù)位中“1”的個數(shù)是奇數(shù)或偶數(shù)來進行校驗。采用奇數(shù)的稱為奇校驗,反之,稱為偶校驗。奇偶校驗是在傳輸中保障數(shù)據(jù)接收正確的常用方法,也是最初級的校驗方式。

該題采用的是奇校驗的方式,并且提供了奇偶校驗?zāi)K。原本 start 和 stop 位之間的8 bit 變?yōu)榱? bit,新增的1 bit 為奇校驗位,從而使得這9 bit 中“1”的數(shù)量為奇數(shù)個,即題目中提供的奇偶校驗?zāi)K輸出為1時表面數(shù)據(jù)正確,否則數(shù)據(jù)錯誤不予接收。波形圖如下所示。

moduleparity(
inputclk,
inputreset,
inputin,
outputregodd);

always@(posedgeclk)
if(reset)odd<=?0;
????????else?if?(in)?odd?<=?~odd;

endmodule

請注意,串行協(xié)議首先發(fā)送最低有效位,然后在 8 個數(shù)據(jù)位之后發(fā)送奇偶校驗位。

一些時序圖

64b3dc98-b249-11ed-bfe3-dac502259ad0.png

模塊端口聲明

moduletop_module(
inputclk,
inputin,
inputreset,//Synchronousreset
output[7:0]out_byte,
outputdone
);

6題目解析

moduletop_module(
inputlogicclk,
inputlogicin,
inputlogicreset,//Synchronousreset
output[7:0]out_byte,
outputlogicdone
);


//ModifyFSManddatapathfromFsm_serialdata

//definestate
typedefenumlogic[3:0]{idle=4'd0,start=4'd1,
receive_1=4'd2,receive_2=4'd3,
receive_3=4'd4,receive_4=4'd5,
receive_5=4'd6,receive_6=4'd7,
receive_7=4'd8,receive_8=4'd9,
stop=4'd10,waite=4'd11,parity=4'd12
}state_def;

state_defcur_state,next_state;

wirelogicodd;
//describestatetransitionlogicusecombinationallogic

always_combbegin
case(cur_state)
idle:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

start:begin
next_state=receive_1;
end

receive_1:begin
next_state=receive_2;
end

receive_2:begin
next_state=receive_3;
end

receive_3:begin
next_state=receive_4;
end

receive_4:begin
next_state=receive_5;
end

receive_5:begin
next_state=receive_6;
end

receive_6:begin
next_state=receive_7;
end

receive_7:begin
next_state=receive_8;
end

receive_8:begin
next_state=parity;
end

parity:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=stop;
end
end

stop:begin
if(!in)begin
next_state=start;
end
elsebegin
next_state=idle;
end
end

waite:begin
if(!in)begin
next_state=waite;
end
elsebegin
next_state=idle;
end
end

default:begin
next_state=idle;
end
endcase
end

//descibestatesequencerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?idle?;
????end????
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?reset_en?=?(reset?==?1'd1)?||?(next_state?==?stop)?||?(next_state?==?idle)?||?(next_state?==?start)?;

wire?logic?reset_en?;
var?logic?[7:0]?out_bytes_temp?;
always_ff?@(?posedge?clk?)?begin?
????if?(next_state?==?receive_1)?begin
????????out_bytes_temp[0]?<=?in?;
????end
????else?if?(next_state?==?receive_2)?begin
????????out_bytes_temp[1]?<=?in?;
????end
????else?if?(next_state?==?receive_3)?begin
????????out_bytes_temp[2]?<=?in?;
????end
????else?if?(next_state?==?receive_4)?begin
????????out_bytes_temp[3]?<=?in?;
????end?
????else?if?(next_state?==?receive_5)?begin
????????out_bytes_temp[4]?<=?in?;
????end
????else?if?(next_state?==?receive_6)?begin
????????out_bytes_temp[5]?<=?in?;
????end
????else?if?(next_state?==?receive_7)?begin
????????out_bytes_temp[6]?<=?in?;
????end
????else?if?(next_state?==?receive_8)?begin
????????out_bytes_temp[7]?<=?in?;
????end
????
end

always_ff?@(?posedge?clk?)?begin?
????if?(reset)?begin
????????out_byte?<=?8'd0?;
????????done?<=?1'd0?;
????end
????else?if?(next_state?==?stop?&&?odd?==?1'd1)?begin
????????out_byte?<=?out_bytes_temp?;
????????done?<=?1'd1?;
????end
????else?begin
????????out_byte?<=?8'd0?;
????????done?<=?1'd0?;
????end
????
end

???//?New:?Add?parity?checking.?

parity?u_parity?(?.clk(clk),
??????????????????.reset(reset_en),
??????????????????.in(in),
??????????????????.odd(odd)
????????????????);

????

endmodule
65094a34-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

6536a93e-b249-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

這一題就結(jié)束了。

Part5Problem 137-Fsm_hdlc

7題目說明

同步HDLC幀涉及從連續(xù)的比特流中解碼尋找某一幀(即數(shù)據(jù)包)的開始和結(jié)束位置的位模式。(對位模式不太理解的可以參見https://zhuanlan.zhihu.com/p/46317118)。如果接收到連續(xù)的6個1(即01111110),即是幀邊界的“標(biāo)志”。同時為了避免輸入的數(shù)據(jù)流中意外包含這個幀邊界“標(biāo)志”,數(shù)據(jù)的發(fā)送方必須在數(shù)據(jù)中連續(xù)的5個1之后插入一個0,而數(shù)據(jù)的接收方必須將這個多余的0檢測出來并丟棄掉。同時,如果輸入檢測到了了連續(xù)7個或更多的1時,接收方還需要發(fā)出錯誤信號。

創(chuàng)建一個有限狀態(tài)機來識別這三個序列:

0111110 : 信號位需要被丟棄(disc)。

01111110:標(biāo)記幀的開始/結(jié)束 ( flag )。

01111111...:錯誤(7 個或更多 1)(錯誤)。

當(dāng) FSM 被重置時,它應(yīng)該處于一種狀態(tài),就像之前的輸入為 0 一樣。

以下是說明所需操作的一些示例序列。

丟棄0111110:

65616e94-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

標(biāo)志01111110:

657bc398-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

重置和錯誤01111111...:

65a14da2-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

實現(xiàn)這個狀態(tài)機。

模塊端口聲明

moduletop_module(
inputclk,
inputreset,//Synchronousreset
inputin,
outputdisc,
outputflag,
outputerr);

8題目解析

1、請使用10個狀態(tài)以內(nèi)的摩爾機。

2、狀態(tài)圖:

65c77c34-b249-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousreset
inputlogicin,
outputlogicdisc,
outputlogicflag,
outputlogicerr
);

//definestate
typedefenumlogic[2:0]{detect_0=3'd0,receive_1=3'd1,
receive_2=3'd2,receive_3=3'd3,
receive_4=3'd4,receive_5=3'd5,
receive_6=3'd6,receive_7=3'd7
}state_def;

state_defcur_state,next_state;

//describestatetransitionlogicusecombinationallogic
always_combbegin
case(cur_state)
detect_0:begin
next_state=in?receive_1:detect_0;
end

receive_1:begin
next_state=in?receive_2:detect_0;
end

receive_2:begin
next_state=in?receive_3:detect_0;
end

receive_3:begin
next_state=in?receive_4:detect_0;
end

receive_4:begin
next_state=in?receive_5:detect_0;
end

receive_5:begin
next_state=in?receive_6:detect_0;
end

receive_6:begin
next_state=in?receive_7:detect_0;
end

receive_7:begin
next_state=in?receive_7:detect_0;
end

default:begin
next_state=detect_0;
end
endcase
end

//describestatesequecerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?detect_0?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????end
????end

????//describe?output?decoder?use?sequential?and?combinational?logic

????always_ff?@(?posedge?clk?)?begin?
????????if?(reset)?begin
????????????disc?<=?1'd0?;
????????????flag?<=?1'd0?;
????????end
????????else?begin
????????????case?(1'd1)
????????????????(cur_state?==?receive_5)?&&?(next_state?==?detect_0):?disc?<=?1'd1?;
????????????????(cur_state?==?receive_6)?&&?(next_state?==?detect_0):?flag?<=?1'd1?;
????????????????default?:?begin
????????????????????disc?<=?1'd0?;
????????????????????flag?<=?1'd0?;
????????????????end
????????????endcase
????????end
????end

????assign?err??=?(cur_state?==?receive_7)?;

endmodule

65ec9dde-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

660a8d9e-b249-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

這一題就結(jié)束了。

Part6Problem 138-ece241_2013_q8

9題目說明

設(shè)計一個單輸入單輸出串行 2 的互補摩爾狀態(tài)機。輸入 (x) 是一系列位(每個時鐘周期一個),從數(shù)字的最低有效位開始,輸出 (Z) 是輸入的 2 的補碼。機器將接受任意長度的輸入數(shù)字。該電路需要異步復(fù)位。轉(zhuǎn)換在Reset釋放時開始,在Reset置位時停止。

例如:

6652bcae-b249-11ed-bfe3-dac502259ad0.png

模塊端口聲明

moduletop_module(
inputclk,
inputareset,
inputx,
outputz
);

10題目解析

米里型的輸出由當(dāng)前狀態(tài)和輸入信號的組合邏輯實現(xiàn),輸出信號與輸入信號同步。

而摩爾型狀態(tài)機的輸出僅由當(dāng)前狀態(tài)決定,與輸入信號異步,往往存在延遲。

moduletop_module(
inputlogicclk,
inputlogicaresetn,//Asynchronousactive-lowreset
inputlogicx,
outputlogicz);

//definestate
typedefenumlogic[1:0]{idle=2'd0,state_1=2'd1,state_2=2'd2}state_def;

state_defcur_state,next_state;

//describestatesequecerusesequentiallogic
always_ff@(posedgeclkornegedgearesetn)begin
if(!aresetn)begin
cur_state<=?idle?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????end
????end

????//describe?state?transition?logic?use?combinational?logic

????always_comb?begin?
????????case?(cur_state)
????????????idle:?begin
????????????????next_state?=?x???state_1?:?idle?;
????????????end?

????????????state_1:?begin
????????????????next_state?=?x???state_1?:?state_2?;
????????????end

????????????state_2:?begin
????????????????next_state?=?x???state_1?:?idle?;
????????????end
????????????default:?begin
????????????????next_state?=?idle?;
????????????end
????????endcase
????end

????//describe?output?decoder?use?combinational?logic
????assign?z?=?(cur_state?==?state_2)?&&?(x?==?1'd1)?;
????
endmodule

666e822c-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

6698b07e-b249-11ed-bfe3-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。

這一題就結(jié)束了。

Part7Problem 139-ece241_2014_q5a

11題目說明

設(shè)計一個單輸入單輸出串行 2 的互補摩爾狀態(tài)機。輸入 (x) 是一系列位(每個時鐘周期一個),從數(shù)字的最低有效位開始,輸出 (Z) 是輸入的 2 的補碼。機器將接受任意長度的輸入數(shù)字。該電路需要異步復(fù)位。轉(zhuǎn)換在Reset釋放時開始,在Reset置位時停止。

例如:

6652bcae-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputareset,
inputx,
outputz
);

12題目解析

moduletop_module(
inputlogicclk,
inputlogicareset,
inputlogicx,
outputlogicz
);

//definestate

typedefenumlogic[1:0]{S0=2'd0,S1=2'd1,S2=2'd2}state_def;

state_defcur_state,next_state;

//describestatetransitionusecombinationallogic

always_combbegin
case(cur_state)
S0:begin
next_state=x?S1:S0;
end

S1:begin
next_state=x?S2:S1;
end

S2:begin
next_state=x?S2:S1;
end
default:begin
next_state=S0;
end
endcase
end

//describestatesequencerusesequentiallogic

always_ff@(posedgeclkorposedgeareset)begin
if(areset)begin
cur_state<=?S0?;
????end
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?z?=?(cur_state?==?S1)?;
?
endmodule

66d718be-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

66f8412e-b249-11ed-bfe3-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。

這一題就結(jié)束了。

Part8Problem 140-23_ece241_2014_q5b

13題目說明

本題和上一題 Serial two's complementer (Moore FSM) 一樣,使用狀態(tài)機實現(xiàn)一個二進制補碼生成器,不同的是此題使用米里型狀態(tài)機實現(xiàn)。

6762541a-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputareset,
inputx,
outputz
);

14題目解析

存在兩個狀態(tài),復(fù)位狀態(tài) A,在輸入 x 為 1 后狀態(tài)轉(zhuǎn)移為 B,并保持在狀態(tài) B。

狀態(tài) A 中輸出 z 與輸入 x 相同;狀態(tài) B 中輸出 z 與輸入 x 相反。

moduletop_module(
inputlogicclk,
inputlogicareset,
inputlogicx,
outputlogicz
);

//definestate

typedefenumlogic{S0=1'd0,S1=1'd1}state_def;

state_defcur_state,next_state;

//describestatetransitionusecombinationallogic

always_combbegin
case(cur_state)
S0:begin
next_state=x?S1:S0;
end

S1:begin
next_state=S1;
end

default:begin
next_state=S0;
end
endcase
end

//describestatesequencerusesequentiallogic

always_ff@(posedgeclkorposedgeareset)begin
if(areset)begin
cur_state<=?S0?;
????end
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?z?=?((cur_state?==?S0)?&&?(x?==?1'd1))?||?((cur_state?==?S1?)?&&?(x?==?1'd0));
?
endmodule

678b5efa-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

67e4e484-b249-11ed-bfe3-dac502259ad0.png

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。

這一題就結(jié)束了。

Part9Problem 141-2014_q3fsm

15題目說明

考慮具有輸入s和w的有限狀態(tài)機。假設(shè) FSM 開始于稱為A的重置狀態(tài),如下所示。只要s = 0, FSM 就保持在狀態(tài)A ,當(dāng)s = 1 時,它會移動到狀態(tài)B。一旦進入狀態(tài)B,F(xiàn)SM在接下來的三個時鐘周期內(nèi)檢查輸入w的值。如果在這些時鐘周期中恰好有兩個時鐘周期內(nèi)w = 1,則 FSM 必須 在下一個時鐘周期內(nèi)將輸出z設(shè)置為 1。否則z必須為 0。FSM 繼續(xù)檢查w對于接下來的三個時鐘周期,依此類推。下面的時序圖說明了不同w值所需的z值。

使用盡可能少的狀態(tài)。請注意,s輸入僅在狀態(tài)A中使用,因此只需考慮w輸入。

6829ad08-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputreset,//Synchronousreset
inputs,
inputw,
outputz
);

16題目解析

值得注意的是:需要三個周期中 exactly 兩個周期為 1 。

moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousreset
inputlogics,
inputlogicw,
outputlogicz
);

//definestate

typedefenumlogic{A=1'd0,B=1'd1}state_def;

state_defcur_state,next_state;

//describestatetransitionusecombinationallogic

always_combbegin
case(cur_state)
A:begin
next_state=s?B:A;
end

B:begin
next_state=B;
end

default:begin
next_state=A;
end
endcase
end

//describestatesequencerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?A?;
????end
????else?begin
????????cur_state?<=?next_state?;
????end
end

//define?counter?use?sequential?and?combinational?logic

var?logic?[1:0]?count?,?count_c;

wire?logic?resetn?;

assign?resetn?=?(count_c?==?2'd3)???1'd0?:?1'd1?;

always_ff?@(?posedge?clk?)?begin?
????if(reset)?begin
????????count?<=?2'd0?;
????end
????else?if?(!resetn)?begin
????????????if(w?==?1'd1)?begin
?????????????count?<=?2'd1?;
????????????end
????????????else?begin
????????????count?<=?2'd0?;
????????????end
????end
????else?begin
????????if?(cur_state?==?B?&&?w?==?1'd1)?begin
????????????count?<=?count?+?2'd1?;
????????end
????????else?begin
????????????count?<=?count?;
????????end
????????
????end
end

always_ff?@(?posedge?clk?)?begin?
????if?(reset)?begin
????????count_c?<=?2'd0?;
????end
????else?begin
????????if?(cur_state?==?B?&&?count_c?==?2'd3)?begin
????????count_c?<=?2'd1?;
????????end
????????else?if?(cur_state?==?B)?begin
????????????count_c?<=?count_c?+?2'd1?;
????????end
????????else?begin
????????count_c?<=?count_c?;
????????end
????end
????
end


//describe?output?decoder?use?combinational?logic

always_ff@(posedge?clk)?begin?
????if(reset)?begin
????????z?<=?1'd0?;
????end
????else?begin
??????case(?1'd1?)
??????(cur_state?==?B?&&?count_c?==?2'd2?&&?count?==?1?&&?w?==?1)?:?begin
????????z?<=?1'd1?;
??????end
??????(cur_state?==?B?&&?count_c?==?2'd2?&&?count?==?2?&&?w?==?0)?:?begin
????????z?<=?1'd1?;
??????end
??????default?:?begin
????????z?<=?1'd0?;
??????end
??????endcase
????end
end

endmodule

68513d28-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

686ddffa-b249-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

這一題就結(jié)束了。

Part10Problem 142-2014_q3bfsm

17題目說明

這是一道簡單的根據(jù)狀態(tài)轉(zhuǎn)移實現(xiàn)狀態(tài)機的題目,實現(xiàn)完整的三段式狀態(tài)機

688c1de4-b249-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputreset,//Synchronousreset
inputx,
outputz
);

18題目解析

moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousreset
inputlogicx,
outputlogicz
);

//definestate

typedefenumlogic[2:0]{S0=3'b000,S1=3'b001,
S2=3'b010,S3=3'b011,
S4=3'b100
}state_def;

state_defcur_state,next_state;

//describestatetransitionusecombinationallogic

always_combbegin
case(cur_state)
S0:begin
next_state=x?S1:S0;
end

S1:begin
next_state=x?S4:S1;
end

S2:begin
next_state=x?S1:S2;
end

S3:begin
next_state=x?S2:S1;
end

S4:begin
next_state=x?S4:S3;
end

default:begin
next_state=S0;
end
endcase
end

//describestatesequencerusesequentiallogic

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?S0?;
????end
????else?begin
????????cur_state?<=?next_state?;
????end
end


//describe?output?decoder?use?combinational?logic

assign?z?=?(cur_state?==?S3)?||?(cur_state?==?S4)?;

endmodule


68b21d82-b249-11ed-bfe3-dac502259ad0.png

點擊Submit,等待一會就能看到下圖結(jié)果:

68daecbc-b249-11ed-bfe3-dac502259ad0.png

注意圖中無參考波形。

這一題就結(jié)束了。

Part11總結(jié)

今天的幾道題就結(jié)束了,對于狀態(tài)機的理解還是有益處的,三段式狀態(tài)機是題目一直推崇的,類似狀態(tài)機的公示,可以“套”進去。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    899

    瀏覽量

    40350
  • 接收器
    +關(guān)注

    關(guān)注

    14

    文章

    2475

    瀏覽量

    72042
  • 數(shù)字電路
    +關(guān)注

    關(guān)注

    193

    文章

    1610

    瀏覽量

    80709
  • 狀態(tài)機
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27593

原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(二十)-Problem 134-142(狀態(tài)機三)

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA工程師:如何在FPGA實現(xiàn)狀態(tài)機?

    安全高效狀態(tài)機設(shè)計對于任何使用FPGA的工程師而言都是一項重要技能。選擇Moore狀態(tài)機、Mealy
    發(fā)表于 03-29 15:02 ?1.3w次閱讀
    FPGA工程師:如何在FPGA<b class='flag-5'>中</b>實現(xiàn)<b class='flag-5'>狀態(tài)機</b>?

    FPGA---如何寫好狀態(tài)機,詳細下載pdf

    的基礎(chǔ)上,重點討論如何寫好狀態(tài)機。由于篇幅比較長,如何寫好狀態(tài)機分成三篇呈現(xiàn)。話不多說,上貨。狀態(tài)機是一種思想方法相信大多數(shù)工科學(xué)生在學(xué)習(xí)數(shù)字電路時都學(xué)習(xí)過
    發(fā)表于 09-28 10:29

    狀態(tài)機高效寫法

    狀態(tài)機高效寫法
    發(fā)表于 01-21 06:41

    MCU裸機編程狀態(tài)機的定義與注意事項是什么

    高效的一種形式。可能很多人認(rèn)為裸機狀態(tài)機比較low,怎么也要搞一個RTOS,更甚著要跑Linux才覺得高大上。其實,這都是誤區(qū),適合自己的才是最好的,做產(chǎn)品也一樣,滿足需求很重要。
    發(fā)表于 02-14 06:02

    如何寫好狀態(tài)機

    如何寫好狀態(tài)機:狀態(tài)機是邏輯設(shè)計的重要內(nèi)容,狀態(tài)機的設(shè)計水平直接反應(yīng)工程師的邏輯功底,所以許多公司的硬件和邏輯工程師面試,
    發(fā)表于 06-14 19:24 ?97次下載

    狀態(tài)機思路在單片程序設(shè)計的應(yīng)用

    狀態(tài)機思路在單片程序設(shè)計的應(yīng)用 狀態(tài)機的概念狀態(tài)機是軟件編程的一個
    發(fā)表于 02-09 11:25 ?1w次閱讀
    <b class='flag-5'>狀態(tài)機</b>思路在單片<b class='flag-5'>機</b>程序設(shè)計<b class='flag-5'>中</b>的應(yīng)用

    狀態(tài)機思路在單片程序設(shè)計的應(yīng)用

    狀態(tài)機思路在單片程序設(shè)計的應(yīng)用 狀態(tài)機的概念       狀態(tài)機是軟件編程
    發(fā)表于 03-18 15:00 ?1288次閱讀
    <b class='flag-5'>狀態(tài)機</b>思路在單片<b class='flag-5'>機</b>程序設(shè)計<b class='flag-5'>中</b>的應(yīng)用

    基于RTL綜合策略的狀態(tài)機優(yōu)化方案

    有限狀態(tài)機及其設(shè)計技術(shù)是數(shù)字系統(tǒng)設(shè)計重要組成部分,是實現(xiàn)高效率、高可靠性邏輯控制的重要途徑。
    發(fā)表于 01-05 10:34 ?2449次閱讀
    基于RTL綜合策略的<b class='flag-5'>狀態(tài)機</b>優(yōu)化方案

    狀態(tài)機原理及用法

    狀態(tài)機原理及用法狀態(tài)機原理及用法狀態(tài)機原理及用法
    發(fā)表于 03-15 15:25 ?0次下載

    什么是狀態(tài)機 狀態(tài)機的描述三種方法

    狀態(tài)機 1、狀態(tài)機是許多數(shù)字系統(tǒng)的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下一個狀態(tài)
    的頭像 發(fā)表于 11-16 17:39 ?2.7w次閱讀

    FPGA:狀態(tài)機簡述

    是FPGA設(shè)計中一種非常重要、非常根基的設(shè)計思想,堪稱FPGA的靈魂,貫穿FPGA設(shè)計的始終。 02. 狀態(tài)機簡介 什么是狀態(tài)機狀態(tài)機通過不同的
    的頭像 發(fā)表于 11-05 17:58 ?7481次閱讀
    FPGA:<b class='flag-5'>狀態(tài)機</b>簡述

    如何合理高效地使用狀態(tài)機呢?

    今天還是更新狀態(tài)機,狀態(tài)機基本是整個HDL的核心,合理、高效地使用狀態(tài)機,是
    的頭像 發(fā)表于 02-12 10:21 ?906次閱讀

    基于FPGA的狀態(tài)機設(shè)計

    狀態(tài)機的基礎(chǔ)知識依然強烈推薦mooc上華科的數(shù)字電路與邏輯設(shè)計,yyds!但是數(shù)電基礎(chǔ)一定要和實際應(yīng)用結(jié)合起來,理論才能發(fā)揮真正的價值。我們知道FPGA是并行執(zhí)行的,如果我們想要處理具有前后順序的事件就需要引入狀態(tài)機。
    的頭像 發(fā)表于 07-28 10:02 ?1055次閱讀
    基于FPGA的<b class='flag-5'>狀態(tài)機</b>設(shè)計

    什么是狀態(tài)機?狀態(tài)機的種類與實現(xiàn)

    狀態(tài)機,又稱有限狀態(tài)機(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計
    的頭像 發(fā)表于 10-19 10:27 ?9848次閱讀

    觸發(fā)器和狀態(tài)機的關(guān)系是什么

    觸發(fā)器和狀態(tài)機數(shù)字電路設(shè)計中有著緊密的關(guān)系,它們共同構(gòu)成了時序邏輯電路的基礎(chǔ),用于實現(xiàn)數(shù)據(jù)的存儲、處理和傳輸。
    的頭像 發(fā)表于 08-12 11:24 ?501次閱讀