設計背景:
我們從開始學習FPGA。到現在也慢慢的學到了血多的東西,那么我們就應該慢慢的去學習深一點的東西,我就給大家分享一個自動售貨機的簡單歷程,幫助大家理解和學習我們的FPGA,為以后的學習做一個鋪墊。
設計原理:
設計要求:一聽飲料需要2.5美元,規定只能投入一美元,0.5美元的硬幣
設計架構圖:
設計代碼:
設計模塊
0modulesell(clk,rst_n,one_dole,half_dole,des
1 inputclk;
2 inputrst_n;
3 inputone_dole; //輸入1美元
4 inputhalf_dole; //輸入0.5美元
5
6 outputregdescense; //是否買到的標志
7 outputreg[2:0]back_money;//找回的錢
8
9 parameters0 =2'b00,s1 =2'b01,s2 =2'b10
10
11 reg[1:0]state;
12 reg[4:0]money;
13
14 reg[1:0]state_x;
//狀態機兩段式表示
15 always@(posedgeclk ornegedgerst_n)
16 if(!rst_n)
17 begin
18 state_x <=s0;
19 end
20 else
21 begin
22 state_x <=state;
23 end
24
25 always@(posedgeclk ornegedgerst_n)
26 if(!rst_n)
27 begin
28 money <=5'b0;
29 state <=s0;
30 end
31 else
32 begin
33 case(state)
34 s0:begin
35 //判斷投入的錢是多少
36 if(one_dole)
37 begin
38 money <=money
39 state <=s1;
40 end
41 elseif(half_dole)
42 begin
43 money <=money
44 state <=s1;
45 end
46 else
47 begin
48 state <=s0;
49 money <=money
50 end
51 end
52 //判斷和商品的價格是否一樣
53 s1:begin
54 if(money <25)
55 begin
56 state <=s0;
57 end
58 else
59 begin
60 state <=s0;
61 money <=5'b0;
62 end
63 end
64 endcase
65 end
66
67 reg[1:0]state_s;
68 always@(posedgeclk ornegedgerst_n )
69 if(!rst_n)
70 begin
71 descense <=1'b0;
72 back_money <=3'b0;
73 state_s <=s0;
74 end
75 else
76 begin
77 case(state_s)
78 s0:begin
79 if(money <25)
80 begin
81 back_money <=
82 descense <=1'
83 end
84 else
85 //找回的錢和買到的標志
86 begin
87 back_money <=
88 descense <=1'
89 state_s <=s1;
90 end
91 end
92 s1:begin
93 descense <=1'b0;
94 state_s <=s0;
95 end
96 endcase
97 end
98endmodule
測試模塊
0`timescale1ns/1ps //時間精度
1
2modulesell_tb();
3
4 //定義我們的端口
5 regclk;
6 regrst_n;
7 regone_dole;
8 reghalf_dole;
9
10 wiredescense;
11 wire[2:0]back_money;
12
13 initialbegin
14 clk =1'b1;
15 rst_n =1'b0;
16 one_dole =1'b0;
17 half_dole =1'b0;
18 #200.1rst_n =1'b1;
19
20 //模擬蔬輸入的錢數
21
22 #200 one_dole =1'b1;
23 #20 one_dole =1'b0;
24
25 #200 one_dole =1'b1;
26 #20 one_dole =1'b0;
27
28 #200 one_dole =1'b1;
29 #20 one_dole =1'b0;
30
31 #1000.1
32 #200 half_dole =1'b1;
33 #20 half_dole =1'b0;
34
35 #200 one_dole =1'b1;
36 #20 one_dole =1'b0;
37
38 #200 one_dole =1'b1;
39 #20 one_dole =1'b0;
40
41 #1000$stop; //停止仿真
42 end
43
44 always#10clk =~clk;
45
46 sell sell_dut( //例化端口
47 .clk(clk),
48 .rst_n(rst_n),
49 .one_dole(one_dole),
50 .half_dole(half_dole),
51 .descense(descense),
52 .back_money(back_money)
53 );
54endmodule
仿真圖:
我們從仿真中可以看到當我們的錢數投夠的時候,就給一個買到的標志位,如果投的超過商品的價格,那么我們就給一個買的標志位,然后找回我們投的多的錢。
-
FPGA
+關注
關注
1626文章
21671瀏覽量
601894
發布評論請先 登錄
相關推薦
評論