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