【正文】
數(shù)字電路實(shí)驗(yàn)報(bào)告 擲骰子游戲電路的設(shè)計(jì)與實(shí)現(xiàn)班級(jí):學(xué)號(hào):姓名: 2014年11月9日一、 實(shí)驗(yàn)任務(wù)與要求1. 實(shí)驗(yàn)?zāi)康蘑?進(jìn)一步掌握VHDL語(yǔ)言和Quartus II的使用,并且用VHDL語(yǔ)言實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì);② 熟悉數(shù)字系統(tǒng)設(shè)計(jì)方法:傳統(tǒng)的系統(tǒng)硬件設(shè)計(jì)方法、層次化結(jié)構(gòu)設(shè)計(jì)、自頂向下設(shè)計(jì)方法;③ 學(xué)會(huì)使用方框圖、邏輯流程圖來設(shè)計(jì)有限狀態(tài)機(jī)系統(tǒng).2. 實(shí)驗(yàn)儀器(軟件與硬件)及元器件(1) Quartus II;(2)計(jì)算機(jī);(3) MAX II(EPM1270T144C5).3. 實(shí)驗(yàn)內(nèi)容 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)擲骰子游戲電路?;疽螅?電路可供甲乙二人游戲,游戲者甲使用的按鍵為 BTN0,游戲者乙使用的按鍵為BTN1 。 每按一次按鍵,代表擲一次骰子,可隨機(jī)得到 1~6 范圍內(nèi)的兩個(gè)數(shù)字。 甲乙按鍵產(chǎn)生的隨機(jī)數(shù)字分別用數(shù)碼管 DISP0DISP1 、 DISP2DISP3 顯示,并用DISP7 顯示比賽局?jǐn)?shù),比賽結(jié)束用 8 8 點(diǎn)陣顯示獲勝方,并伴有聲音效果。 具體游戲規(guī)則如下:(1) 第一局比賽,甲乙依次各按一次按鍵,按鍵所得兩數(shù)之和為 7 或 11 者勝;若無(wú)人取勝,則進(jìn)行第二局比賽;(2) 第二局比賽,甲乙每人各按一次按鍵,按鍵所得二數(shù)之和與第一局比賽相同者獲勝,若無(wú)人獲勝,則進(jìn)行第三局比賽,重復(fù)進(jìn)行步驟(2),直到出現(xiàn)勝者為止。(3) 游戲局?jǐn)?shù)最多進(jìn)行六局。在第六局比賽時(shí),若重復(fù)進(jìn)行步驟(2)仍未出現(xiàn)勝者,以按鍵所得兩數(shù)之和最大者為獲勝方。提高要求: 增加多人游戲的功能,數(shù)碼管可分時(shí)記錄顯示每個(gè)游戲者的骰子點(diǎn)數(shù)。 點(diǎn)陣顯示增加游戲開機(jī)動(dòng)畫、結(jié)束動(dòng)畫,并伴有樂曲播放。 自擬其它功能。二、問題分析 骰子應(yīng)用十分廣泛,現(xiàn)代社會(huì)上流行有各種定位骰子、黃金骰子、感應(yīng)骰子、遙控骰子等,它是娛樂游戲的一種道具,是許多游戲必不可少的工具之一,比如麻將等。早先是用骨頭、木頭等制成的立方體小方塊,六面分別刻有一、二、三、四、五、六點(diǎn),只有1,2,3,4,5,6這六個(gè)數(shù)字,有的地方叫色子。 用骨頭、木頭等制成的立方骰子,在使用時(shí)通常是是把骰子搖動(dòng)后擲落,以上面的數(shù)作為選取的數(shù)字。在這六個(gè)數(shù)字當(dāng)中,每擲一次,其中一個(gè)數(shù)出現(xiàn)的概率為1/,就是說這六個(gè)數(shù)并不是按某個(gè)順序出現(xiàn)的,而是隨機(jī)的。如果不考慮骰子的形狀和使用方法的約束來抽象評(píng)價(jià)它的功能,那么骰子就是一種“從1~6的數(shù)字,每次只隨機(jī)地選擇1個(gè)數(shù)字的選擇裝置”。 本游戲電路是模擬擲骰子,可供兩人游戲。游戲者每按鍵可以得到1~6范圍的兩個(gè)數(shù)字,并按一定的規(guī)則決定勝負(fù)。 由于按一次鍵產(chǎn)生16中的兩個(gè)數(shù),它們的和介于2和12之間,本實(shí)驗(yàn)中規(guī)定第一次如果和為7或者11者獲勝,若無(wú)人獲勝,需要繼續(xù)進(jìn)行,第二次按鍵后獲得的數(shù)的和需要與第一次的和進(jìn)行比較,所以需要保存第一次的和,如果相同,則獲勝;否則,按失敗處理。如果仍然沒有人獲勝,繼續(xù)比賽。 通過以上分析,此游戲可以借助MAX II(EPM1270T144C5)開發(fā)板實(shí)現(xiàn),用時(shí)鐘信號(hào)產(chǎn)生隨機(jī)數(shù),借助EDA開發(fā)板的強(qiáng)大的邏輯算數(shù)處理與控制能力進(jìn)行用戶的交互控制與處理,同時(shí),我們已經(jīng)掌握了電路、模電、數(shù)電等專業(yè)知識(shí),并且能針對(duì)EDA開發(fā)板進(jìn)行熟練的VHDL編程,加之本項(xiàng)目比較簡(jiǎn)單,不需要多少經(jīng)費(fèi),所以本電子設(shè)計(jì)具有可行性。 游戲時(shí),游戲者交替按鍵,次序不可顛倒,不可重復(fù)按鍵,分出勝負(fù)后,數(shù)碼管顯示不在變化。若要重新開始比賽,請(qǐng)按復(fù)位鍵繼續(xù)。二、 系統(tǒng)設(shè)計(jì)數(shù)字系統(tǒng)是指由若干數(shù)字電路和邏輯部件構(gòu)成的能夠處理或傳送數(shù)字信息設(shè)備。數(shù)字系統(tǒng)通??梢苑譃槿齻€(gè)部分:輸入/輸出接口、數(shù)據(jù)處理器和控制器。其中輸入/輸出接口是完成將其他物理量轉(zhuǎn)化為數(shù)字量或?qū)?shù)字量轉(zhuǎn)化為其他物理量的功能部件。數(shù)據(jù)處理器按功能又可以分解成若干子處理單元,通常稱為子系統(tǒng),每個(gè)子系統(tǒng)完成一定的邏輯功能,計(jì)數(shù)器、譯碼器、運(yùn)算器等都可作為一個(gè)子系統(tǒng),控制器管理各個(gè)子系統(tǒng)的局部及整個(gè)系統(tǒng)按規(guī)定順序工作。本游戲系統(tǒng)將采用自頂向下的數(shù)字系統(tǒng)的設(shè)計(jì)方法??梢钥闯?,這種方法的關(guān)鍵在于設(shè)計(jì)控制器,其余部分只是選用不同功能模塊而已,這就將一個(gè)復(fù)雜的數(shù)字系統(tǒng)設(shè)計(jì)簡(jiǎn)化為一個(gè)時(shí)序機(jī)的設(shè)計(jì)。而控制器的設(shè)計(jì)關(guān)鍵在于建立邏輯流程圖,即關(guān)鍵是對(duì)系統(tǒng)初始方案的確定,這在整個(gè)設(shè)計(jì)過程中是最富有創(chuàng)造性的,以后各步只不過是按一定方法向下延伸。這也就是自頂向下設(shè)計(jì)方法的優(yōu)越所在。數(shù)碼管 RESETBTN骰子控制器 8*8BEEPBEEPCLK骰子控制器CATRESET供電LED8*8DISPLAYBTN1BTN0 BEEPBTNRESET計(jì)數(shù)器防抖骰子控制器8*8點(diǎn)陣數(shù)碼管分頻器CLK 第2到5局開始只有一人與第一局相同N=1只有一人的和為7或11第一局 是N6在此處鍵入公式。N=N+1 第6局 否 是只有一人與第一局相同 是是否和相同 否結(jié)束是第7局以上和相同 否是 輸入模塊:輸入模塊主要包括BTN0,BTN1,RESET,CLK。BTN0的作用是表示玩家甲擲骰子的開始;BTN1的作用是表示玩家乙擲骰子的開始;RESET的作用是表示游戲重新開始的標(biāo)志;CLK表示的是系統(tǒng)的源時(shí)鐘頻率的輸入。 數(shù)碼管模塊:數(shù)碼管模塊其實(shí)就是數(shù)碼管的并行排列。這里的數(shù)碼管主要用來顯示玩家甲乙的點(diǎn)數(shù)和游戲進(jìn)行的局?jǐn)?shù)。多個(gè)數(shù)碼管動(dòng)態(tài)掃描顯示,是將所有數(shù)碼管的相同段并聯(lián)在一起,通過選通信號(hào)分時(shí)控制各個(gè)數(shù)碼管的公共端,循環(huán)依次點(diǎn)亮多個(gè)數(shù)碼管,利用人眼的視覺暫留現(xiàn)象,只要掃描頻率大于50HZ,將看不到閃爍現(xiàn)象。 點(diǎn)陣模塊:只要系統(tǒng)不斷地以掃描方式給點(diǎn)陣的行和列發(fā)送相應(yīng)的高低電平,在點(diǎn)陣上就可以點(diǎn)亮不同的二極管。當(dāng)掃描頻率高于一定數(shù)值時(shí),點(diǎn)陣上就會(huì)出現(xiàn)穩(wěn)定的字符或者圖形。當(dāng)玩家甲獲勝時(shí),點(diǎn)陣顯示“甲”;當(dāng)玩家乙獲勝時(shí),點(diǎn)陣顯示“乙”;當(dāng)玩家甲乙都不獲勝時(shí),點(diǎn)陣顯示“X”。 音樂播放模塊:此音樂播放模塊分為3個(gè)主要模塊,即音樂發(fā)生器模塊,音符譯碼電路模塊,數(shù)控分頻模塊。分好層次之后,編寫每個(gè)模塊的程序,分別生成項(xiàng)目符號(hào),最后把生成的個(gè)項(xiàng)目符號(hào)用原理圖的方式連接起來,然后編譯、下載即可。三、 程序設(shè)計(jì)VHDL具有功能強(qiáng)大的語(yǔ)言結(jié)構(gòu),可以用簡(jiǎn)潔明確的源代碼來描述復(fù)雜的邏輯控制。它具有多層次的設(shè)計(jì)描述功能,層層細(xì)化,最后可直接生成電路級(jí)描述。VHDL支持各種設(shè)計(jì)方法,既支持自底向上的設(shè)計(jì),又支持自頂向下的設(shè)計(jì);既支持模塊化設(shè)計(jì),又支持層次化設(shè)計(jì)。VHDL采用基于庫(kù)(library)的設(shè)計(jì)方法,可以建立各種可再次利用的模塊。這些模塊可以預(yù)先設(shè)計(jì)或使用以前設(shè)計(jì)中的存檔模塊,將這些模塊存放在庫(kù)中,就可以在以后的設(shè)計(jì)中進(jìn)行復(fù)用,可以使設(shè)計(jì)成果在設(shè)計(jì)成員之間進(jìn)行交流和共享,減少硬件電路的設(shè)計(jì)。本系統(tǒng)程序?qū)⒅饕殖梢韵履K:分頻器、隨機(jī)數(shù)生成器、數(shù)碼管譯碼器、點(diǎn)陣顯示器和音樂播放器。1. 分頻器程序代碼如下:DIV_1MS:PROCESS(clk) BEGIN IF(clk39。event and clk=39。139。)THEN IF(temp1=12499)THEN temp1=0。 clk_scan= NOT clk_scan。 ELSE temp1=temp1+1。 END IF。 END IF。 END PROCESS DIV_1MS。 分頻器:由于EDA開發(fā)板的最大時(shí)鐘頻率是25MHZ,通過分頻器產(chǎn)生時(shí)鐘周期1MS的掃描信號(hào)clk_scan;最后我們用掃描信號(hào)來控制數(shù)碼管和點(diǎn)陣的顯示。2. 隨機(jī)數(shù)生成器程序代碼如下:RAND_NUMBER:PROCESS(clk) BEGIN IF(clk39。EVENT AND clk=39。139。)THEN IF(rand1=6)THEN rand1=0。 ELSE rand1=rand1+1。 END IF。 IF(rand_temp=5)THEN rand_temp=0。 IF(rand2=6)THEN rand2=0。 ELSE rand2=rand2+1。 END IF。 ELSE rand_temp=rand_temp+1。 END IF。 END IF。 END PROCESS RAND_NUMBER。隨機(jī)數(shù)生成器:當(dāng)玩家甲按下BTN0時(shí),程序便進(jìn)入游戲狀態(tài),需要生成兩個(gè)在1到6之間的隨機(jī)數(shù)賦給甲的點(diǎn)數(shù)num1_1和num1_2。為了保證游戲的公正性,生成器產(chǎn)生的隨機(jī)數(shù)必須滿足出現(xiàn)概率為1/6。因此,我利用玩家甲按鍵的隨機(jī)性產(chǎn)生1到6的隨機(jī)數(shù),即利用clk的上升沿計(jì)數(shù),便可模擬隨機(jī)數(shù)的產(chǎn)生。程序代碼如下:SEG7_1:PROCESS(a_temp) BEGIN CASE a_temp IS WHEN 0000=b_temp=1111110。0 WHEN 0001=b_temp=0110000。1 WHEN 0010=b_temp=1101101。2 WHEN 0011=b_temp=1111001。3 WHEN 0100=b_temp=0110011。4 WHEN 0101=b_temp=1011011。5 WHEN 0110=b_temp=1011111。6 WHEN 0111=b_temp=1110000。7 WHEN 1000=b_temp=1111111。8 WHEN 1001=b_temp=1111011。9 WHEN OTHERS=b_temp=0000000。 END CASE。 END PROCESS SEG7_1。b=b_temp。數(shù)碼管譯碼器:多個(gè)數(shù)碼管動(dòng)態(tài)掃描顯示,是將所有數(shù)碼管的相同段并聯(lián)在一起,通過選通信號(hào)分時(shí)控制各個(gè)數(shù)碼管的公共端,循環(huán)依次點(diǎn)亮多個(gè)數(shù)碼管,利用人眼的視覺暫留現(xiàn)象,只要掃描頻率大于50HZ,將看不到閃爍現(xiàn)象。當(dāng)閃爍顯示的發(fā)光二極管閃爍頻率較高時(shí),我們將觀察到持續(xù)點(diǎn)亮的現(xiàn)象。同理,當(dāng)多個(gè)數(shù)碼管依次顯示,當(dāng)切換速度足夠快時(shí),我們將觀察到所有數(shù)碼管都在同時(shí)顯示。一個(gè)數(shù)碼管要穩(wěn)定顯示要求頻率大于50HZ,那么6個(gè)數(shù)碼管則需要50*6=300HZ以上才能看到持續(xù)穩(wěn)定點(diǎn)亮的現(xiàn)象。程序代碼如下:SHOW_WINNER:PROCESS(row_temp) BEGIN IF(num2_1 /=0 AND num2_2 /=0 AND btn0_counterbtn1_counter=0) THEN IF(win_name=1) THEN CASE row_temp IS WHEN 01111111 =col_temp=01111100。 WHEN 10111111 =col_temp=01010100。 WHEN 11011111 =col_temp=01111100。 WHEN 11101111 =col_temp=01010100。 WHEN 11110111 =col_temp=01111100。 WHEN 111110