畫狀態機,接收1,2,5分錢的賣報機,每份報紙5分錢
斜槓的左邊是當前的輸入,斜槓的右側是輸出信號。下圖是網上找出的,有部分錯誤,在st1缺少狀態。
代碼:
module maib( input clk, input rst_n, input [2:0]din, //ABC [0]:1分錢 [1]:2分錢 [2]:5分錢 output reg [1:0]dout // [0]:輸出報紙一份 [1]:找錢1分 ); parameter idle=7'b000_0001; //空閒狀態 parameter st1 =7'b000_0010; //一共一分錢 parameter st2 =7'b000_0100; //一共兩分錢 parameter st3 =7'b000_1000; //一共三分錢 parameter st4 =7'b001_0000; //一共四分錢 parameter st5 =7'b010_0000; //一共五分錢 parameter st6 =7'b100_0000; // 六分錢了 reg [6:0]cur_state; //當前狀態與下一狀態 reg [6:0]nxt_state; //當前狀態與下一狀態 //在每個時鐘的上升沿切換狀態 always@(posedge clk or negedge rst_n) if(~rst_n) cur_state<=idle; else cur_state<=nxt_state; //切換到下一個應該到達的狀態 //組合邏輯切換狀態 always@(din) begin case(cur_state) idle: begin if(din==3'b001) nxt_state<=st1; //有一分錢的狀態 else if(din==3'b010) nxt_state<=st2; //有兩分錢的狀態 else if(din==3'b100) nxt_state<=st5; //有五分錢的狀態 else nxt_state<=idle; end st1: //有一分錢了 begin if(din==3'b001) nxt_state<=st2; //有兩分錢的狀態 else if(din==3'b010) nxt_state<=st3; //有三分錢的狀態 else if(din==3'b000) nxt_state<=st1; //在有一分錢的狀態保持 end st2: //有兩分錢了 begin if(din==3'b001) nxt_state<=st3; //有三分錢的狀態 else if(din==3'b010) nxt_state<=st4; //有四分錢的狀態 else if(din==3'b000) nxt_state<=st2; //在有兩分錢的狀態保持 end st3: //有三分錢了 begin if(din==3'b001) nxt_state<=st4; //有四分錢的狀態 else if(din==3'b010) nxt_state<=st5; //有五分錢的狀態 else if(din==3'b000) nxt_state<=st3; //在有三分錢的狀態保持 end st4: //有四分錢了 begin if(din==3'b001) nxt_state<=st5; //有五分錢的狀態 else if(din==3'b010) nxt_state<=st6; //有六分錢的狀態 else if(din==3'b000) nxt_state<=st4; //在有兩分錢的狀態保持 end st5: begin nxt_state<=idle; end st6: begin nxt_state<=idle; end default:; endcase end always@(posedge clk ) if(nxt_state==st5) dout<=2'b01; //不找錢 else if(nxt_state==st6) dout<=2'b11; //找錢1分 endmodule