实例六 自动售饮料机
實例六 自動售飲料機
3.2.1. 本章導讀
了解自動售貨機的工作流程以及各個工作狀態,以及其testbench,最后在Robei可視化仿真軟件經行功能實現和仿真驗證。
設計原理
自動售貨機的信號定義:clk:時鐘輸入;reset:系統復位信號;half_dollar:代表投入5角硬幣;one_dollar:代表投入1元硬幣;half_out:表示找零信號;dispense:表示機器售出一瓶飲料。
當reset=0時,售貨機處于工作狀態,此時連續往售貨機中投硬幣(可以是5角也可以是一元),投入最后一枚硬幣時,如果之前投入的硬幣總和為2.5元,則可以取走一瓶飲料,如果少于2.5元則繼續投幣,如果為3元則顯示可以取出一瓶飲料,而且找零顯示信號為高電平。
3.2.2. 設計流程
1. sell模塊的設計
(1)新建一個模型命名為sell,類型為module,同時具備4個輸入和2個輸出,每個引腳的屬性和名稱參照下圖3-2-1經行對應的修改。
(2)添加代碼。點擊模型下方的 Code添加代碼。
代碼:
parameter idle=0,half=1,one=2,one_half=3,two=4;
reg[2:0] D;
always @(posedge clk)
begin
if(rst)
begin
dispense=0;
half_out=0;
D=idle;
end
case(D)
idle:
if(half_dollar)
D=half;
else if(one_dollar)
D=one;
half:
if(half_dollar)
D=one;
else if(one_dollar)
D=one_half;
one:
if(half_dollar)
D=one_half;
else if(one_dollar)
D=two;
one_half:
if(half_dollar)
D=two;
else if(one_dollar)
begin
dispense=1;
D=idle;
end
two:
if(half_dollar)
begin
dispense=1;
D=idle;
end
else if(one_dollar)
begin
dispense=1;
half_out=1;
D=idle;
end
endcase
end
(3)保存模型到一個文件夾(文件夾路徑不能有空格和中文)中,運行并檢查有無錯誤。
2. sell_test測試文件設計
(1)新建一個具有4個輸入2個輸出的sell_test測試文件,記得將Module Type設置為 “testbench”,各個引腳配置如圖3-2-3所示。
(2)另存為測試文件。將測試文件保存到上面創建的模型所在的文件夾下。
(3)加入模型。在Toolbox工具箱的Current欄里會出現模型,單擊該模型并在sell_test上添加,并連接引腳,如下圖3-2-4所示:
(4)輸入激勵。點擊測試模塊下方的“Code”,輸入激勵算法。激勵代碼在結束的時候要用$finish 結束。
測試代碼:
initial begin
one_dollar=0;
half_dollar=0;
rst=1;
clk=0;
#100 rst=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
#20 rst=1;
#100 rst=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 half_dollar=1;
repeat(1)@(posedge clk);
#2 half_dollar=0;
#20 rst=1;
#5 $finish;
end
always #10 clk=~clk;
(5)執行仿真并查看波形。查看輸出信息。
檢查沒有錯誤之后查看波形。點擊右側 Workspace 中的信號,進行添加并查看分析仿真結果。如圖3-2-5所示:
3. sell_constrain約束文件設計
(1)新建一個模塊,命名為sell_constrain,模塊類型選擇為constrain,具有4個輸入和2個輸出,如圖3-2-6所示。
(2)將約束模塊和設計的sell模塊保存到同一個目錄下,用鼠標左鍵單擊把sell模塊從左側的ToolBox添加到約束模塊中;
(3)修改約束模塊的端口名稱。如圖3-2-7所示。本設計中使用到的開發板硬件引腳如下:
clk對應開發板的撥碼開關T16;
reset對應開發板的撥碼開關W13;
one_dollar對應開發板的撥碼開關G15;
half_dollar對應開發板的撥碼開關P15;
dispense對應開發板LED燈M14;
half_out對應開發板LED燈M15;
(4)保存并執行,如果軟件顯示“Generate constrain file complete”,說明約束文件已經成功生成。
3.2.3. 板級驗證
為了測試所設計sell的工作特性,我們選擇合適的開發板進行板級間驗證,該開發板需要搭載XILINX公司的Z-7010芯片,所以選用VIVADO設計平臺進行Synthesis、Implementation和Generate Bitstream,最終將生成的數據流文件下載到開發板內,并進行驗證。
1. VIVADO設計平臺進行后端設計
1.1啟動Vivado軟件并選擇設備XC7Z010CLG400-1作為硬件對象,設計語言選用Verilog,建立新的工程,添加通過Robei設計的文件sell.v。
(1)打開Vivado,選擇開始>所有程序>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)單擊創建新項目Create New Project啟動向導。你將看到創建一個新的Vivado項目對話框,單擊Next;
(3)在彈出的對話框中輸入工程名sell及工程保存的位置,并確保Create project subdirectory復選框被選中,單擊Next;
(4)選擇項目類型表單的RTL Project選項,不勾選Do not specify sources at this time復選框,然后單擊Next;
(5)使用下拉按鈕,選中Verilog作為目標文件和仿真語言;
(6)點擊添加Add Files按鈕,瀏覽到剛剛我們Robei項目的目錄下打開Verilog文件夾,選擇sell.v,單擊Open,然后單擊Next去添加現有的IP模型;
(7)由于我們沒有任何的IP添加,跳過這一步,單擊Next去添加約束形成;
(8)點擊添加Add Files按鈕,瀏覽到設計的sell模塊目錄下的constrain文件夾,選中其中的sell_constrain.xdc文件,然后單擊Next;
(9)在默認窗口中,按照圖5-1-13所示設置Filter中的選項,然后在Parts中選擇XC7Z010CLG400-1,單擊Next;
(10)單擊Finish,本Vivado項目創建成功。
1.2打開sell_constrain.xdc文件,查看引腳約束源代碼。
(1)在資源窗口sources中,展開約束文件夾,如圖3-2-14,然后雙擊打開sell_constrain.xdc進入文本編輯模式;
(2)Xilinx設計約束文件分配FPGA位于主板上的開關和指示燈的物理IO地址,這些信息可以通過主板的原理圖或電路板的用戶手冊來獲得。
本次設計的約束文件代碼是通過Robei軟件自動生成,但是,Robei軟件目前生成的約束代碼只有對輸入輸出端口的分配,在這個設計中,我們使用了一個通過開關控制的模擬時鐘clk,而非系統時鐘,這種電路在綜合的時候一般都會報錯,所以,在約束文件最后,我們需要手動添加一句命令:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
來保證流程中不會出錯。
完整的約束代碼如下:
#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN T16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN W13 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
set_property PACKAGE_PIN G15 [get_ports one_dollar]
set_property IOSTANDARD LVCMOS33 [get_ports one_dollar]
set_property PACKAGE_PIN P15 [get_ports half_dollar]
set_property IOSTANDARD LVCMOS33 [get_ports half_dollar]
set_property PACKAGE_PIN M15 [get_ports half_out]
set_property IOSTANDARD LVCMOS33 [get_ports half_out]
set_property PACKAGE_PIN M14 [get_ports dispense]
set_property IOSTANDARD LVCMOS33 [get_ports dispense]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
(3)點擊File->Save File保存文件。
1.3使用Vivado綜合工具來綜合設計,并進行Implementation任務實現。
(1)單擊綜合任務下拉菜單中的Run Synthesis,綜合過程將分析sell.v文件并生成網表文件。當綜合過程完成了,且沒有錯誤信息,將會彈出帶有三個選項的完成對話框;
(2)如果有錯誤,根據錯誤信息提示修改,直至綜合沒有錯誤。然后選擇Run Implementation選項,執行任務實現,然后單擊OK;
(3)任務實現過程將在綜合后的設計上運行。當這個過程完成,且沒有錯誤信息,將會彈出帶有三個選項的任務實現完成對話框;
(4)如果有錯誤,根據錯誤信息提示修改,直至綜合沒有錯誤。
1.4將開發板上的電源開關撥到ON,生成比特流并打開硬件會話,對FPGA進行編程。
(1)確保微型USB電纜連接到PROG UART接口;
(2)確保JP7設置為USB提供電源;
(3)接通電源板上的開關;
(4)點擊任務實現完成彈出的對話框中Generate Bitstream或者點擊導航窗口中編程和調試任務中的Generate Bitstream。比特流生成過程將在任務實現設計后運行。當完成比特流生成后會彈出有三個選項的完成對話框;
(5)這一過程將已經生成的sell.bit文件放在sell.runs目錄下的impl_1目錄下;
(6)選擇打開硬件管理器Open Hardware Manager選項,然后單擊確定。硬件管理器窗口將打開并顯示“未連接”狀態;
(7)點擊Open a new hardware target。如果之前已經配置過開發板你也可以點擊最近打開目標鏈接Open recent target;
(8)單擊Next看Vivado自定義搜索引擎服務器名稱的形式;
(9)單擊Next以選擇本地主機端口;
(10)單擊兩次Next,然后單擊Finish。未連接硬件會話狀態更改為服務器名稱并且器件被高亮顯示,如圖3-2-19所示。還要注意,該狀態表明它還沒有被編程;
(11)選擇器件,并驗證sell.bit被選為常規選項卡中的程序文件;
(12) 在器件上單擊鼠標右鍵,選擇Program device或單擊窗口上方彈出的Program device-> XC7z010_1鏈接到目標FPGA器件進行編程;
(13)單擊確定對FPGA進行編程。開發板上Done指示燈亮時,器件編程結束;
(14)通過控制撥動和按鍵開關的開閉來觀察LED(請參考前面的邏輯圖)驗證輸出結果。
2. 開發板驗證
首先,按住reset (SW2)撥至高電平,再來回撥動clk (SW3)1到2次,進行復位操作;其次,設置不同的輸入,這里分別進行了one_dollar (SW0),half_dollar (SW1)的驗證。最后,按clk時鐘鍵,經驗證該自動販賣機功能無誤。
3.2.4. 問題與思考
思考做一個能賣多種價格的飲料的售貨機。
總結
以上是生活随笔為你收集整理的实例六 自动售饮料机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git 遇到的问题总结
- 下一篇: Spark的安装与使用 第1关:Scal