FPGA自動售賣機(verilog狀態機設計)
阿新 • • 發佈:2018-12-17
最近看了下IC筆試題,其中有一道題,自己花了點時間解決,為了記憶猶新,於是記錄了下來。 題目:設計一個自動飲料售賣機,飲料10分錢,硬幣5分10分兩種,並考慮找零。 1.畫出fsm。 2.用verilog程式設計。 3.設計工程中可使用的工具及設計大致過程。
1.畫出fsm 第一步:定義它的輸入輸出。 輸入:a,b;其中a=1,投入5分;b=1,投入10分; 輸出:y,z;其中y=1,出飲料;z=1,找零。 第二步:定義狀態 狀態:兩個狀態 S0和S1;其中S0為沒有投錢;S1為投了5分。 為此畫出了狀態圖
2.用verilog程式設計。 直接上程式碼,在狀態機的選擇上,雖然這個邏輯比較簡單,我還是選擇了二段式狀態機。其優點,第一,組合邏輯和時序分開了。其二,比三段式節約資源。
module hunter( clk, rst_n, a, b, y, z ); input clk,rst_n; input a,b; output reg y,z; reg CS,NS; parameter S0=1'b0; S1=1'b1; //同步時序描述狀態轉移 [email protected](posedge clk or negedge rst_n) if(!rst_n) CS<=S0; else CS<=NS; //使用組合邏輯判斷轉移狀態條件 [email protected](CS or a or b) begin {y,z}=2'b00; NS=1'bz;//狀態機初始化,不定態的好處,綜合器對不定態x的處理是don't care,模擬時可以考察設計FSM完備狀態。 case(CS) S0:begin if(a&~b)//投入5分的時候 begin {y,z}=2'b00; NS=S1; end else if(~a&b)//投入10分的時候 begin {y,z}=2'b10; NS=S0; end end S1:begin if(a&~b)//再次投入5分 begin {y,z}=2'b10; NS=S0; end else if(~a&b) begin {y,z}=2'b11; NS=S1; end end default: NS=S0; endcase end endmodule
最後綜合後的圖: 3.設計工程中可使用的工具及設計大致過程。 ①功能定義與器件選型 ②設計輸入: ultra ③功能模擬:modesim ④邏輯綜合:quartus ii 或者 ise的邏輯綜合器 ⑤實現佈局佈線:pin planner ⑥時序模擬:modesim ⑦靜態時序模擬: quartus 的signal Tap或者ise的chipscope ⑧上板除錯。