畫狀態機,接收1,2,5分錢的賣報機,每份報紙5分錢

畫狀態機,接收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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章