乒乓球游戲機(jī)的EDA設(shè)計(jì)

上傳人:da****ge 文檔編號(hào):53520694 上傳時(shí)間:2022-02-10 格式:DOC 頁數(shù):28 大?。?86.18KB
收藏 版權(quán)申訴 舉報(bào) 下載
乒乓球游戲機(jī)的EDA設(shè)計(jì)_第1頁
第1頁 / 共28頁
乒乓球游戲機(jī)的EDA設(shè)計(jì)_第2頁
第2頁 / 共28頁
乒乓球游戲機(jī)的EDA設(shè)計(jì)_第3頁
第3頁 / 共28頁

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《乒乓球游戲機(jī)的EDA設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《乒乓球游戲機(jī)的EDA設(shè)計(jì)(28頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、乒乓球游戲機(jī)的設(shè)計(jì) 摘要:本課程設(shè)計(jì)制作了一個(gè)乒乓球游戲機(jī)。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺(tái)為MAX+PLUSII,程序設(shè)計(jì)語言為VHDL。設(shè)計(jì)的乒乓球游戲機(jī)能夠正確判斷與顯示乒乓球的位置,并能自動(dòng)裁判和記分的裝置。本課程設(shè)計(jì)了乒乓球游戲機(jī)程序并進(jìn)行了程序仿真,從而實(shí)現(xiàn)一個(gè)完整的乒乓球游戲機(jī)。程序通過調(diào)試運(yùn)行,初步實(shí)現(xiàn)了設(shè)計(jì)目標(biāo),可應(yīng)用于實(shí)際的乒乓球游戲比賽中。本論文對(duì)系統(tǒng)的功能設(shè)計(jì)、實(shí)現(xiàn)流程及正確使用都做了詳細(xì)的描述。 關(guān)鍵詞:乒乓球游戲機(jī);VHDL;MAX+PLUSⅡ;程序仿真; 目錄 1 引言 1 1.1 課題設(shè)計(jì)的目的

2、 1 1.2 課題設(shè)計(jì)的內(nèi)容 1 2 EDA、VHDA簡(jiǎn)介 3 2.1 EDA的發(fā)展概況 3 2.2 硬件描述語言---VHDL ........................................3 3 乒乓球游戲機(jī)設(shè)計(jì)過程 5 3.1設(shè)計(jì)規(guī)劃 5 3.2各個(gè)模塊原理及程序 6 3.2.1乒乓球?qū)嶓w的設(shè)計(jì) 6 3.2.2 狀態(tài)機(jī)編程實(shí)現(xiàn) 7 3.2.3 記分譯器的設(shè)計(jì) 10 3.2.4 構(gòu)造體的設(shè)計(jì) 12 4 系統(tǒng)編譯和波形仿真 14 4.1系統(tǒng)編譯 14 4.2系統(tǒng)有關(guān)波形的仿真 14 結(jié)束語 17 致謝 17 參考文獻(xiàn) 18

3、 《乒乓球游戲機(jī)的設(shè)計(jì)》 第 25 頁 共 18 頁 1 引 言 隨著科學(xué)技術(shù)的發(fā)展,人類社會(huì)已進(jìn)入到高度發(fā)達(dá)的信息化社會(huì), 信息社會(huì)的發(fā)展離不開電子產(chǎn)品的進(jìn)步?,F(xiàn)代電子產(chǎn)品的發(fā)展越來越快, 各種新型電子元器件和智能化的電子產(chǎn)品已經(jīng)在國民經(jīng)濟(jì)的各個(gè)領(lǐng)域和人民生活的各個(gè)方面得到了日益廣泛的應(yīng)用。實(shí)現(xiàn)這種進(jìn)步的主要原因就是生產(chǎn)制造技術(shù)和電子設(shè)計(jì)技術(shù)的發(fā)展。其中電子玩具的發(fā)展也是在日益成熟。乒乓球游戲機(jī)控制電路是有甲、乙雙方參賽,有裁判控制發(fā)“球”的三人乒乓球游戲機(jī);它能完成自動(dòng)裁判和自動(dòng)計(jì)分是一個(gè)帶數(shù)字顯示的模擬游戲機(jī)。其結(jié)構(gòu)簡(jiǎn)單、成本低、易操作,安全性強(qiáng)

4、、無污染。乒乓球游戲機(jī)還能在娛樂的同時(shí)提高我們的反應(yīng)、應(yīng)變能力。具有良好的市場(chǎng)發(fā)展前景[1]。 1.1課題設(shè)計(jì)的目的 本文應(yīng)用狀態(tài)機(jī),設(shè)計(jì)了一個(gè)乒乓球游戲機(jī)的狀態(tài)機(jī)。狀態(tài)機(jī)的實(shí)現(xiàn)是符合人的思維邏輯的,且簡(jiǎn)單明了[2]。計(jì)算機(jī)組成原理課程設(shè)計(jì)是重要的綜合性實(shí)踐教學(xué)環(huán)節(jié)。 (1)通過該課程設(shè)計(jì),結(jié)合計(jì)算機(jī)科學(xué)的理論、抽象和設(shè)計(jì)三種形態(tài),進(jìn)一步掌握計(jì)算機(jī)中各功能部件的工作原理和邏輯實(shí)現(xiàn),熟悉乒乓球游戲機(jī)的基本工作原理。 (2)通過該課程設(shè)計(jì)的學(xué)習(xí),總結(jié)計(jì)算機(jī)組成原理課程的學(xué)習(xí)內(nèi)容,運(yùn)用所學(xué)的數(shù)字電路以及計(jì)算機(jī)組成和狀態(tài)機(jī)的基本原理、基本知識(shí)和基本技巧,解決某一個(gè)具體的實(shí)際問題,培養(yǎng)綜合分析和

5、解決問題的能力。 (3)為今后分析、設(shè)計(jì)、開發(fā)以及使用計(jì)算機(jī)打下堅(jiān)實(shí)的基礎(chǔ)。 1.2 課題設(shè)計(jì)的內(nèi)容 本文設(shè)計(jì)的是一個(gè)乒乓球游戲機(jī)的狀態(tài)機(jī)。利用VHDL,不需要按照傳統(tǒng)的設(shè)計(jì)方法進(jìn)行煩瑣的狀態(tài)分配、繪制狀態(tài)、化簡(jiǎn)狀態(tài)方程等,就可以簡(jiǎn)單地根據(jù)MDS圖直接對(duì)狀態(tài)機(jī)進(jìn)行描述。該設(shè)計(jì)可以實(shí)現(xiàn)的功能如下: (1) 該設(shè)計(jì)一個(gè)由甲、乙雙方參賽,有裁判的3人乒乓球游戲機(jī)。 (2) 用8個(gè)(或更多個(gè))LED排成一條直線,以中點(diǎn)為界,兩人乒乓游戲機(jī)是用8個(gè)發(fā)光二極管代表乒乓球臺(tái),中間兩個(gè)發(fā)光二極管兼做乒乓球網(wǎng),用點(diǎn)亮的發(fā)光二極管按一定方向移動(dòng)來表示球的運(yùn)動(dòng),在游戲機(jī)的兩側(cè)個(gè)設(shè)置發(fā)球和擊球開關(guān),甲乙雙

6、方按乒乓球比賽規(guī)則來操作開關(guān)。 (3) 當(dāng)“球”(點(diǎn)亮的那只LED)運(yùn)動(dòng)到某方的最后一位時(shí),參賽者應(yīng)能果斷地按下位于自己一方的按鈕開關(guān),即表示啟動(dòng)球拍擊球。當(dāng)甲方按動(dòng)乒乓球開關(guān)時(shí),靠近甲方的第一個(gè)發(fā)光二極管亮,然后發(fā)光二極管由甲方方向依次點(diǎn)亮,代表乒乓球的移動(dòng)。當(dāng)球過網(wǎng)后按照設(shè)計(jì)者規(guī)定的球位乙方就可以擊球。若乙方提前擊球或者未擊到球,則甲方得分。然后重新發(fā)球進(jìn)行比賽。 (4)設(shè)置自動(dòng)記分電路,甲、乙雙方各用7段譯碼管進(jìn)行記分顯示,每計(jì)滿21分為1局,然后記分清零,重新開始新一局比賽。 1 該設(shè)計(jì)一個(gè)由甲、乙雙方參賽,有裁判的3人乒乓球游戲機(jī)。 2 用8個(gè)LED排成一條直線,以中點(diǎn)為

7、界,兩邊各代表參賽雙方的位置,其中一只點(diǎn)亮的LED指示球的當(dāng)前位置,點(diǎn)亮的LED依次從左至右,其移動(dòng)速度應(yīng)能調(diào)節(jié),在其他時(shí)候擊球視為犯規(guī),給對(duì)方加1分;都犯規(guī),各自加1分。 3 當(dāng)“球”(點(diǎn)亮的那只LED)運(yùn)動(dòng)到某方的最后一位時(shí),參賽者應(yīng)能果斷地按下位于自己一方的按鈕開關(guān),即表示啟動(dòng)球拍擊球。若擊中,則球向相反方向移動(dòng),若未擊中,則對(duì)方得1分。 4 一方得1分時(shí),電路自動(dòng)響鈴3秒,這期間發(fā)球無效,等鈴聲停止后方能繼續(xù)比賽。 5 設(shè)置自動(dòng)記分電路,甲、乙雙方各用2位數(shù)碼管進(jìn)行記分顯示,每計(jì)滿21分為1局, 6 甲乙雙方各設(shè)一個(gè)發(fā)光二極管,表示擁有發(fā)球權(quán),每隔5次自動(dòng)交換發(fā)球權(quán),擁

8、有發(fā)球權(quán)的一方發(fā)球才有效。 7 裁判有一個(gè)按鈕,是系統(tǒng)初始化。 2 EDA、VHDL簡(jiǎn)介 2.1 EDA發(fā)展概況 電子設(shè)計(jì)技術(shù)的核心就是EDA技術(shù),EDA是指以計(jì)算機(jī)為工作臺(tái),融合應(yīng)用電子技術(shù)、計(jì)算機(jī)技術(shù)、智能化技術(shù)最新成果而研制成的電子CAD通用軟件包,主要能輔助進(jìn)行三方面的設(shè)計(jì)工作,即IC設(shè)計(jì)、電子電路設(shè)計(jì)和PCB設(shè)計(jì)。EDA技術(shù)已有30年的發(fā)展歷程,大致可分為三個(gè)階段。70年代為計(jì)算機(jī)輔助設(shè)計(jì)(CAD)階段,人們開始用進(jìn)行IC版圖編輯、PCB布局布線,取代了手工操作。80年代為計(jì)算機(jī)輔助工程(CAE)階段。與CAD相比,CAE除了有純粹的圖形繪制功能外,又增加了

9、電路功能設(shè)計(jì)和結(jié)構(gòu)設(shè)計(jì),并且通過電氣連接網(wǎng)絡(luò)表將兩者結(jié)合在一起,實(shí)現(xiàn)了工程設(shè)計(jì)。CAE的主要功能是:原理圖輸入,邏輯仿真,電路分析,自動(dòng)布局布線,PCB后分析。90年代為電子系統(tǒng)設(shè)計(jì)自動(dòng)化(EDA)階段[2]。 硬件描述語言HDL是相對(duì)于一般的計(jì)算機(jī)軟件語言,如:C、PASCAL而言的。HDL語言使用與設(shè)計(jì)硬件電子系統(tǒng)的計(jì)算機(jī)語言,它能描述電子系統(tǒng)的邏輯功能、電路結(jié)構(gòu)和連接方式。設(shè)計(jì)者可利用HDL程序來描述所希望的電路系統(tǒng),規(guī)定器件結(jié)構(gòu)特征和電路的行為方式;然后利用綜合器和適配器將此程序編程能控制FPGA和CPLD內(nèi)部結(jié)構(gòu),并實(shí)現(xiàn)相應(yīng)邏輯功能的的門級(jí)或更底層的結(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和美國國防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語言 。自IEEE公布了VHDL的標(biāo)準(zhǔn)版本,IEEE-1076(簡(jiǎn)稱87版)之后,各EDA公司相繼推出了自己的VHDL設(shè)計(jì)環(huán)境,或宣布自己的設(shè)計(jì)工具可以和VHDL接口。此后VHDL在電子設(shè)計(jì)領(lǐng)域得到了廣泛的接受,并逐步取代了原有的

11、非標(biāo)準(zhǔn)的硬件描述語言。1993年,IEEE對(duì)VHDL進(jìn)行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴(kuò)展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標(biāo)準(zhǔn)的1076-1993版本,(簡(jiǎn)稱93版)。現(xiàn)在,VHDL和Verilog作為IEEE的工業(yè)標(biāo)準(zhǔn)硬件描述語言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實(shí)上的通用硬件描述語言。專家認(rèn)為,在新的世紀(jì)中,VHDL于Verilog語言將承擔(dān)起大部分的數(shù)字系統(tǒng)設(shè)計(jì)任務(wù)。 VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風(fēng)格與句法是十分類似于一般的計(jì)算機(jī)高級(jí)語言。VHD

12、L的程序結(jié)構(gòu)特點(diǎn)是將一項(xiàng)工程設(shè)計(jì),或稱設(shè)計(jì)實(shí)體(可以是一個(gè)元件,一個(gè)電路模塊或一個(gè)系統(tǒng))分成外部(或稱可是部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實(shí)體的內(nèi)部功能和算法完成部分[4]。在對(duì)一個(gè)設(shè)計(jì)實(shí)體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計(jì)就可以直接調(diào)用這個(gè)實(shí)體。這種將設(shè)計(jì)實(shí)體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計(jì)的基本點(diǎn)。應(yīng)用VHDL進(jìn)行工程設(shè)計(jì)的優(yōu)點(diǎn)是多方面的[4]。 (1)與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了他成為系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語言。強(qiáng)大的行為描述能力是避開具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。

13、 (2)VHDL豐富的仿真語句和庫函數(shù),使得在任何大系統(tǒng)的設(shè)計(jì)早期就能查驗(yàn)設(shè)計(jì)系統(tǒng)的功能可行性,隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真模擬。 (3)VHDL語句的行為描述能力和程序結(jié)構(gòu)決定了他具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能。符合市場(chǎng)需求的大規(guī)模系統(tǒng)高效,高速的完成必須有多人甚至多個(gè)代發(fā)組共同并行工作才能實(shí)現(xiàn)。 (4)對(duì)于用VHDL完成的一個(gè)確定的設(shè)計(jì),可以利用EDA工具進(jìn)行邏輯綜合和優(yōu)化,并自動(dòng)的把VHDL描述設(shè)計(jì)轉(zhuǎn)變成門級(jí)網(wǎng)表。 (5)VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,設(shè)計(jì)者可以不懂硬件的結(jié)構(gòu),也不必管理最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么,而進(jìn)行獨(dú)立的設(shè)計(jì)[4]。

14、 3 乒乓球游戲機(jī)設(shè)計(jì)過程 3.1設(shè)計(jì)規(guī)劃 根據(jù)乒乓球比賽的過程和規(guī)則,首先游戲開始,如果一方非正確擊球則另一方加分,當(dāng)分?jǐn)?shù)大于21時(shí)獲勝,游戲結(jié)束,我們把設(shè)計(jì)流程規(guī)定如圖3.1所示。 游戲開始 正確接發(fā)球? 大于21? 甲 乙 否 否 大于2

15、1? 乙方勝利 甲方勝利 甲方加分 乙方加分 N N Y Y 游戲結(jié)束 圖3.1設(shè)計(jì)流程圖 狀態(tài)機(jī)設(shè)置了7個(gè)狀態(tài),分別是“等待發(fā)球狀態(tài)”,“第一盞燈亮狀態(tài)”,“第八盞燈亮狀態(tài)”,“球向乙移動(dòng)狀態(tài)”,“ 球向甲移動(dòng)狀態(tài)”,“允許甲擊球狀態(tài)”, “允許乙擊球狀態(tài)”。這是該程序中起決定作用的七個(gè)狀態(tài)。開始的時(shí)候處于“等待發(fā)球狀態(tài)

16、”,若甲發(fā)球則狀態(tài)轉(zhuǎn)移到“第一盞燈亮狀態(tài)”,若乙發(fā)球則轉(zhuǎn)移到“第八盞燈亮狀態(tài)”,具體說明以甲球?yàn)槔? 若發(fā)球后乙沒有提前擊球----規(guī)定球移動(dòng)到對(duì)方第一個(gè)發(fā)光二極管時(shí)允許擊球,那么狀態(tài)機(jī)從“第一盞燈亮狀態(tài)”轉(zhuǎn)移到“球向乙移動(dòng)狀態(tài)”。若在“球向乙移動(dòng)狀態(tài)”乙仍然沒有提前擊球,狀態(tài)就轉(zhuǎn)移到“允許乙擊球狀態(tài)”,在此狀態(tài)下,如果乙擊球了,那么狀態(tài)就轉(zhuǎn)移到“ 球向甲移動(dòng)狀態(tài)”。在“第一盞燈亮狀態(tài)”, “球向乙移動(dòng)狀態(tài)”中,如果乙擊球了 ,就算提前擊球,這樣甲得分,狀態(tài)轉(zhuǎn)移到“等待發(fā)球狀態(tài)”等待發(fā)球,“ 球向甲移動(dòng)狀態(tài)”之后的過程和前面的過程只不過是甲乙角色的調(diào)換而已。狀態(tài)轉(zhuǎn)移規(guī)則都是一樣的。圖3.2給

17、出了乒乓球游戲機(jī)的原理圖。 等待發(fā)球 甲得分 乙得分 甲發(fā)球 乙發(fā)球 第一盞燈亮 第八盞燈亮 允許甲發(fā)球 球向甲移動(dòng) 乙擊球 甲擊球 球向乙移動(dòng) 乙擊球 甲擊球 允許乙發(fā)球

18、 乙沒擊球 甲沒擊球 圖3.2 乒乓球游戲機(jī)原理圖 3.2 各模塊原理及程序 該乒乓球游戲機(jī)的設(shè)計(jì)主要包括的模塊與內(nèi)容有:乒乓球游戲機(jī)實(shí)體的設(shè)計(jì),游戲機(jī)編程的實(shí)現(xiàn),記分譯碼器的設(shè)計(jì)以及構(gòu)造體的設(shè)計(jì)。直接對(duì)狀態(tài)機(jī)進(jìn)行描述,所有的狀態(tài)均可表達(dá)為CASE_WHEN結(jié)構(gòu)中的一條CASE語句,而狀態(tài)的轉(zhuǎn)移則通過IF_THEN_ELSE語句實(shí)現(xiàn)。以下我們就詳細(xì)解析各個(gè)板快的設(shè)計(jì)與實(shí)現(xiàn)。 3.2.1 乒乓球游戲機(jī)實(shí)體的設(shè)計(jì) 設(shè)計(jì)該乒乓球游戲機(jī)的輸入與輸出端口。首先考慮輸入端口,一般應(yīng)該設(shè)置一個(gè)異步置位端

19、口reset,用于在系統(tǒng)不正常時(shí)回到初始狀態(tài):兩個(gè)發(fā)球輸入端serve1和serve2,邏輯‘1’分別表示甲方和乙方的發(fā)球;兩個(gè)擊球輸入端hit1和hit2,邏輯‘1’分別表示甲擊球和乙擊球;一個(gè)開始游戲按鈕startbutton,處于邏輯‘1’表示可以游戲;還得有一個(gè)時(shí)鐘輸入端口clk。 其次考慮輸出端口,芯片應(yīng)該有8個(gè)輸出端口來控制8個(gè)發(fā)光二極管,輸出邏輯‘1’即輸出一個(gè)高電平,可以使發(fā)光二極管點(diǎn)亮;另外,要直觀地表示雙方的得分,就得用到4個(gè)七段譯碼器,每方用到2個(gè),可以表示0到21的數(shù)字,每個(gè)七段譯碼器需要芯片的7個(gè)輸出端口來控制,總共28個(gè)輸出端口。實(shí)體的設(shè)計(jì)如下: 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 --實(shí)體名為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個(gè)發(fā)光二極管的輸出端口 light:out std_logic_vector(1 to 8); score11,score12,score21,score22:out std_logic_vector(1 to 7)); --4個(gè)用于控制4個(gè)7段譯碼器的輸出端口 end pingponggame; 3.2.2 狀態(tài)機(jī)編程實(shí)現(xiàn) 狀態(tài)機(jī)設(shè)置了7個(gè)狀態(tài),分別是waitserve, light1on, ballmoveto2, Allow2hi

22、t,light8on,ballmoveto1,和allow1hit它們代表的具體數(shù)值依次是0到6。在波形模擬圖中是用數(shù)值來表示狀態(tài)的。 在整個(gè)程序中,狀態(tài)機(jī)起的是中央控制器的作用,由它控制的信號(hào)來影響整個(gè)程序中的其他相關(guān)部分,如記分部分,發(fā)光二極管部分。乒乓球游戲機(jī)中有兩個(gè)計(jì)數(shù)器count1和count2,分別記憶甲和乙的得分,用發(fā)光二極管的輪流發(fā)光表示球的移動(dòng)軌跡。狀態(tài)機(jī)的進(jìn)程如下: process(clk) --clk作為敏感信號(hào)觸發(fā)進(jìn)程 begin --進(jìn)程開始 if reset='1' then --異步置位 i<=0;count1<"

23、00000";count2<="00000"; elsif clk'event and clk='1' then --當(dāng)處于時(shí)鐘inclock上升沿時(shí) 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)機(jī)部分 case state is when waitserve=> --

24、進(jìn)程處于等待發(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=> --進(jìn)程處于第一盞燈亮狀態(tài) i<=2 if hit2='1' then i<=0; count1<=count1+1;state<=waitserve; else state<=ballmoveto2; end if; when light8o

25、n=> --進(jìn)程處于第八盞燈亮狀態(tài) i<=7; if hit='1' then i<=0; count2<=count2+1;state<=waitserve; else state<=ballmoveto1; end if; when ballmoveto1=> --進(jìn)程處于球向乙移動(dòng)狀態(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=> --進(jìn)程處于球向乙移動(dòng)狀態(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=> --進(jìn)程處于允許甲擊球狀態(tài) if hit1='1' then i<=2; state<=ballowto2; else count2<=count2+1;i<=0; state<=waitserve; end if; when all

27、ow2hit=> --進(jìn)程處于允許乙擊球狀態(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è)計(jì) 七段譯碼器是在數(shù)學(xué)電路設(shè)計(jì)中經(jīng)常用到的顯示電路。所謂七段譯碼器,其實(shí)是由7段發(fā)光二極管組成的用于顯示數(shù)字的器件。記分譯碼器(mydecoder):由于記分需要顯示出來,所以要使用七段譯碼器。而狀態(tài)機(jī)中的記分是由5位二進(jìn)制

28、碼來表示的,即count1和count2。以下程序就是實(shí)現(xiàn)從5位二進(jìn)制碼轉(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位二進(jìn)制碼的輸入端口 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位二進(jìn)制碼轉(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位二進(jìn)制碼轉(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位二進(jìn)制碼轉(zhuǎn)換成七段譯碼 when"10100"=>bcdout1<="1101101";bcdout2<="1111110"; when"10101"=>bcdout1<="1101101";bcdout2<="0110000"; --如果5位二進(jìn)制碼不在0到21范圍內(nèi),那么兩個(gè)七段譯

34、碼器都顯示0 when others=>bcdout1<="1101101";bcdout2<="1111110"; end case; end process; end m; 這個(gè)記分譯馬電路是針對(duì)乒乓球游戲機(jī)的特點(diǎn)進(jìn)行的特別設(shè)計(jì),采用的是全部列舉的方法。 3.2.4. 構(gòu)造體的設(shè)計(jì) 該構(gòu)造體緊跟在實(shí)體設(shè)計(jì)之后,這樣就完成了數(shù)字乒乓球游戲機(jī)的VHDL源程序編寫。 architecture game of pingponggame is type pingpong is (waitserve,light1on,ballmoveto2,allow2hit,

35、 light8on,ballmoveto1,allow1hit); ---設(shè)置7個(gè)狀態(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)部計(jì)數(shù)器,是5位二進(jìn)制變量 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)機(jī)進(jìn)程 begin …… end process; --進(jìn)程處i信號(hào)控制發(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); --用七段譯碼器顯示甲的分?jǐn)?shù) u1:mydecoder port map(count2,score21,score22); ----用七段譯碼器顯示乙的分?jǐn)?shù) end game; 從構(gòu)造體設(shè)計(jì)中可以看到,控制整個(gè)

38、乒乓球游戲機(jī)運(yùn)轉(zhuǎn)的就是狀態(tài)機(jī)進(jìn)程,它隊(duì)各個(gè)外圍部分起控制作用。它是整個(gè)程序的核心,起到一個(gè)中心控制器的作用。而外圍的部分,比如分?jǐn)?shù)顯示,球的軌跡,都是通過它傳出的信號(hào)來控制。狀態(tài)機(jī)中的i信號(hào)和count1,count2信號(hào)的變化同時(shí)就可以影響到外圍的顯示部分---發(fā)光二極管和七段譯碼器,從而表示出當(dāng)時(shí)的乒乓球位置和雙方分?jǐn)?shù)情況。 4.系統(tǒng)編譯和波形仿真 4.1系統(tǒng)的編譯 編譯時(shí)選擇所要下載的芯片為EPM7128SLC84-15,在編譯完成以后,會(huì)出現(xiàn)兩個(gè)警告,信息是這樣的:“Primitive ‘score112’is stuck

39、 at VCC”和“Primitive ‘score212’is stuck at VCC”。這說明score11(2)和score21(2)端口輸出一直是‘1’。 score11(2)是用來表示甲得分的十位數(shù)字的七段譯碼器的b段的,由于在記分譯碼器設(shè)計(jì)中,十位數(shù)字只會(huì)顯示0,1或者2,無論是這三個(gè)數(shù)字中的那一個(gè),b段的發(fā)光二極管都是亮的,所以就相當(dāng)于接著高電平VCC。Score21(2)同理。提示信息如圖4.1所示。 圖4.1 編譯時(shí)警告信息圖 4.2 系統(tǒng)有關(guān)波形的仿真 編譯完成后,進(jìn)行波形仿真,仿真波形圖如圖4.2所示。 圖4.2 乒乓球游戲機(jī)波形仿真圖

40、一 在這個(gè)仿真圖中,看到serve數(shù)組為1,代表乙發(fā)球。I從8開始依次遞減計(jì)數(shù),控制發(fā)光管亮暗light信號(hào)也隨著i的數(shù)值變化,見圖4.3所示。由light端口輸出的高電平驅(qū)動(dòng)芯片以外的發(fā)光二極管使之點(diǎn)亮,這樣就可以通過發(fā)光二極管模擬乒乓球的運(yùn)動(dòng)軌跡??梢钥吹?,在甲該擊球的時(shí)候沒有擊球,也就是hit1在state狀態(tài)6的時(shí)候沒有高電平‘1’輸入,則乙得分,count2由0變1,score22的值隨之變化。從最后一行state值的變化,可以清楚分析狀態(tài)轉(zhuǎn)移。 圖4.3 乒乓球游戲機(jī)仿真波形圖一中的乒乓球移動(dòng)狀況 圖4.4是乙發(fā)球以后,甲在正確時(shí)刻接球的波形仿真圖。 圖4.

41、4 乒乓球游戲機(jī)波形仿真圖二 甲在state為狀態(tài)6的時(shí)候擊球了,在圖上hit1在此時(shí)刻出現(xiàn)高電平,看到state轉(zhuǎn)移到了狀態(tài)2。當(dāng)?shù)搅藸顟B(tài)3乙沒有擊球,所以甲得分了,count1由0變到1,而七段譯碼器隨之改變。在圖4.5中可以清楚地看到球的移動(dòng)軌跡。 圖4.5 乒乓球游戲機(jī)仿真波形圖二中的乒乓球移動(dòng)狀況 下面仿真甲提前擊球的情況,如圖4.6所示。 在不允許甲擊球的狀態(tài)下,即state處在狀態(tài)5時(shí),hit1輸入邏輯‘1’,表示甲擊球了,所以乙得分。這種情況下球的移動(dòng)狀況如圖4.7所示。 圖4.6 乒乓球游戲機(jī)波形仿真圖三 圖4.7 乒乓球游戲機(jī)仿真波形圖三中的乒乓球移

42、動(dòng)狀況 結(jié)束語 在課題設(shè)計(jì)中,通過使用MAX+PLUSⅡ這個(gè)完全集成化、易學(xué)易用的可編程邏輯設(shè)計(jì)環(huán)境,利用VHDL語言設(shè)計(jì)的乒乓球游戲機(jī),較成功的完成了預(yù)期的效果,能夠正確判斷與顯示乒乓球的位置,并能自動(dòng)裁判和記分的裝置。在具體設(shè)計(jì)過程中還需要改進(jìn)的是控制系統(tǒng)的糾錯(cuò)功能。由于時(shí)間關(guān)系,系統(tǒng)功能實(shí)現(xiàn)不夠完善,這些都需要不斷的改進(jìn)和補(bǔ)充。 這次課程設(shè)計(jì)總的說來收獲很大。在最初的設(shè)計(jì)過程中,一共整理出好幾個(gè)方案。但在實(shí)際的過程中發(fā)現(xiàn),設(shè)計(jì)的情況和實(shí)際中還是有些差異的,通過比較得出最優(yōu)方案。此外,也學(xué)會(huì)了使用MAX+PLUS軟件。 這次課程設(shè)計(jì)雖然短暫。但卻是我獨(dú)立自主的從設(shè)計(jì)電路到得出結(jié)

43、論。書本上的內(nèi)容第一次完完全全的綜合運(yùn)用。在設(shè)計(jì)過程中。遇到了書本中不曾學(xué)到的知識(shí),經(jīng)過請(qǐng)教老師和同學(xué),以及查閱相關(guān)的資料,最終攻克。 致 謝 本文是在指導(dǎo)老師胡濱老師的悉心指導(dǎo)下完成的,胡濱老師在學(xué)術(shù)上嚴(yán)格要求,老師的教誨和鼓勵(lì),及在學(xué)術(shù)上一絲不茍的精神,本人受益匪淺,在此向胡濱老師表示衷心的感謝和敬意! 同時(shí),也要感謝本設(shè)計(jì)小組的同學(xué),感謝他們?cè)谖矣龅嚼щy時(shí)的熱情幫助,在課程設(shè)計(jì)中,我們積極的交流與探討也使我受益非淺,希望在以后的學(xué)習(xí)道路中我們能夠共同進(jìn)步。 參考文獻(xiàn) [1] 劉艷. EDA 技術(shù)在數(shù)字系統(tǒng)電路設(shè)計(jì)實(shí)驗(yàn)中的應(yīng)用[J]. 實(shí)驗(yàn)室研

44、究與探索,2002,21(3): 63264 [2] 徐穎.Protel 99 SE EDA技術(shù)及應(yīng)用[M].西安:機(jī)械工業(yè)出版社.2005? [3] 楊恒,盧飛成. FPGA/VHDL快速工程實(shí)踐入門與提高[M].北京航空航天大學(xué)出版社.2003 [4]甘歷.VHDL應(yīng)用與開發(fā)實(shí)踐[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、 --實(shí)體名為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個(gè)發(fā)光二極管的輸出端口 score11,score12,score21,score22:

46、out std_logic_vector(1 to 7)); --4個(gè)用于控制4個(gè)7段譯碼器的輸出端口 end pingponggame; architecture game of pingponggame is type pingpong is (waitserve,light1on,ballmoveto2,allow2hit, light8on,ballmoveto1,allow1hit); ---設(shè)置7個(gè)狀態(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)部計(jì)數(shù)器,是5位二進(jìn)制變量 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)機(jī)進(jìn)程 b

48、egin if reset='1' then --異步置位 i<=0;count1<="00000";count2<="00000"; elsif clk'event and clk='1' then --當(dāng)處于時(shí)鐘inclock上升沿時(shí) 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)機(jī)部分 case state is when waitserve=> --進(jìn)程處于等待發(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=> --進(jìn)程處于第一盞燈亮狀態(tài) i<=2; if hit2='1' then i<=0; count1<=count1+1;state<=waitserve;

50、 else state<=ballmoveto2; end if; when light8on=> --進(jìn)程處于第八盞燈亮狀態(tài) i<=7; if hit1='1' then i<=0; count2<=count2+1;state<=waitserve; else state<=ballmoveto1; end if; when ballmoveto1=> --進(jìn)程處于球向乙移動(dòng)狀態(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=> --進(jìn)程處于球向乙移動(dòng)狀態(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=> --進(jìn)程處于允許甲擊球狀態(tài) if hit1='1' then i<=2; state<=ballmoveto2; else coun

52、t2<=count2+1;i<=0; state<=waitserve; end if; when allow2hit=> --進(jìn)程處于允許乙擊球狀態(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; --進(jìn)程處i信號(hào)控制發(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); --用七段譯碼器顯示甲的分?jǐn)?shù) u1:mydecoder port map

54、(count2,score21,score22); ----用七段譯碼器顯示乙的分?jǐn)?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位二進(jìn)制碼的輸入端口 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位二進(jìn)制碼轉(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位二進(jìn)制碼轉(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位二進(jìn)制碼轉(zhuǎn)換成七段譯碼 when"10100"=>bcdout1<="1101101";bcdout2<="1111110"; when"10101"=>bcdout1<="1101101";bcdout2<="0110000"; --如果5位二進(jìn)制碼不在0到21

60、范圍內(nèi),那么兩個(gè)七段譯碼器都顯示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';--計(jì)數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲