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

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

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

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

OpenFPGA ? 來源:OpenFPGA ? 2023-02-12 10:21 ? 次閱讀

今天還是更新狀態(tài)機(jī),狀態(tài)機(jī)基本是整個(gè)HDL中的核心,合理、高效地使用狀態(tài)機(jī),是數(shù)字電路中的重要技能。

題目說明

fee07744-a980-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputreset,
input[3:1]s,
outputfr3,
outputfr2,
outputfr1,
outputdfr
);

題目解析

moduletop_module(
inputlogicclk,
inputlogicreset,
inputlogic[3:1]s,
outputlogicfr3,
outputlogicfr2,
outputlogicfr1,
outputlogicdfr
);

//definestate
typedefenumlogic[1:0]{empty=2'd0,level_1=2'd1,level_2=2'd2,level_3=2'd3}state_def;
state_defcur_state,next_state;

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

???//describe?next?state?decoder?use?conbinational?logic

???always_comb?begin?

???????unique?case?(s)
???????????3'b000:?next_state?=?empty?;
???????????3'd001:?next_state?=?level_1?;
???????????3'b011:?next_state?=?level_2?;
???????????3'b111:?next_state?=?level_3?;?
???????endcase
???????
???end

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

???//?decoder?output?fr1~fr3
???assign?fr3?=?(cur_state?==?empty)?;
???assign?fr2?=?(cur_state?==?empty)?||?(cur_state?==?level_1)?;?
???assign?fr1?=?(cur_state?==?empty)?||?(cur_state?==?level_1)?||?(cur_state?==?level_2)?;

???//?decoder?output?dfr?

???var?logic?set_dfr?,?reset_dfr?;
???assign?set_dfr?=???((next_state?==?empty)?&&?(cur_state?!=?empty))?||?
??????????????????????((next_state?==?level_1)?&&?(cur_state?!=?level_1)?&&?(cur_state?!=?empty))?||
??????????????????????((next_state?==?level_2)?&&?(cur_state?==?level_3))?;
???assign?reset_dfr?=?((next_state?==?level_3)?&&?(cur_state?!=?level_3))?||?
??????????????????????((next_state?==?level_2)?&&?(cur_state?!=?level_2)?&&?(cur_state?!=?level_3))?||
??????????????????????((next_state?==?level_1)?&&?(cur_state?==?empty))?;
????????????????????
???always_ff?@(?posedge?clk?)?begin?
?????????if?(reset)?begin
?????????????dfr?<=?1'd1?;
?????????end
?????????else?if?(set_dfr)?begin
?????????????dfr?<=?1'd1?;
?????????end
?????????else?if?(reset_dfr)?begin
?????????????dfr?<=?1'd0?;
?????????end
?????????else?begin
?????????????dfr?<=?dfr?;
?????????end
???????
???end


endmodule

fef1a0c8-a980-11ed-bfe3-dac502259ad0.pngff06c96c-a980-11ed-bfe3-dac502259ad0.png

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

ff3ec376-a980-11ed-bfe3-dac502259ad0.png

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

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

Problem 127-Lemmings1

題目說明

旅鼠(Lemmings)游戲涉及相當(dāng)簡(jiǎn)單的小動(dòng)物。所以我們將使用有限狀態(tài)機(jī)對(duì)其進(jìn)行建模。

在 Lemmings 的 2D 世界中,Lemmings 可以處于兩種狀態(tài)之一:向左行走或向右行走。如果遇到障礙物,它會(huì)改變方向。

特別是,如果旅鼠在左邊被撞到,它就會(huì)向右走。

如果它被撞到右邊,它就會(huì)向左走。

如果它的兩側(cè)同時(shí)受到碰撞,它仍然會(huì)切換方向。

實(shí)現(xiàn)具有兩個(gè)狀態(tài)、兩個(gè)輸入和一個(gè)輸出的 Moore 狀態(tài)機(jī)來模擬此行為。

ff578492-a980-11ed-bfe3-dac502259ad0.png

ff634ebc-a980-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputareset,//FreshlybrainwashedLemmingswalkleft.
inputbump_left,
inputbump_right,
outputwalk_left,
outputwalk_right);

題目解析

我們首先需要找出狀態(tài)轉(zhuǎn)移規(guī)則。具體如下圖所示:

ff78d6f6-a980-11ed-bfe3-dac502259ad0.png

找到轉(zhuǎn)移關(guān)系后,后續(xù)的解答就和之前題目相同。

moduletop_module(
inputlogicclk,
inputlogicareset,//FreshlybrainwashedLemmingswalkleft.
inputlogicbump_left,
inputlogicbump_right,
outputlogicwalk_left,
outputlogicwalk_right);

//definestate
typedefenumlogic{left=1'b0,right=1'b1}state_def;
state_defstate,next_state;

//Statetransitionlogic
always_combbegin
case(state)
left:begin
if(bump_left)next_state=right;
elsenext_state=left;
end
right:begin
if(bump_right)next_state=left;
elsenext_state=right;
end
endcase
end


//Stateflip-flopswithasynchronousreset
always@(posedgeclk,posedgeareset)begin
if(areset)state<=?left?;
????????else??????????state?<=?next_state?;
????end

????//?Output?logic
????assign?walk_left?=?(state?==?left?);
????assign?walk_right?=?(state?==?right?);

endmodule


ff88fd60-a980-11ed-bfe3-dac502259ad0.png

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

ffb04384-a980-11ed-bfe3-dac502259ad0.png

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

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

Problem 128-Lemmings2

題目說明

在上一題基礎(chǔ)上,除了左右行走之外,如果地面在它們下方消失,旅鼠還會(huì)掉落(并且大概會(huì)發(fā)出“啊??!”)。

除了左右行走和碰撞時(shí)改變方向外,當(dāng)ground=0時(shí),旅鼠會(huì)倒下并說“啊?。 薄.?dāng)?shù)孛嬷匦鲁霈F(xiàn) ( ground=1 ) 時(shí),旅鼠將繼續(xù)沿與墜落前相同的方向行走。跌倒時(shí)被撞不影響行走方向,與地面消失(但尚未跌落)同周期被撞,或跌倒時(shí)地面再次出現(xiàn),也不影響行走方向。

構(gòu)建一個(gè)模擬此行為的有限狀態(tài)機(jī)。

ffc27950-a980-11ed-bfe3-dac502259ad0.png

ffd0f7e6-a980-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputload,
input[255:0]data,
output[255:0]q);

endmodule

題目解析

還是優(yōu)先畫出狀態(tài)轉(zhuǎn)移圖:

ffe32678-a980-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogicareset,//FreshlybrainwashedLemmingswalkleft.
inputlogicbump_left,
inputlogicbump_right,
inputlogicground,
outputlogicwalk_left,
outputlogicwalk_right,
outputlogicaaah);

//definestate
typedefenumlogic[1:0]{left=2'd0,right=2'd1,fall_left=2'd2,fall_right=2'd3}state_def;
state_defcur_state,next_state;

//describestatetransitionuseconbinationallogic
always_combbegin
case(cur_state)
left:begin
if(!ground)begin
next_state=fall_left;
end
elseif(bump_left)begin
next_state=right;
end
elsebegin
next_state=left;
end
end

right:begin
if(!ground)begin
next_state=fall_right;
end
elseif(bump_right)begin
next_state=left;
end
elsebegin
next_state=right;
end
end

fall_left:begin
if(ground)begin
next_state=left;
end
elsebegin
next_state=fall_left;
end
end

fall_right:begin
if(ground)begin
next_state=right;
end
elsebegin
next_state=fall_right;
end
end
endcase
end

//describestatesequencerusesequentiallogic

always_ff@(posedgeclkorposedgeareset)begin
if(areset)begin
cur_state<=?left?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????end
????end
????
????//describe?output?decoder?use?conbinational?logic
????
????assign?walk_left?=?(cur_state?==?left)??;
????assign?walk_right?=?(cur_state?==?right);
????assign?aaah?=?(cur_state?==?fall_left)?||?(cur_state?==?fall_right)?;
????????

endmodule

fff96dca-a980-11ed-bfe3-dac502259ad0.png0015dbcc-a981-11ed-bfe3-dac502259ad0.png

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

00520458-a981-11ed-bfe3-dac502259ad0.png

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

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

Problem 129-Lemmings3

題目說明

在Lemmings1和Lemmings2基礎(chǔ)上。

除了行走和墜落之外,旅鼠有時(shí)會(huì)被告知做一些有用的事情,比如挖掘(它在dig=1時(shí)開始挖掘)。如果旅鼠當(dāng)前正在地面上行走(ground=1且未掉落),則它可以挖掘,并且會(huì)繼續(xù)挖掘直到到達(dá)另一側(cè)(ground=0)。到那時(shí),由于沒有地面,它會(huì)掉落(啊?。。缓笤谒俅沃睾罄^續(xù)沿原來的方向行走。與掉落一樣,在挖掘時(shí)被碰撞沒有任何效果,而在掉落或沒有地面時(shí)被告知挖掘?qū)⒈缓雎浴?/p>

(換句話說,行走的旅鼠可以掉落、挖掘或轉(zhuǎn)換方向。如果滿足其中一個(gè)以上條件,則掉落的優(yōu)先級(jí)高于挖掘,而挖掘的優(yōu)先級(jí)高于轉(zhuǎn)換方向。)

擴(kuò)展您的有限狀態(tài)機(jī)來模擬這種行為。

0092ada0-a981-11ed-bfe3-dac502259ad0.png

00a18be0-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputareset,//FreshlybrainwashedLemmingswalkleft.
inputbump_left,
inputbump_right,
inputground,
inputdig,
outputwalk_left,
outputwalk_right,
outputaaah,
outputdigging);

題目解析

狀態(tài)轉(zhuǎn)移圖:

00b2575e-a981-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogicareset,//FreshlybrainwashedLemmingswalkleft.
inputlogicbump_left,
inputlogicbump_right,
inputlogicground,
inputlogicdig,
outputlogicwalk_left,
outputlogicwalk_right,
outputlogicaaah,
outputlogicdigging);

//definestate
typedefenumlogic[2:0]{left=3'd0,right=3'd1,
fall_left=3'd2,fall_right=3'd3,
dig_left=3'd4,dig_right=3'd5}state_def;
state_defcur_state,next_state;

//describenextstatetransitionusecombinationallogic

always_combbegin
case(cur_state)
left:begin
if(!ground)begin
next_state=fall_left;
end
elseif(dig)begin
next_state=dig_left;
end
elseif(bump_left)begin
next_state=right;
end
elsebegin
next_state=left;
end
end

right:begin
if(!ground)begin
next_state=fall_right;
end
elseif(dig)begin
next_state=dig_right;
end
elseif(bump_right)begin
next_state=left;
end
elsebegin
next_state=right;
end
end

fall_left:begin
if(ground)begin
next_state=left;
end
elsebegin
next_state=fall_left;
end
end

fall_right:begin
if(ground)begin
next_state=right;
end
elsebegin
next_state=fall_right;
end
end

dig_left:begin
if(!ground)begin
next_state=fall_left;
end
elsebegin
next_state=dig_left;
end
end

dig_right:begin
if(!ground)begin
next_state=fall_right;
end
elsebegin
next_state=dig_right;
end
end
endcase
end


//describestatesequencerusesequentiallogic

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


????//describe?ouput?decoder?use?combinational?logic

????assign?walk_left?=?(cur_state?==?left)?;
????assign?walk_right?=?(cur_state?==?right)?;
????assign?aaah?=?(cur_state?==?fall_left)?||?(cur_state?==?fall_right)?;
????assign?digging?=?(cur_state?==?dig_left)?||?(cur_state?==?dig_right)?;

endmodule

00c6dcba-a981-11ed-bfe3-dac502259ad0.png00df4034-a981-11ed-bfe3-dac502259ad0.png

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

01079660-a981-11ed-bfe3-dac502259ad0.png

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

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

Problem 130-Lemmings4

題目說明

在Lemmings1、Lemmings2和Lemmings3基礎(chǔ)上:

盡管旅鼠可以行走、跌倒和挖掘,但旅鼠并非無懈可擊。如果旅鼠掉落的時(shí)間太長(zhǎng)然后撞到地面,它可能會(huì)死亡。特別是,如果旅鼠掉落超過 20 個(gè)時(shí)鐘周期然后撞到地面,它將永遠(yuǎn)停止行走、掉落或挖掘(所有 4 個(gè)輸出變?yōu)?0)(或直到 FSM 復(fù)位)。旅鼠在撞到地面之前可以跌落多遠(yuǎn)沒有上限。旅鼠只會(huì)在撞到地面時(shí)死亡;它們不會(huì)死亡到半空中。

擴(kuò)展之前的有限狀態(tài)機(jī)來模擬這種行為。

01357080-a981-11ed-bfe3-dac502259ad0.png

跌倒 20 個(gè)周期是可以生存的:

01433f58-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

下降 21 個(gè)周期會(huì)導(dǎo)致死亡:

017057fe-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
inputareset,//FreshlybrainwashedLemmingswalkleft.
inputbump_left,
inputbump_right,
inputground,
inputdig,
outputwalk_left,
outputwalk_right,
outputaaah,
outputdigging);

題目解析

狀態(tài)轉(zhuǎn)移圖:

01887190-a981-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogicareset,//FreshlybrainwashedLemmingswalkleft.
inputlogicbump_left,
inputlogicbump_right,
inputlogicground,
inputlogicdig,
outputlogicwalk_left,
outputlogicwalk_right,
outputlogicaaah,
outputlogicdigging);

//definestate
typedefenumlogic[2:0]{left=3'd0,right=3'd1,
fall_left=3'd2,fall_right=3'd3,
dig_left=3'd4,dig_right=3'd5,
splatter=3'd6,aaah_reset=3'd7
}state_def;
state_defcur_state,next_state;

varlogic[4:0]cycle_cout;

//describenextstatetransitionusecombinationallogic

always_combbegin
case(cur_state)
left:begin
if(!ground)begin
next_state=fall_left;
end
elseif(dig)begin
next_state=dig_left;
end
elseif(bump_left)begin
next_state=right;
end
elsebegin
next_state=left;
end
end

right:begin
if(!ground)begin
next_state=fall_right;
end
elseif(dig)begin
next_state=dig_right;
end
elseif(bump_right)begin
next_state=left;
end
elsebegin
next_state=right;
end
end

fall_left:begin
if(ground)begin
next_state=left;
end
elsebegin
if(cycle_cout==5'd20)begin
next_state=splatter;
end
elsebegin
next_state=fall_left;
end
end
end

fall_right:begin
if(ground)begin
next_state=right;
end
elsebegin
if(cycle_cout==5'd20)begin
next_state=splatter;
end
elsebegin
next_state=fall_right;
end
end
end

dig_left:begin
if(!ground)begin
next_state=fall_left;
end
elsebegin
next_state=dig_left;
end
end

dig_right:begin
if(!ground)begin
next_state=fall_right;
end
elsebegin
next_state=dig_right;
end
end
splatter:begin
if(ground)begin
next_state=aaah_reset;
end
elsebegin
next_state=splatter;
end
end
aaah_reset:begin
next_state=aaah_reset;
end
endcase
end


//describestatesequencerusesequentiallogic

always_ff@(posedgeclkorposedgeareset)begin
if(areset)begin
cur_state<=?left?;
????????????cycle_cout?<=?5'd0??;
????????end
????????else?begin
????????if?((next_state?==?fall_left)?||?(next_state?==?fall_right))?begin
????????????cycle_cout?<=?cycle_cout?+?5'd1?;
????????????cur_state?<=?next_state?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????????if(next_state?==?splatter)begin
????????????????cycle_cout?<=?cycle_cout?+?5'd1?;
????????????end
????????????else?begin
????????????????cycle_cout?<=?5'd0?;
????????????end
????????end
????????end
????????
????end


????//describe?ouput?decoder?use?combinational?logic

????assign?walk_left?=?(cur_state?==?left)?&&?(cur_state?!=?splatter)?;
????assign?walk_right?=?(cur_state?==?right)?&&?(cur_state?!=?splatter)?;
????assign?aaah?=?(cur_state?==?fall_left)?||?(cur_state?==?fall_right)?||?(cur_state?==?splatter)?;
????assign?digging?=?(cur_state?==?dig_left)?||?(cur_state?==?dig_right)?&&?(cur_state?!=?splatter)?;

endmodule

01a2df62-a981-11ed-bfe3-dac502259ad0.png

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

01b7faf0-a981-11ed-bfe3-dac502259ad0.png

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

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

Problem 131-Fsm_onehot

題目說明

給定以下具有 1 個(gè)輸入和 2 個(gè)輸出的狀態(tài)機(jī):

01f88a0c-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

假設(shè)這個(gè)狀態(tài)機(jī)使用 one-hot 編碼,其中state[0]到state[9]分別對(duì)應(yīng)于狀態(tài) S0 到 S9。除非另有說明,否則輸出為零。

實(shí)現(xiàn)狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換邏輯和輸出邏輯部分(但不是狀態(tài)觸發(fā)器)。在state[9:0]中獲得了當(dāng)前狀態(tài),并且必須生成next_state[9:0]和兩個(gè)輸出。

假設(shè)使用one-hot編碼,通過檢查推導(dǎo)出邏輯方程。(測(cè)試平臺(tái)將使用非熱輸入進(jìn)行測(cè)試,以確保你不會(huì)嘗試做更復(fù)雜的事情)。

模塊端口聲明

moduletop_module(
inputin,
input[9:0]state,
output[9:0]next_state,
outputout1,
outputout2);

題目解析

可以通過查看狀態(tài)轉(zhuǎn)換圖的轉(zhuǎn)移的路徑來導(dǎo)出獨(dú)熱碼狀態(tài)轉(zhuǎn)換邏輯的邏輯方程式。

仔細(xì)觀察發(fā)現(xiàn)在當(dāng)前狀態(tài)state為正常獨(dú)熱碼(0x100, 0x1, 0x80)的時(shí)候,輸出的波形是正確的,但是輸入不是獨(dú)熱碼(0x900, 0x180)的時(shí)候,輸出就不正常了,這就是這道題所考察的地方,寫錯(cuò)的同學(xué)自行翻看前一個(gè)獨(dú)熱碼狀態(tài)機(jī)的題目(Problem 125 fsm3onehot)再看正確答案。

//One-hotFSM??????IthinktheProblemhavesomeunreasonable
moduletop_module(
inputlogicin,
inputlogic[9:0]state,
outputlogic[9:0]next_state,
outputlogicout1,
outputlogicout2);

//definestatebitposition
parameterlogic[3:0]S0=0,
S1=1,
S2=2,
S3=3,
S4=4,
S5=5,
S6=6,
S7=7,
S8=8,
S9=9;

//describestatetransitionusecombinationallogic

assignnext_state[S0]=~in&(state[S0]|state[S1]|state[S2]|state[S3]|state[S4]|state[S7]|state[S8]|state[S9]);
assignnext_state[S1]=in&(state[S0]|state[S8]|state[S9]);
assignnext_state[S2]=in&state[S1];
assignnext_state[S3]=in&state[S2];
assignnext_state[S4]=in&state[S3];
assignnext_state[S5]=in&state[S4];
assignnext_state[S6]=in&state[S5];
assignnext_state[S7]=in&(state[S6]|state[S7]);
assignnext_state[S8]=~in&state[S5];
assignnext_state[S9]=~in&state[S6];


//describeoutputdecoderusecombinationallogic

assignout1=state[S8]||state[S9];
assignout2=state[S7]||state[S9];

endmodule

02122eda-a981-11ed-bfe3-dac502259ad0.png

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

02a075b4-a981-11ed-bfe3-dac502259ad0.png

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

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

Problem 132-Fsm_ps2

題目說明

PS/2 鼠標(biāo)協(xié)議發(fā)送三個(gè)字節(jié)長(zhǎng)的消息。但是,在連續(xù)的字節(jié)流中,消息的開始和結(jié)束位置并不明顯。唯一的跡象是每個(gè)三字節(jié)消息的第一個(gè)字節(jié)始終具有bit[3]=1(但其他兩個(gè)字節(jié)的 bit[3] 可能為 1 或 0,具體取決于數(shù)據(jù))。

我們想要一個(gè)有限狀態(tài)機(jī),它會(huì)在給定輸入字節(jié)流時(shí)搜索消息邊界。我們將使用的算法是丟棄字節(jié),直到我們看到一個(gè)帶有bit[3]=1的字節(jié)。然后我們假設(shè)這是消息的第 1 個(gè)字節(jié),并在接收到所有 3 個(gè)字節(jié)(完成)后發(fā)出消息接收信號(hào)

FSM 應(yīng)在成功接收到每條消息的第三個(gè)字節(jié)后立即在周期內(nèi)發(fā)出完成信號(hào)。

一些時(shí)序圖來解釋所需的行為

在沒有錯(cuò)誤的情況下,每三個(gè)字節(jié)組成一條消息:

03027462-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

發(fā)生錯(cuò)誤時(shí),搜索字節(jié) 1:

0320de2a-a981-11ed-bfe3-dac502259ad0.png

請(qǐng)注意,這與1xx序列識(shí)別器不同。此處不允許重疊序列:

034aa70a-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
input[7:0]in,
inputreset,//Synchronousreset
outputdone);

題目解析

盡管in[7:0]是一個(gè)字節(jié),但狀態(tài)機(jī)使用一個(gè)輸入in[3]就夠了。

該狀態(tài)機(jī)可能有4個(gè)狀態(tài),但其中的三種狀態(tài)沒有輸出是為了最后一個(gè)狀態(tài)輸出done桌準(zhǔn)備。而對(duì)于接收到的某個(gè)消息,僅需一個(gè)時(shí)鐘周期即可判斷完成。

狀態(tài)圖。。。

0365ddfe-a981-11ed-bfe3-dac502259ad0.png

moduletop_module(
inputlogicclk,
inputlogic[7:0]in,
inputlogicreset,//Synchronousreset
outputlogicdone);

typedefenumlogic[1:0]{S0=2'd0,S1=2'd1,S2=2'd2,Done=2'd3}state_def;
state_defcur_state,next_state;
//Statetransitionlogic(combinational)
always_combbegin
case(cur_state)
S0:begin
next_state=S1;
end

S1:begin
next_state=S2;
end

S2:begin
next_state=in[3]?S0:Done;
end

Done:begin
next_state=in[3]?S0:Done;
end
default:begin
next_state=Done;
end
endcase

end
//Stateflip-flops(sequential)

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?Done?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????end
????????
????end
????//?Output?logic

????assign?done?=?(cur_state?==?S2)?;
endmodule

03a9acc8-a981-11ed-bfe3-dac502259ad0.png

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

03f42c80-a981-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

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

Problem 133-Fsm_ps2data

題目說明

現(xiàn)在,已經(jīng)寫了一個(gè)PS/2接口的狀態(tài)機(jī),該狀態(tài)機(jī)可以標(biāo)識(shí)PS/2字節(jié)流中的三字節(jié)消息。請(qǐng)?jiān)谶@個(gè)狀態(tài)機(jī)中添加一條數(shù)據(jù)路徑,該數(shù)據(jù)路徑可以在接收數(shù)據(jù)包的同時(shí)輸出24bits(3字節(jié))的消息(out_bytes[23:16]為第一字節(jié),out_bytes[15:8]為第二字節(jié),以此類推)。

當(dāng)發(fā)出接收完成信號(hào)done時(shí),out_bytes必須是有效的,其他時(shí)候可以輸出任何的內(nèi)容(即不在乎輸出什么。)

小提示:使用前一題Problem 134 PS/2 packet parser / Fsm ps2 中的狀態(tài)機(jī),并添加用于捕捉輸入字節(jié)的數(shù)據(jù)路徑即可。

044a4584-a981-11ed-bfe3-dac502259ad0.png

圖片來自HDLBits

模塊端口聲明

moduletop_module(
inputclk,
input[7:0]in,
inputreset,//Synchronousreset
output[23:0]out_bytes,
outputdone);

題目解析

本題在前一題的三個(gè)沒有輸出動(dòng)作的狀態(tài)上添加out_bytes等于輸入即可完成。值得注意的是狀態(tài)4可以跳轉(zhuǎn)為狀態(tài)2,所以狀態(tài)4也需要對(duì)out_bytes賦值。

moduletop_module(
inputlogicclk,
inputlogic[7:0]in,
inputlogicreset,//Synchronousreset
output[23:0]out_bytes,
outputlogicdone);

typedefenumlogic[1:0]{S0=2'd0,S1=2'd1,S2=2'd2,Done=2'd3}state_def;
state_defcur_state,next_state;
//Statetransitionlogic(combinational)
always_combbegin
case(cur_state)
S0:begin
next_state=S1;
end

S1:begin
next_state=S2;
end

S2:begin
next_state=in[3]?S0:Done;
end

Done:begin
next_state=in[3]?S0:Done;
end
default:begin
next_state=Done;
end
endcase

end
//Stateflip-flops(sequential)

always_ff@(posedgeclk)begin
if(reset)begin
cur_state<=?Done?;
????????end
????????else?begin
????????????cur_state?<=?next_state?;
????????end
????????
????end
????//?Output?logic

????assign?done?=?(cur_state?==?S2)?;
????assign?out_bytes?=?done???out_bytes_temp?:?24'd24?;
????var?logic?[23:0]?out_bytes_temp?;
????always_ff?@(?posedge?clk?)?begin?
????????if?(next_state?==?S0)?begin
????????????out_bytes_temp[23:16]?<=?in?;?
????????end
????????else?if?(next_state?==?S1)?begin
????????????out_bytes_temp[15:8]??<=?in?;
????????end
????????else?if?(next_state?==?S2)?begin
????????????out_bytes_temp[7:0]???<=?in?;
????????end
????????
????end

endmodule

04881ddc-a981-11ed-bfe3-dac502259ad0.png

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

04c2f0e2-a981-11ed-bfe3-dac502259ad0.png

注意圖中無波形。

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

總結(jié)

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






審核編輯:劉清

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

    關(guān)注

    8

    文章

    324

    瀏覽量

    47230
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    489

    瀏覽量

    27393
  • fsm
    fsm
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    12789
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8192

原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(十九)-Problem 126-133(狀態(tài)機(jī)二)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法

    說起 Spring 狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥?沒錯(cuò),Spring 狀態(tài)機(jī)就是
    的頭像 發(fā)表于 12-26 09:39 ?1707次閱讀
    Spring<b class='flag-5'>狀態(tài)機(jī)</b>的實(shí)現(xiàn)原理和使用方法

    Verilog狀態(tài)機(jī)+設(shè)計(jì)實(shí)例

    在verilog中狀態(tài)機(jī)的一種很常用的邏輯結(jié)構(gòu),學(xué)習(xí)和理解狀態(tài)機(jī)的運(yùn)行規(guī)律能夠幫助我們更好地書寫代碼,同時(shí)作為一種思想方法,在別的代碼設(shè)計(jì)中也會(huì)有所幫助。 一、簡(jiǎn)介 在使用過程中我們常說
    的頭像 發(fā)表于 02-12 19:07 ?3171次閱讀
    Verilog<b class='flag-5'>狀態(tài)機(jī)</b>+設(shè)計(jì)實(shí)例

    玩轉(zhuǎn)Spring狀態(tài)機(jī)

    說起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥?沒錯(cuò),Spring狀態(tài)機(jī)就是
    的頭像 發(fā)表于 06-25 14:21 ?747次閱讀
    玩轉(zhuǎn)Spring<b class='flag-5'>狀態(tài)機(jī)</b>

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

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

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

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

    狀態(tài)機(jī)舉例

    狀態(tài)機(jī)舉例 你可以指定狀態(tài)寄存器和狀態(tài)機(jī)狀態(tài)。以下是一個(gè)有四種狀態(tài)的普通狀態(tài)機(jī)。 // Th
    發(fā)表于 03-28 15:18 ?943次閱讀

    狀態(tài)機(jī)代碼生成工具

    狀態(tài)機(jī)代碼生成工具狀態(tài)機(jī)代碼生成工具狀態(tài)機(jī)代碼生成工具狀態(tài)機(jī)代碼生成工具
    發(fā)表于 11-19 15:12 ?9次下載

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

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

    狀態(tài)機(jī)概述 如何理解狀態(tài)機(jī)

    本篇文章包括狀態(tài)機(jī)的基本概述以及通過簡(jiǎn)單的實(shí)例理解狀態(tài)機(jī)
    的頭像 發(fā)表于 01-02 18:03 ?1w次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>概述  如何理解<b class='flag-5'>狀態(tài)機(jī)</b>

    淺談狀態(tài)機(jī)的要素、分類

    說到單片機(jī)編程,不得不說到狀態(tài)機(jī)狀態(tài)機(jī)做為軟件編程的主要架構(gòu)已經(jīng)在各種語言中應(yīng)用,當(dāng)然包括C語言,在一個(gè)思路清晰而且高效的程序中,必然有狀態(tài)機(jī)
    的頭像 發(fā)表于 10-20 17:27 ?4874次閱讀

    FPGA:狀態(tài)機(jī)簡(jiǎn)述

    本文目錄 前言 狀態(tài)機(jī)簡(jiǎn)介 狀態(tài)機(jī)分類 Mealy 型狀態(tài)機(jī) Moore 型狀態(tài)機(jī) 狀態(tài)機(jī)描述 一段式
    的頭像 發(fā)表于 11-05 17:58 ?7097次閱讀
    FPGA:<b class='flag-5'>狀態(tài)機(jī)</b>簡(jiǎn)述

    什么是狀態(tài)機(jī)狀態(tài)機(jī)5要素

    玩單片機(jī)還可以,各個(gè)外設(shè)也都會(huì)驅(qū)動(dòng),但是如果讓你完整的寫一套代碼時(shí),卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學(xué)會(huì)一種好的編程框架或者一種編程思想!比如模塊化編程、狀態(tài)機(jī)編程、分層思想
    的頭像 發(fā)表于 07-27 11:23 ?2w次閱讀
    什么是<b class='flag-5'>狀態(tài)機(jī)</b>?<b class='flag-5'>狀態(tài)機(jī)</b>5要素

    狀態(tài)模式(狀態(tài)機(jī))

    以前寫狀態(tài)機(jī),比較常用的方式是用 if-else 或 switch-case,高級(jí)的一點(diǎn)是函數(shù)指針列表。最近,看了一文章《c語言設(shè)計(jì)模式–狀態(tài)模式(狀態(tài)機(jī))》(來源:embed linux
    發(fā)表于 12-16 16:53 ?8次下載
    <b class='flag-5'>狀態(tài)</b>模式(<b class='flag-5'>狀態(tài)機(jī)</b>)

    labview狀態(tài)機(jī)分享

    labview狀態(tài)機(jī)
    發(fā)表于 10-31 15:50 ?11次下載

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

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