乒乓球游戲機的EDA設(shè)計
《乒乓球游戲機的EDA設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《乒乓球游戲機的EDA設(shè)計(28頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、乒乓球游戲機的設(shè)計 摘要:本課程設(shè)計制作了一個乒乓球游戲機。在課程設(shè)計中,系統(tǒng)開發(fā)平臺為MAX+PLUSII,程序設(shè)計語言為VHDL。設(shè)計的乒乓球游戲機能夠正確判斷與顯示乒乓球的位置,并能自動裁判和記分的裝置。本課程設(shè)計了乒乓球游戲機程序并進行了程序仿真,從而實現(xiàn)一個完整的乒乓球游戲機。程序通過調(diào)試運行,初步實現(xiàn)了設(shè)計目標,可應(yīng)用于實際的乒乓球游戲比賽中。本論文對系統(tǒng)的功能設(shè)計、實現(xiàn)流程及正確使用都做了詳細的描述。 關(guān)鍵詞:乒乓球游戲機;VHDL;MAX+PLUSⅡ;程序仿真; 目錄 1 引言 1 1.1 課題設(shè)計的目的
2、 1 1.2 課題設(shè)計的內(nèi)容 1 2 EDA、VHDA簡介 3 2.1 EDA的發(fā)展概況 3 2.2 硬件描述語言---VHDL ........................................3 3 乒乓球游戲機設(shè)計過程 5 3.1設(shè)計規(guī)劃 5 3.2各個模塊原理及程序 6 3.2.1乒乓球?qū)嶓w的設(shè)計 6 3.2.2 狀態(tài)機編程實現(xiàn) 7 3.2.3 記分譯器的設(shè)計 10 3.2.4 構(gòu)造體的設(shè)計 12 4 系統(tǒng)編譯和波形仿真 14 4.1系統(tǒng)編譯 14 4.2系統(tǒng)有關(guān)波形的仿真 14 結(jié)束語 17 致謝 17 參考文獻 18
3、 《乒乓球游戲機的設(shè)計》 第 25 頁 共 18 頁 1 引 言 隨著科學(xué)技術(shù)的發(fā)展,人類社會已進入到高度發(fā)達的信息化社會, 信息社會的發(fā)展離不開電子產(chǎn)品的進步?,F(xiàn)代電子產(chǎn)品的發(fā)展越來越快, 各種新型電子元器件和智能化的電子產(chǎn)品已經(jīng)在國民經(jīng)濟的各個領(lǐng)域和人民生活的各個方面得到了日益廣泛的應(yīng)用。實現(xiàn)這種進步的主要原因就是生產(chǎn)制造技術(shù)和電子設(shè)計技術(shù)的發(fā)展。其中電子玩具的發(fā)展也是在日益成熟。乒乓球游戲機控制電路是有甲、乙雙方參賽,有裁判控制發(fā)“球”的三人乒乓球游戲機;它能完成自動裁判和自動計分是一個帶數(shù)字顯示的模擬游戲機。其結(jié)構(gòu)簡單、成本低、易操作,安全性強
4、、無污染。乒乓球游戲機還能在娛樂的同時提高我們的反應(yīng)、應(yīng)變能力。具有良好的市場發(fā)展前景[1]。 1.1課題設(shè)計的目的 本文應(yīng)用狀態(tài)機,設(shè)計了一個乒乓球游戲機的狀態(tài)機。狀態(tài)機的實現(xiàn)是符合人的思維邏輯的,且簡單明了[2]。計算機組成原理課程設(shè)計是重要的綜合性實踐教學(xué)環(huán)節(jié)。 (1)通過該課程設(shè)計,結(jié)合計算機科學(xué)的理論、抽象和設(shè)計三種形態(tài),進一步掌握計算機中各功能部件的工作原理和邏輯實現(xiàn),熟悉乒乓球游戲機的基本工作原理。 (2)通過該課程設(shè)計的學(xué)習(xí),總結(jié)計算機組成原理課程的學(xué)習(xí)內(nèi)容,運用所學(xué)的數(shù)字電路以及計算機組成和狀態(tài)機的基本原理、基本知識和基本技巧,解決某一個具體的實際問題,培養(yǎng)綜合分析和
5、解決問題的能力。 (3)為今后分析、設(shè)計、開發(fā)以及使用計算機打下堅實的基礎(chǔ)。 1.2 課題設(shè)計的內(nèi)容 本文設(shè)計的是一個乒乓球游戲機的狀態(tài)機。利用VHDL,不需要按照傳統(tǒng)的設(shè)計方法進行煩瑣的狀態(tài)分配、繪制狀態(tài)、化簡狀態(tài)方程等,就可以簡單地根據(jù)MDS圖直接對狀態(tài)機進行描述。該設(shè)計可以實現(xiàn)的功能如下: (1) 該設(shè)計一個由甲、乙雙方參賽,有裁判的3人乒乓球游戲機。 (2) 用8個(或更多個)LED排成一條直線,以中點為界,兩人乒乓游戲機是用8個發(fā)光二極管代表乒乓球臺,中間兩個發(fā)光二極管兼做乒乓球網(wǎng),用點亮的發(fā)光二極管按一定方向移動來表示球的運動,在游戲機的兩側(cè)個設(shè)置發(fā)球和擊球開關(guān),甲乙雙
6、方按乒乓球比賽規(guī)則來操作開關(guān)。 (3) 當“球”(點亮的那只LED)運動到某方的最后一位時,參賽者應(yīng)能果斷地按下位于自己一方的按鈕開關(guān),即表示啟動球拍擊球。當甲方按動乒乓球開關(guān)時,靠近甲方的第一個發(fā)光二極管亮,然后發(fā)光二極管由甲方方向依次點亮,代表乒乓球的移動。當球過網(wǎng)后按照設(shè)計者規(guī)定的球位乙方就可以擊球。若乙方提前擊球或者未擊到球,則甲方得分。然后重新發(fā)球進行比賽。 (4)設(shè)置自動記分電路,甲、乙雙方各用7段譯碼管進行記分顯示,每計滿21分為1局,然后記分清零,重新開始新一局比賽。 1 該設(shè)計一個由甲、乙雙方參賽,有裁判的3人乒乓球游戲機。 2 用8個LED排成一條直線,以中點為
7、界,兩邊各代表參賽雙方的位置,其中一只點亮的LED指示球的當前位置,點亮的LED依次從左至右,其移動速度應(yīng)能調(diào)節(jié),在其他時候擊球視為犯規(guī),給對方加1分;都犯規(guī),各自加1分。 3 當“球”(點亮的那只LED)運動到某方的最后一位時,參賽者應(yīng)能果斷地按下位于自己一方的按鈕開關(guān),即表示啟動球拍擊球。若擊中,則球向相反方向移動,若未擊中,則對方得1分。 4 一方得1分時,電路自動響鈴3秒,這期間發(fā)球無效,等鈴聲停止后方能繼續(xù)比賽。 5 設(shè)置自動記分電路,甲、乙雙方各用2位數(shù)碼管進行記分顯示,每計滿21分為1局, 6 甲乙雙方各設(shè)一個發(fā)光二極管,表示擁有發(fā)球權(quán),每隔5次自動交換發(fā)球權(quán),擁
8、有發(fā)球權(quán)的一方發(fā)球才有效。 7 裁判有一個按鈕,是系統(tǒng)初始化。 2 EDA、VHDL簡介 2.1 EDA發(fā)展概況 電子設(shè)計技術(shù)的核心就是EDA技術(shù),EDA是指以計算機為工作臺,融合應(yīng)用電子技術(shù)、計算機技術(shù)、智能化技術(shù)最新成果而研制成的電子CAD通用軟件包,主要能輔助進行三方面的設(shè)計工作,即IC設(shè)計、電子電路設(shè)計和PCB設(shè)計。EDA技術(shù)已有30年的發(fā)展歷程,大致可分為三個階段。70年代為計算機輔助設(shè)計(CAD)階段,人們開始用進行IC版圖編輯、PCB布局布線,取代了手工操作。80年代為計算機輔助工程(CAE)階段。與CAD相比,CAE除了有純粹的圖形繪制功能外,又增加了
9、電路功能設(shè)計和結(jié)構(gòu)設(shè)計,并且通過電氣連接網(wǎng)絡(luò)表將兩者結(jié)合在一起,實現(xiàn)了工程設(shè)計。CAE的主要功能是:原理圖輸入,邏輯仿真,電路分析,自動布局布線,PCB后分析。90年代為電子系統(tǒng)設(shè)計自動化(EDA)階段[2]。 硬件描述語言HDL是相對于一般的計算機軟件語言,如:C、PASCAL而言的。HDL語言使用與設(shè)計硬件電子系統(tǒng)的計算機語言,它能描述電子系統(tǒng)的邏輯功能、電路結(jié)構(gòu)和連接方式。設(shè)計者可利用HDL程序來描述所希望的電路系統(tǒng),規(guī)定器件結(jié)構(gòu)特征和電路的行為方式;然后利用綜合器和適配器將此程序編程能控制FPGA和CPLD內(nèi)部結(jié)構(gòu),并實現(xiàn)相應(yīng)邏輯功能的的門級或更底層的結(jié)構(gòu)網(wǎng)表文件或下載文件。目前,就
10、FPGA/CPLD開發(fā)來說,比較常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL[3]。 2.2 硬件描述語言——VHDL VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,誕生于1982年。1987年底,VHDL被IEEE和美國國防部確認為標準硬件描述語言 。自IEEE公布了VHDL的標準版本,IEEE-1076(簡稱87版)之后,各EDA公司相繼推出了自己的VHDL設(shè)計環(huán)境,或宣布自己的設(shè)計工具可以和VHDL接口。此后VHDL在電子設(shè)計領(lǐng)域得到了廣泛的接受,并逐步取代了原有的
11、非標準的硬件描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標準的1076-1993版本,(簡稱93版)?,F(xiàn)在,VHDL和Verilog作為IEEE的工業(yè)標準硬件描述語言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實上的通用硬件描述語言。專家認為,在新的世紀中,VHDL于Verilog語言將承擔(dān)起大部分的數(shù)字系統(tǒng)設(shè)計任務(wù)。 VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風(fēng)格與句法是十分類似于一般的計算機高級語言。VHD
12、L的程序結(jié)構(gòu)特點是將一項工程設(shè)計,或稱設(shè)計實體(可以是一個元件,一個電路模塊或一個系統(tǒng))分成外部(或稱可是部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實體的內(nèi)部功能和算法完成部分[4]。在對一個設(shè)計實體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計就可以直接調(diào)用這個實體。這種將設(shè)計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計的基本點。應(yīng)用VHDL進行工程設(shè)計的優(yōu)點是多方面的[4]。 (1)與其他的硬件描述語言相比,VHDL具有更強的行為描述能力,從而決定了他成為系統(tǒng)設(shè)計領(lǐng)域最佳的硬件描述語言。強大的行為描述能力是避開具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計大規(guī)模電子系統(tǒng)的重要保證。
13、 (2)VHDL豐富的仿真語句和庫函數(shù),使得在任何大系統(tǒng)的設(shè)計早期就能查驗設(shè)計系統(tǒng)的功能可行性,隨時可對設(shè)計進行仿真模擬。 (3)VHDL語句的行為描述能力和程序結(jié)構(gòu)決定了他具有支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用功能。符合市場需求的大規(guī)模系統(tǒng)高效,高速的完成必須有多人甚至多個代發(fā)組共同并行工作才能實現(xiàn)。 (4)對于用VHDL完成的一個確定的設(shè)計,可以利用EDA工具進行邏輯綜合和優(yōu)化,并自動的把VHDL描述設(shè)計轉(zhuǎn)變成門級網(wǎng)表。 (5)VHDL對設(shè)計的描述具有相對獨立性,設(shè)計者可以不懂硬件的結(jié)構(gòu),也不必管理最終設(shè)計實現(xiàn)的目標器件是什么,而進行獨立的設(shè)計[4]。
14、 3 乒乓球游戲機設(shè)計過程 3.1設(shè)計規(guī)劃 根據(jù)乒乓球比賽的過程和規(guī)則,首先游戲開始,如果一方非正確擊球則另一方加分,當分數(shù)大于21時獲勝,游戲結(jié)束,我們把設(shè)計流程規(guī)定如圖3.1所示。 游戲開始 正確接發(fā)球? 大于21? 甲 乙 否 否 大于2
15、1? 乙方勝利 甲方勝利 甲方加分 乙方加分 N N Y Y 游戲結(jié)束 圖3.1設(shè)計流程圖 狀態(tài)機設(shè)置了7個狀態(tài),分別是“等待發(fā)球狀態(tài)”,“第一盞燈亮狀態(tài)”,“第八盞燈亮狀態(tài)”,“球向乙移動狀態(tài)”,“ 球向甲移動狀態(tài)”,“允許甲擊球狀態(tài)”, “允許乙擊球狀態(tài)”。這是該程序中起決定作用的七個狀態(tài)。開始的時候處于“等待發(fā)球狀態(tài)
16、”,若甲發(fā)球則狀態(tài)轉(zhuǎn)移到“第一盞燈亮狀態(tài)”,若乙發(fā)球則轉(zhuǎn)移到“第八盞燈亮狀態(tài)”,具體說明以甲球為例。 若發(fā)球后乙沒有提前擊球----規(guī)定球移動到對方第一個發(fā)光二極管時允許擊球,那么狀態(tài)機從“第一盞燈亮狀態(tài)”轉(zhuǎn)移到“球向乙移動狀態(tài)”。若在“球向乙移動狀態(tài)”乙仍然沒有提前擊球,狀態(tài)就轉(zhuǎn)移到“允許乙擊球狀態(tài)”,在此狀態(tài)下,如果乙擊球了,那么狀態(tài)就轉(zhuǎn)移到“ 球向甲移動狀態(tài)”。在“第一盞燈亮狀態(tài)”, “球向乙移動狀態(tài)”中,如果乙擊球了 ,就算提前擊球,這樣甲得分,狀態(tài)轉(zhuǎn)移到“等待發(fā)球狀態(tài)”等待發(fā)球,“ 球向甲移動狀態(tài)”之后的過程和前面的過程只不過是甲乙角色的調(diào)換而已。狀態(tài)轉(zhuǎn)移規(guī)則都是一樣的。圖3.2給
17、出了乒乓球游戲機的原理圖。 等待發(fā)球 甲得分 乙得分 甲發(fā)球 乙發(fā)球 第一盞燈亮 第八盞燈亮 允許甲發(fā)球 球向甲移動 乙擊球 甲擊球 球向乙移動 乙擊球 甲擊球 允許乙發(fā)球
18、 乙沒擊球 甲沒擊球 圖3.2 乒乓球游戲機原理圖 3.2 各模塊原理及程序 該乒乓球游戲機的設(shè)計主要包括的模塊與內(nèi)容有:乒乓球游戲機實體的設(shè)計,游戲機編程的實現(xiàn),記分譯碼器的設(shè)計以及構(gòu)造體的設(shè)計。直接對狀態(tài)機進行描述,所有的狀態(tài)均可表達為CASE_WHEN結(jié)構(gòu)中的一條CASE語句,而狀態(tài)的轉(zhuǎn)移則通過IF_THEN_ELSE語句實現(xiàn)。以下我們就詳細解析各個板快的設(shè)計與實現(xiàn)。 3.2.1 乒乓球游戲機實體的設(shè)計 設(shè)計該乒乓球游戲機的輸入與輸出端口。首先考慮輸入端口,一般應(yīng)該設(shè)置一個異步置位端
19、口reset,用于在系統(tǒng)不正常時回到初始狀態(tài):兩個發(fā)球輸入端serve1和serve2,邏輯‘1’分別表示甲方和乙方的發(fā)球;兩個擊球輸入端hit1和hit2,邏輯‘1’分別表示甲擊球和乙擊球;一個開始游戲按鈕startbutton,處于邏輯‘1’表示可以游戲;還得有一個時鐘輸入端口clk。 其次考慮輸出端口,芯片應(yīng)該有8個輸出端口來控制8個發(fā)光二極管,輸出邏輯‘1’即輸出一個高電平,可以使發(fā)光二極管點亮;另外,要直觀地表示雙方的得分,就得用到4個七段譯碼器,每方用到2個,可以表示0到21的數(shù)字,每個七段譯碼器需要芯片的7個輸出端口來控制,總共28個輸出端口。實體的設(shè)計如下: library
20、 ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; //引用必要的庫函數(shù)和包集合 entity pingponggame is --實體名為pingponggame port(reset:int std_logic; clk:int std_logic; startbutton:int std_logic; --開始游戲輸入端口 serve:in std_logic_vector(1 to 2); --發(fā)球輸入
21、端口 hit1,hit2:int std_logic; --甲和乙的擊球輸入端口 --控制8個發(fā)光二極管的輸出端口 light:out std_logic_vector(1 to 8); score11,score12,score21,score22:out std_logic_vector(1 to 7)); --4個用于控制4個7段譯碼器的輸出端口 end pingponggame; 3.2.2 狀態(tài)機編程實現(xiàn) 狀態(tài)機設(shè)置了7個狀態(tài),分別是waitserve, light1on, ballmoveto2, Allow2hi
22、t,light8on,ballmoveto1,和allow1hit它們代表的具體數(shù)值依次是0到6。在波形模擬圖中是用數(shù)值來表示狀態(tài)的。 在整個程序中,狀態(tài)機起的是中央控制器的作用,由它控制的信號來影響整個程序中的其他相關(guān)部分,如記分部分,發(fā)光二極管部分。乒乓球游戲機中有兩個計數(shù)器count1和count2,分別記憶甲和乙的得分,用發(fā)光二極管的輪流發(fā)光表示球的移動軌跡。狀態(tài)機的進程如下: process(clk) --clk作為敏感信號觸發(fā)進程 begin --進程開始 if reset='1' then --異步置位 i<=0;count1<"
23、00000";count2<="00000"; elsif clk'event and clk='1' then --當處于時鐘inclock上升沿時 if count1="10101"or count2="10101"then i<=0;count1<"00000";count2<="00000"; elsif startbutton+'0' then i<=0;count1<"00000";count2<="00000"; else --以下case語句是程序中最關(guān)鍵的狀態(tài)機部分 case state is when waitserve=> --
24、進程處于等待發(fā)球狀態(tài) case serve is when "10'=> i<=1;state<=light1on; when "01'=> i<=8;state<=light8on; when "i1"=>i<=0; when others=> i<=0; end case; when light1on=> --進程處于第一盞燈亮狀態(tài) i<=2 if hit2='1' then i<=0; count1<=count1+1;state<=waitserve; else state<=ballmoveto2; end if; when light8o
25、n=> --進程處于第八盞燈亮狀態(tài) i<=7; if hit='1' then i<=0; count2<=count2+1;state<=waitserve; else state<=ballmoveto1; end if; when ballmoveto1=> --進程處于球向乙移動狀態(tài) if hit1='1' then i<=0; count2<=count2+1;state<=waitserve; elsif i=2 then i<=1; state<=allow1hit; else i<=i-1; end if; when bal
26、lmoveto2=> --進程處于球向乙移動狀態(tài) if hit2='1'then i<=0; ount1<=count1+1;state<=waitserve; elsif i=7 then i<=8; state<=allow2hit; else i<=i+1; end if; when allow1hit=> --進程處于允許甲擊球狀態(tài) if hit1='1' then i<=2; state<=ballowto2; else count2<=count2+1;i<=0; state<=waitserve; end if; when all
27、ow2hit=> --進程處于允許乙擊球狀態(tài) if hit2='1'then i<=7;state<=ballmoveto1; else count1<=count1+1;i<=0; state<=waitserve; end if; end case; end if; end if; end process; 3.2.3.記分譯碼器的設(shè)計 七段譯碼器是在數(shù)學(xué)電路設(shè)計中經(jīng)常用到的顯示電路。所謂七段譯碼器,其實是由7段發(fā)光二極管組成的用于顯示數(shù)字的器件。記分譯碼器(mydecoder):由于記分需要顯示出來,所以要使用七段譯碼器。而狀態(tài)機中的記分是由5位二進制
28、碼來表示的,即count1和count2。以下程序就是實現(xiàn)從5位二進制碼轉(zhuǎn)換成七段譯碼顯示。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsingned.all; entity mudecoder is port(binaryin:int std_logic_vector(1 to 5); --5位二進制碼的輸入端口 bcdout1:out std_logic_vector(1 to 7); --七段譯碼器輸出端口
29、 bcdout2:out std_logic_vector(1 to 7) ); end mydecoder; architecture m of mydecoder is signal tembinaryin:std_logic_vector(1 to 5); begin process(binaryin) begin tembinaryin<=binaryin; case tembinaryin is --把0到9的5位二進制碼轉(zhuǎn)換成七段譯碼 when"00000"=>bcdout1<="1111110";bcdout2<="1111110"; whe
30、n"00001"=>bcdout1<="1111110";bcdout2<="0110000"; when"00010"=>bcdout1<="1111110";bcdout2<="1101101"; when"00011"=>bcdout1<="1111110";bcdout2<="1111001"; when"00100"=>bcdout1<="1111110";bcdout2<="0110011"; when"00101"=>bcdout1<="1111110";bcdout2<="1011011"; when"00110"=>bcdout1<="1111110";bcdout
31、2<="1011111"; when"00111"=>bcdout1<="1111110";bcdout2<="1110000"; when"01000"=>bcdout1<="1111110";bcdout2<="1111111"; when"01001"=>bcdout1<="1111110";bcdout2<="1111011"; --把10到19的5位二進制碼轉(zhuǎn)換成七段譯碼 when"01010"=>bcdout1<="0110000";bcdout2<="1111110"; when"01011"=>bcdout1<="0110000";bcdout2<="0110000
32、"; when"00000"=>bcdout1<="0110000";bcdout2<="1101101"; when"01100"=>bcdout1<="0110000";bcdout2<="1111001"; when"01101"=>bcdout1<="0110000";bcdout2<="0110011"; when"01111"=>bcdout1<="0110000";bcdout2<="1011011"; when"10000"=>bcdout1<="0110000";bcdout2<="1011111"; when"10001"=>bcdout1<="0110000"
33、;bcdout2<="1110000"; when"10010"=>bcdout1<="0110000";bcdout2<="1111111"; when"10011"=>bcdout1<="0110000";bcdout2<="1111011"; --把20到21的5位二進制碼轉(zhuǎn)換成七段譯碼 when"10100"=>bcdout1<="1101101";bcdout2<="1111110"; when"10101"=>bcdout1<="1101101";bcdout2<="0110000"; --如果5位二進制碼不在0到21范圍內(nèi),那么兩個七段譯
34、碼器都顯示0 when others=>bcdout1<="1101101";bcdout2<="1111110"; end case; end process; end m; 這個記分譯馬電路是針對乒乓球游戲機的特點進行的特別設(shè)計,采用的是全部列舉的方法。 3.2.4. 構(gòu)造體的設(shè)計 該構(gòu)造體緊跟在實體設(shè)計之后,這樣就完成了數(shù)字乒乓球游戲機的VHDL源程序編寫。 architecture game of pingponggame is type pingpong is (waitserve,light1on,ballmoveto2,allow2hit,
35、 light8on,ballmoveto1,allow1hit); ---設(shè)置7個狀態(tài),為枚舉數(shù)據(jù)類型,記為pingpong signal state:pingpong; signal i:integer range 0 to 8; signal count1,count2:std_logic_vector(1 to 5):="00000"; ---內(nèi)部計數(shù)器,是5位二進制變量 component mydecoder is port(binaryin: in std_logic_vector(1 to 5); bcdout1:out std_logic_vec
36、tor(1 to 7); bcdout2:out std_logic_vector(1 to 7)); end component; ---調(diào)用記分譯碼器 begin process(clk) --狀態(tài)機進程 begin …… end process; --進程處i信號控制發(fā)光二極管的亮暗 light<="10000000"when(i=1) else "01000000" when(i=2) else "00100000" when(i=3) else "00010000" when(i=4) else "00001000
37、" when(i=5) else "00000100" when(i=6) else "00000010" when(i=7) else "00000001" when(i=8) else "00000000"; --其他情況所有發(fā)光二極管都暗 u0:mydecoder port map(count1,score11,score12); --用七段譯碼器顯示甲的分數(shù) u1:mydecoder port map(count2,score21,score22); ----用七段譯碼器顯示乙的分數(shù) end game; 從構(gòu)造體設(shè)計中可以看到,控制整個
38、乒乓球游戲機運轉(zhuǎn)的就是狀態(tài)機進程,它隊各個外圍部分起控制作用。它是整個程序的核心,起到一個中心控制器的作用。而外圍的部分,比如分數(shù)顯示,球的軌跡,都是通過它傳出的信號來控制。狀態(tài)機中的i信號和count1,count2信號的變化同時就可以影響到外圍的顯示部分---發(fā)光二極管和七段譯碼器,從而表示出當時的乒乓球位置和雙方分數(shù)情況。 4.系統(tǒng)編譯和波形仿真 4.1系統(tǒng)的編譯 編譯時選擇所要下載的芯片為EPM7128SLC84-15,在編譯完成以后,會出現(xiàn)兩個警告,信息是這樣的:“Primitive ‘score112’is stuck
39、 at VCC”和“Primitive ‘score212’is stuck at VCC”。這說明score11(2)和score21(2)端口輸出一直是‘1’。 score11(2)是用來表示甲得分的十位數(shù)字的七段譯碼器的b段的,由于在記分譯碼器設(shè)計中,十位數(shù)字只會顯示0,1或者2,無論是這三個數(shù)字中的那一個,b段的發(fā)光二極管都是亮的,所以就相當于接著高電平VCC。Score21(2)同理。提示信息如圖4.1所示。 圖4.1 編譯時警告信息圖 4.2 系統(tǒng)有關(guān)波形的仿真 編譯完成后,進行波形仿真,仿真波形圖如圖4.2所示。 圖4.2 乒乓球游戲機波形仿真圖
40、一 在這個仿真圖中,看到serve數(shù)組為1,代表乙發(fā)球。I從8開始依次遞減計數(shù),控制發(fā)光管亮暗light信號也隨著i的數(shù)值變化,見圖4.3所示。由light端口輸出的高電平驅(qū)動芯片以外的發(fā)光二極管使之點亮,這樣就可以通過發(fā)光二極管模擬乒乓球的運動軌跡。可以看到,在甲該擊球的時候沒有擊球,也就是hit1在state狀態(tài)6的時候沒有高電平‘1’輸入,則乙得分,count2由0變1,score22的值隨之變化。從最后一行state值的變化,可以清楚分析狀態(tài)轉(zhuǎn)移。 圖4.3 乒乓球游戲機仿真波形圖一中的乒乓球移動狀況 圖4.4是乙發(fā)球以后,甲在正確時刻接球的波形仿真圖。 圖4.
41、4 乒乓球游戲機波形仿真圖二 甲在state為狀態(tài)6的時候擊球了,在圖上hit1在此時刻出現(xiàn)高電平,看到state轉(zhuǎn)移到了狀態(tài)2。當?shù)搅藸顟B(tài)3乙沒有擊球,所以甲得分了,count1由0變到1,而七段譯碼器隨之改變。在圖4.5中可以清楚地看到球的移動軌跡。 圖4.5 乒乓球游戲機仿真波形圖二中的乒乓球移動狀況 下面仿真甲提前擊球的情況,如圖4.6所示。 在不允許甲擊球的狀態(tài)下,即state處在狀態(tài)5時,hit1輸入邏輯‘1’,表示甲擊球了,所以乙得分。這種情況下球的移動狀況如圖4.7所示。 圖4.6 乒乓球游戲機波形仿真圖三 圖4.7 乒乓球游戲機仿真波形圖三中的乒乓球移
42、動狀況 結(jié)束語 在課題設(shè)計中,通過使用MAX+PLUSⅡ這個完全集成化、易學(xué)易用的可編程邏輯設(shè)計環(huán)境,利用VHDL語言設(shè)計的乒乓球游戲機,較成功的完成了預(yù)期的效果,能夠正確判斷與顯示乒乓球的位置,并能自動裁判和記分的裝置。在具體設(shè)計過程中還需要改進的是控制系統(tǒng)的糾錯功能。由于時間關(guān)系,系統(tǒng)功能實現(xiàn)不夠完善,這些都需要不斷的改進和補充。 這次課程設(shè)計總的說來收獲很大。在最初的設(shè)計過程中,一共整理出好幾個方案。但在實際的過程中發(fā)現(xiàn),設(shè)計的情況和實際中還是有些差異的,通過比較得出最優(yōu)方案。此外,也學(xué)會了使用MAX+PLUS軟件。 這次課程設(shè)計雖然短暫。但卻是我獨立自主的從設(shè)計電路到得出結(jié)
43、論。書本上的內(nèi)容第一次完完全全的綜合運用。在設(shè)計過程中。遇到了書本中不曾學(xué)到的知識,經(jīng)過請教老師和同學(xué),以及查閱相關(guān)的資料,最終攻克。 致 謝 本文是在指導(dǎo)老師胡濱老師的悉心指導(dǎo)下完成的,胡濱老師在學(xué)術(shù)上嚴格要求,老師的教誨和鼓勵,及在學(xué)術(shù)上一絲不茍的精神,本人受益匪淺,在此向胡濱老師表示衷心的感謝和敬意! 同時,也要感謝本設(shè)計小組的同學(xué),感謝他們在我遇到困難時的熱情幫助,在課程設(shè)計中,我們積極的交流與探討也使我受益非淺,希望在以后的學(xué)習(xí)道路中我們能夠共同進步。 參考文獻 [1] 劉艷. EDA 技術(shù)在數(shù)字系統(tǒng)電路設(shè)計實驗中的應(yīng)用[J]. 實驗室研
44、究與探索,2002,21(3): 63264 [2] 徐穎.Protel 99 SE EDA技術(shù)及應(yīng)用[M].西安:機械工業(yè)出版社.2005? [3] 楊恒,盧飛成. FPGA/VHDL快速工程實踐入門與提高[M].北京航空航天大學(xué)出版社.2003 [4]甘歷.VHDL應(yīng)用與開發(fā)實踐[M].科學(xué)出版社.2003 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity pingponggame is
45、 --實體名為pingponggame port(reset:in std_logic; clk:in std_logic; startbutton:in std_logic; --開始游戲輸入端口 serve:in std_logic_vector(1 to 2); --發(fā)球輸入端口 hit1,hit2:in std_logic; --甲和乙的擊球輸入端口 light:out std_logic_vector(1 to 8); --控制8個發(fā)光二極管的輸出端口 score11,score12,score21,score22:
46、out std_logic_vector(1 to 7)); --4個用于控制4個7段譯碼器的輸出端口 end pingponggame; architecture game of pingponggame is type pingpong is (waitserve,light1on,ballmoveto2,allow2hit, light8on,ballmoveto1,allow1hit); ---設(shè)置7個狀態(tài),為枚舉數(shù)據(jù)類型,記為pingpong signal state:pingpong; signal i:integer range 0 to 8; sig
47、nal count1,count2:std_logic_vector(1 to 5):="00000"; ---內(nèi)部計數(shù)器,是5位二進制變量 component mydecoder is port(binaryin: in std_logic_vector(1 to 5); bcdout1:out std_logic_vector(1 to 7); bcdout2:out std_logic_vector(1 to 7)); end component; ---調(diào)用記分譯碼器 begin process(clk) --狀態(tài)機進程 b
48、egin if reset='1' then --異步置位 i<=0;count1<="00000";count2<="00000"; elsif clk'event and clk='1' then --當處于時鐘inclock上升沿時 if count1="10101"or count2="10101"then i<=0;count1<="00000";count2<="00000"; elsif startbutton='0' then i<=0;count1<="00000";count2<="00000"; else --以下case語句是
49、程序中最關(guān)鍵的狀態(tài)機部分 case state is when waitserve=> --進程處于等待發(fā)球狀態(tài) case serve is when "10"=> i<=1;state<=light1on; when "01"=> i<=8;state<=light8on; when "11"=>i<=0; when others=> i<=0; end case; when light1on=> --進程處于第一盞燈亮狀態(tài) i<=2; if hit2='1' then i<=0; count1<=count1+1;state<=waitserve;
50、 else state<=ballmoveto2; end if; when light8on=> --進程處于第八盞燈亮狀態(tài) i<=7; if hit1='1' then i<=0; count2<=count2+1;state<=waitserve; else state<=ballmoveto1; end if; when ballmoveto1=> --進程處于球向乙移動狀態(tài) if hit1='1' then i<=0; count2<=count2+1;state<=waitserve; elsif i=2 then i<=1
51、; state<=allow1hit; else i<=i-1; end if; when ballmoveto2=> --進程處于球向乙移動狀態(tài) if hit2='1'then i<=0; count1<=count1+1;state<=waitserve; elsif i=7 then i<=8; state<=allow2hit; else i<=i+1; end if; when allow1hit=> --進程處于允許甲擊球狀態(tài) if hit1='1' then i<=2; state<=ballmoveto2; else coun
52、t2<=count2+1;i<=0; state<=waitserve; end if; when allow2hit=> --進程處于允許乙擊球狀態(tài) if hit2='1'then i<=7;state<=ballmoveto1; else count1<=count1+1;i<=0; state<=waitserve; end if; end case; end if; end if; end process; --進程處i信號控制發(fā)光二極管的亮暗 light<="10000000"when(i=1) else "01000000" when
53、(i=2) else "00100000" when(i=3) else "00010000" when(i=4) else "00001000" when(i=5) else "00000100" when(i=6) else "00000010" when(i=7) else "00000001" when(i=8) else "00000000"; --其他情況所有發(fā)光二極管都暗 u0:mydecoder port map(count1,score11,score12); --用七段譯碼器顯示甲的分數(shù) u1:mydecoder port map
54、(count2,score21,score22); ----用七段譯碼器顯示乙的分數(shù) end game; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity mydecoder is port(binaryin:in std_logic_vector(1 to 5); --5位二進制碼的輸入端口 bcdout1:out std_logic_vector(1 to 7); -
55、-七段譯碼器輸出端口 bcdout2:out std_logic_vector(1 to 7) ); end mydecoder; architecture m of mydecoder is signal tembinaryin:std_logic_vector(1 to 5); begin process(binaryin) begin tembinaryin<=binaryin; case tembinaryin is --把0到9的5位二進制碼轉(zhuǎn)換成七段譯碼 when"00000"=>bcdout1<="1111110";bcdout2<="111
56、1110"; when"00001"=>bcdout1<="1111110";bcdout2<="0110000"; when"00010"=>bcdout1<="1111110";bcdout2<="1101101"; when"00011"=>bcdout1<="1111110";bcdout2<="1111001"; when"00100"=>bcdout1<="1111110";bcdout2<="0110011"; when"00101"=>bcdout1<="1111110";bcdout2<="1011011"; when"00110"=>bcdout1<="1111
57、110";bcdout2<="1011111"; when"00111"=>bcdout1<="1111110";bcdout2<="1110000"; when"01000"=>bcdout1<="1111110";bcdout2<="1111111"; when"01001"=>bcdout1<="1111110";bcdout2<="1111011"; --把10到19的5位二進制碼轉(zhuǎn)換成七段譯碼 when"01010"=>bcdout1<="0110000";bcdout2<="1111110"; when"01011"=>bcdout1<="0110000";bcdout
58、2<="0110000"; when"01100"=>bcdout1<="0110000";bcdout2<="1101101"; when"01101"=>bcdout1<="0110000";bcdout2<="1111001"; when"01110"=>bcdout1<="0110000";bcdout2<="0110011"; when"01111"=>bcdout1<="0110000";bcdout2<="1011011"; when"10000"=>bcdout1<="0110000";bcdout2<="1011111"; when"10001"=>bcdout1
59、<="0110000";bcdout2<="1110000"; when"10010"=>bcdout1<="0110000";bcdout2<="1111111"; when"10011"=>bcdout1<="0110000";bcdout2<="1111011"; --把20到21的5位二進制碼轉(zhuǎn)換成七段譯碼 when"10100"=>bcdout1<="1101101";bcdout2<="1111110"; when"10101"=>bcdout1<="1101101";bcdout2<="0110000"; --如果5位二進制碼不在0到21
60、范圍內(nèi),那么兩個七段譯碼器都顯示0 when others=>bcdout1<="1101101";bcdout2<="1111110"; end case; end process; end m; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PULSE IS PORT (CLK:IN STD_LOGIC; D :IN STD_LOGIC_VECTOR(7 DOWNTO 0); FO
61、UT:OUT STD_LOGIC); END; ARCHITECTURE ONE OF PULSE IS SIGNAL FULL: STD_LOGIC; BEGIN P_REG : PROCESS(CLK) VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLK'EVENT AND CLK='1' THEN IF CNT8="11111111"THEN CNT8:=D; FULL<='1';--計數(shù)溢出 ELSE CNT8:=CNT
62、8+1; FULL<='0'; END IF; END IF; END PROCESS P_REG; P_div: PROCESS(FULL) VARIABLE CNT2:STD_LOGIC; BEGIN IF FULL'EVENT AND FULL='1' THEN CNT2:= NOT CNT2; IF CNT2='1' THEN FOUT<='1'; ELSE FOUT<='0'; END IF;END IF; END PROCESS P_div; END; LIBRARY IEEE; USE I
63、EEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PULSE3 IS PORT (CLK:IN STD_LOGIC; en :in std_logic; FOUT:OUT STD_LOGIC; eno:out std_logic); END; ARCHITECTURE ONE OF PULSE3 IS SIGNAL FULL: STD_LOGIC; signal eno1: std_logic;
64、BEGIN P_REG : PROCESS(CLK,en) VARIABLE CNT8:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN if en='1' then IF CLK'EVENT AND CLK='1' THEN IF CNT8="1011" THEN CNT8:="0000"; eno1<='1'; ELSE eno1<='0'; CNT8:=CNT8+1; END IF; END IF; ELSE CNT8:="0000"; end if; END PROCESS P_REG; r_reg:process(CLK,en,eno1) begin if en='1' then if eno1='0' then FOUT<='1'; else FOUT<='0';end if; else FOUT<='0'; end if; end process r_reg; eno<=eno1; end ;
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024《增值稅法》全文學(xué)習(xí)解讀(規(guī)范增值稅的征收和繳納保護納稅人的合法權(quán)益)
- 2024《文物保護法》全文解讀學(xué)習(xí)(加強對文物的保護促進科學(xué)研究工作)
- 銷售技巧培訓(xùn)課件:接近客戶的套路總結(jié)
- 20種成交的銷售話術(shù)和技巧
- 銷售技巧:接近客戶的8種套路
- 銷售套路總結(jié)
- 房產(chǎn)銷售中的常見問題及解決方法
- 銷售技巧:值得默念的成交話術(shù)
- 銷售資料:讓人舒服的35種說話方式
- 汽車銷售績效管理規(guī)范
- 銷售技巧培訓(xùn)課件:絕對成交的銷售話術(shù)
- 頂尖銷售技巧總結(jié)
- 銷售技巧:電話營銷十大定律
- 銷售逼單最好的二十三種技巧
- 銷售最常遇到的10大麻煩