HDLBits答案(16)_Verilog有限状态机(3)
Verilog有限狀態機(3)
HDLBits鏈接
前言
今天繼續更新狀態機小節的習題,本章主要編寫Lemmings Game部分。
題庫
題目描述10:
Game Lemmings1:有個小人左右走,它只有兩種狀態:向左走和向右走;左邊碰到東西之后它就向右走,右邊碰到東西之后它就向左走,兩邊都碰到東西就跟當前方向的反方向走;復位時小人向左走
Solution10:
module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk left.input bump_left,input bump_right,output walk_left,output walk_right); // parameter LEFT=1'b0, RIGHT=1'b1;reg state, next_state;wire [1:0] bump;assign bump = {bump_left,bump_right};always @(*) begincase(state)LEFT:beginif((bump == 2'b10) || (bump == 2'b11))beginnext_state <= RIGHT;endelse beginnext_state <= LEFT;endendRIGHT:beginif((bump == 2'b01) || (bump == 2'b11))beginnext_state <= LEFT;endelse beginnext_state <= RIGHT;endendendcaseendalways @(posedge clk, posedge areset) beginif(areset)beginstate <= LEFT;endelse beginstate <= next_state;endend// Output logicassign walk_left = (state == LEFT);assign walk_right = (state == RIGHT);endmodule題目描述11:
Game Lemmings2:有個小人左右走,它只有兩種狀態:向左走和向右走;左邊碰到東西之后它就向右走,右邊碰到東西之后它就向左走,兩邊都碰到東西就跟當前方向的反方向走;復位時小人向左走;
添加ground信號,ground=1時規則與上述規則相同;ground=0時,記錄當前走的方向,并將aaah信號置1,直到ground=1時,走與掉落之前相同的方向。
Solution11:
module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk left.input bump_left,input bump_right,input ground,output walk_left,output walk_right,output aaah ); parameter LEFT = 2'b0;parameter RIGHT = 2'b1;parameter AH_LEFT = 2'b10;parameter AH_RIGHT = 2'b11;reg [1:0] state,next_state;wire [1:0] bump;assign bump = {bump_left,bump_right};always @(*)begincase(state)LEFT:beginif(ground == 1'b0)beginnext_state <= AH_LEFT;endelse if((bump == 2'b10) || (bump == 2'b11))beginnext_state <= RIGHT;endelse beginnext_state <= LEFT;endendRIGHT:beginif(ground == 1'b0)beginnext_state <= AH_RIGHT;endelse if((bump == 2'b01) || (bump == 2'b11))beginnext_state <= LEFT;endelse beginnext_state <= RIGHT;endendAH_LEFT:beginif(ground == 1'b0)beginnext_state <= AH_LEFT;endelse beginnext_state <= LEFT;endendAH_RIGHT:beginif(ground == 1'b0)beginnext_state <= AH_RIGHT;endelse beginnext_state <= RIGHT;endendendcaseendalways@(posedge clk,posedge areset)beginif(areset)beginstate <= LEFT;endelse beginstate <= next_state;endendassign walk_left = (state == LEFT);assign walk_right = (state == RIGHT);assign aaah = ((state == AH_LEFT) | (state == AH_RIGHT));endmodule題目描述12:
Game Lemmings3:有個小人左右走,它只有兩種狀態:向左走和向右走;左邊碰到東西之后它就向右走,右邊碰到東西之后它就向左走,兩邊都碰到東西就跟當前方向的反方向走;復位時小人向左走;
添加ground信號,ground=1時規則與上述規則相同;ground=0時,記錄當前走的方向,并將aaah信號置1,直到ground=1時,走與掉落之前相同的方向。
添加dig信號,ground=1時一直挖,ground=0時,進入aaah狀態,直到ground再次為1,方向與dig開始的方向相同。
優先級:fall>dig>switch direction
手繪狀態轉移圖:
Solution12:
module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk left.input bump_left,input bump_right,input ground,input dig,output walk_left,output walk_right,output aaah,output digging ); parameter LEFT = 3'b0;parameter RIGHT = 3'b1;parameter DIG_LEFT = 3'b10;parameter DIG_RIGHT = 3'b11;parameter FALL_LEFT = 3'b100;parameter FALL_RIGHT = 3'b101;reg [2:0] state,next_state;wire [1:0] bump;assign bump = {bump_left,bump_right};always @(*)begincase(state)LEFT:beginif(ground == 1'b0)beginnext_state <= FALL_LEFT;endelse if(dig == 1'b1)beginnext_state <= DIG_LEFT;endelse if((bump == 2'b10) || (bump == 2'b11))beginnext_state <= RIGHT;endelse beginnext_state <= LEFT;endendRIGHT:beginif(ground == 1'b0)beginnext_state <= FALL_RIGHT;endelse if(dig == 1'b1)beginnext_state <= DIG_RIGHT;endelse if((bump == 2'b01) || (bump == 2'b11))beginnext_state <= LEFT;endelse beginnext_state <= RIGHT;endendDIG_LEFT:beginif(ground == 1'b0)beginnext_state <= FALL_LEFT;endelse beginnext_state <= DIG_LEFT;endendDIG_RIGHT:beginif(ground == 1'b0)beginnext_state <= FALL_RIGHT;endelse beginnext_state <= DIG_RIGHT;endendFALL_LEFT:beginif(ground == 1'b0)beginnext_state <= FALL_LEFT;endelse beginnext_state <= LEFT;endendFALL_RIGHT:beginif(ground == 1'b0)beginnext_state <= FALL_RIGHT;endelse beginnext_state <= RIGHT;endendendcaseendalways @(posedge clk,posedge areset)beginif(areset)beginstate <= LEFT;endelse beginstate <= next_state;endendassign walk_left = (state == LEFT);assign walk_right = (state == RIGHT);assign digging = ((state == DIG_LEFT) | (state == DIG_RIGHT));assign aaah = ((state == FALL_LEFT) | (state == FALL_RIGHT));endmodule題目描述13:
Game Lemmings4:小人行動規則與上述規則相同,添加小人會die的規則:
如果小人fall超過20cycles,則當其接觸地面時直接die(未接觸地面時不會die) dig,fall,left和right輸出全部置零,直到reset信號來臨。
手繪狀態轉移圖:(Dead狀態少個自己到自己的狀態)
Solution13:
module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk left.input bump_left,input bump_right,input ground,input dig,output walk_left,output walk_right,output aaah,output digging ); parameter LEFT = 3'b0;parameter RIGHT = 3'b1;parameter DIG_LEFT = 3'b10;parameter DIG_RIGHT = 3'b11;parameter FALL_LEFT = 3'b100;parameter FALL_RIGHT = 3'b101;parameter DEAD = 3'b110;parameter SPLATTER = 3'b111;reg [2:0] state,next_state;reg [4:0] Cycle_Count;wire [1:0] bump;assign bump = {bump_left,bump_right};always @(*)begincase(state)LEFT:beginif(ground == 1'b0)beginnext_state <= FALL_LEFT;endelse if(dig == 1'b1)beginnext_state <= DIG_LEFT;endelse if((bump == 2'b10) || (bump == 2'b11))beginnext_state <= RIGHT;endelse beginnext_state <= LEFT;endendRIGHT:beginif(ground == 1'b0)beginnext_state <= FALL_RIGHT;endelse if(dig == 1'b1)beginnext_state <= DIG_RIGHT;endelse if((bump == 2'b01) || (bump == 2'b11))beginnext_state <= LEFT;endelse beginnext_state <= RIGHT;endendDIG_LEFT:beginif(ground == 1'b0)beginnext_state <= FALL_LEFT;endelse beginnext_state <= DIG_LEFT;endendDIG_RIGHT:beginif(ground == 1'b0)beginnext_state <= FALL_RIGHT;endelse beginnext_state <= DIG_RIGHT;endendFALL_LEFT:beginif((ground == 1'b0) && (Cycle_Count < 5'd20))beginnext_state <= FALL_LEFT;endelse if((ground == 1'b0) && (Cycle_Count >= 5'd20))beginnext_state <= SPLATTER;endelse beginnext_state <= LEFT;endendFALL_RIGHT:beginif((ground == 1'b0) && (Cycle_Count < 5'd20))beginnext_state <= FALL_RIGHT;endelse if((ground == 1'b0) && (Cycle_Count >= 5'd20))beginnext_state <= SPLATTER;endelse beginnext_state <= RIGHT;endendSPLATTER:beginif(ground == 1'b1)beginnext_state <= DEAD;endelse beginnext_state <= SPLATTER;endendDEAD:beginnext_state <= DEAD;endendcaseendalways @(posedge clk,posedge areset)beginif(areset)beginstate <= LEFT;endelse beginstate <= next_state;endendalways @(posedge clk,posedge areset)beginif(areset)beginCycle_Count <= 5'd0;endelse if((next_state == FALL_LEFT) || (next_state == FALL_RIGHT)) beginCycle_Count <= Cycle_Count + 1'b1;endelse beginCycle_Count <= 5'd0;endendassign walk_left = (state == LEFT);assign walk_right = (state == RIGHT);assign aaah = ((state == FALL_LEFT) || (state == FALL_RIGHT) || (state == SPLATTER));assign digging = ((state == DIG_LEFT) || (state == DIG_RIGHT));endmodule結語
今天更新的幾道旅鼠題非常有意思,大家可以先自己嘗試。代碼若有問題的話可以與我交流。
總結
以上是生活随笔為你收集整理的HDLBits答案(16)_Verilog有限状态机(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 图像无损、有损压缩方法调研
 - 下一篇: HDLBits答案(17)_Verilo