基于FPGA乒乓球游戲機Verilog設(shè)計.doc
《基于FPGA乒乓球游戲機Verilog設(shè)計.doc》由會員分享,可在線閱讀,更多相關(guān)《基于FPGA乒乓球游戲機Verilog設(shè)計.doc(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。
基于FPGA乒乓球游戲機Verilog設(shè)計 整理者:G佑咡 江西師范大學(xué) 電子信息工程前言:此類程序鑒于網(wǎng)上大多是VHDL設(shè)計,所以我整理一份Verilog設(shè)計供初學(xué)者參考,因為時間關(guān)系,程序沒有優(yōu)化,也沒有注釋,如有不妥的地方,請大家多提意見。摘 要:本文使用 FPGA 芯片來模擬實際的乒乓球游戲。本設(shè)計是基于 Altera 公司的FPGA Cyclone II 芯片 EP2C5T144C8 的基礎(chǔ)上實現(xiàn),運用 Verilog HDL 語言編程,在 Quartus II 軟件上進行編譯、仿真,最終在開發(fā)板上成功實現(xiàn)下載和調(diào)試。1 乒乓球游戲機系統(tǒng)組成乒乓球比賽游戲機的組成如圖1 所示。比賽規(guī)則約定:五局三勝; 1 分一局; 裁判發(fā)出比賽開始信號,觸發(fā)FPGA 內(nèi)部隨機數(shù)發(fā)生器模塊產(chǎn)生首次發(fā)球權(quán)方;比賽進行中,選手連續(xù)兩次獲得發(fā)球權(quán)后, 發(fā)球權(quán)交予對方,如未獲發(fā)球權(quán)方發(fā)球, 裁判端犯規(guī)音響電路鳴響;6 個LED 排列成行模擬乒乓球臺(因為我的開發(fā)板上只有6個LED燈,比賽開始時候中間兩個燈亮,如果有條件的話有10來個燈最好了); 點亮的LED 模擬乒乓球,受 FPGA 控制從左到右或從右到左移動; 比賽選手通過按鈕輸入模擬擊球信號, 實現(xiàn) LED 移位方向的控制; 若發(fā)亮的LED 運動在球臺中點至對方終點之間時,對方未能及時按下?lián)羟虬粹o使其向相反方向移動, 即失去一分。2 功能模塊設(shè)計圖1 中,基于FPGA 設(shè)計的控制端為整個系統(tǒng)的核心,其內(nèi)部主要由簡易隨機數(shù)發(fā)生器、 發(fā)球權(quán)控制器、 乒乓球位置控制器、 甲乙方計分控制器、 犯規(guī)音響控制器等模塊組成。整個控制端采用模塊化設(shè)計,先用 Verilog 語言編寫功能模塊,然后用頂層原理圖將各功能模塊連接起來。設(shè)計的難點在于協(xié)調(diào)各模塊工作,嚴格遵守各信號間時序關(guān)系。本系統(tǒng)采用50MHz系統(tǒng)時鐘。2. 1 簡易隨機數(shù)發(fā)生器比賽首次發(fā)球權(quán)由隨機數(shù)發(fā)生器產(chǎn)生的數(shù)據(jù)決定,其隨機性要求不嚴, 因此,采用非常簡單的模式產(chǎn)生,即一旦FPGA 上電, 系統(tǒng)時鐘百分頻產(chǎn)生一方波信號square,當(dāng)裁判閉合開始比賽開關(guān)產(chǎn)生 start 信號上升沿時,讀取此時squar e信號值作為隨機數(shù)發(fā)生器輸出data_rand。模塊仿真如圖 2 所示, 結(jié)果滿足設(shè)計要求。此模塊設(shè)計時保證了 square 信號周期應(yīng)遠大于 start 信號上升沿建立時間, 保證隨機數(shù)據(jù)的正確讀取。2. 2 發(fā)球權(quán)控制器發(fā)球權(quán)控制器的控制過程為: 如果按下復(fù)位按鈕,發(fā)球權(quán)數(shù)碼管顯示8, 否則, 開始比賽開關(guān)閉合時, 顯示隨機數(shù)發(fā)生器的值( 0 或 1, 0 代表甲方、 1 代表乙方) 。而在比賽中,為遵守發(fā)球權(quán)交換規(guī)則, 設(shè)計甲乙雙方計分器總和信號sum是不為0 的偶數(shù)時(即計分總次低位變化時) , 發(fā)球權(quán)數(shù)碼管顯示由0變?yōu)? 或由1 變?yōu)?。此模塊設(shè)計中, 發(fā)球權(quán)數(shù)碼管的信號控制受多個時鐘的控制,即開始比賽開關(guān)start 和計分值sum1信號,將兩個信號組合成一個時鐘信號, 并統(tǒng)一兩個時鐘的觸發(fā)沿。因此最佳時鐘觸發(fā)方式如圖3 所示的qq_en信號。為滿足這種時序要求, 借助計分總和次低位 sum_1 信號和啟動信號start設(shè)計qq_en信號。 圖3 pp_en信號產(chǎn)生模塊仿真pp_en信號產(chǎn)生模塊如下:module pp_en(clk,start,sum_1,pp_en,cnt);input clk;input start; /裁判啟動信號input sum_1; /總局數(shù)sum次低位sum1output pp_en;output4:0 cnt; /pp_en信號個數(shù)/-reg sum_1_a,sum_1_b;reg start_a,start_b; reg4:0 cnt_r;always (posedge clk)begin start_a = start; start_b = start_a; sum_1_a = sum_1; sum_1_b = sum_1_a;end/-always (posedge clk)begin if(pp_en) cnt_r = cnt_r+4b1; else cnt_r = cnt_r;end/-assign cnt = cnt_r;assign pp_en = (start_astart_b) | (sum_1_asum_1_b);endmodule根據(jù)pp_en信號和隨機數(shù)data_rand控制甲乙球權(quán)模塊:module pp_possession(clk,reset,data_rand,pp_en,cnt,led_pose);input clk;input reset;input data_rand;input pp_en;input4:0 cnt;output3:0 led_pose; /甲乙球權(quán)輸出,0代表甲,1代表乙。/-reg3:0 led_pose_r;always (posedge clk or negedge reset)begin if(!reset) led_pose_r = 4d8; else if(pp_en) begin if(cnt = 5b1) led_pose_r = 3b0,data_rand; else led_pose_r = !led_pose_r; end else led_pose_r = led_pose_r;endassign led_pose = led_pose_r;endmodule2. 3 乒乓球位置控制、 甲乙計分、 犯規(guī)音響控制乒乓球位置控制電路為 FPGA 控制端的核心, 依據(jù)比賽規(guī)則,采用了Mealy 型狀態(tài)機 10來實現(xiàn),大大降低了設(shè)計難度。狀態(tài)機共定義了7 個狀態(tài), 各狀態(tài)定義如表1 所示,狀態(tài)轉(zhuǎn)換如圖5 所示, 轉(zhuǎn)換條件如表2 所示,具體程序如下。乒乓球游戲機核心控制模塊:module led_con(clk_1s,reset,start,key_a,key_b,led_pose,sum,score_a,score_b,speaker,led);input clk_1s;input reset;input start;input key_a;input key_b;input led_pose;output4:0 sum;output3:0 score_a;output3:0 score_b;output5:0 led;output speaker;reg speaker;/-reg5:0 led_move;reg3:0 score_a_r;reg3:0 score_b_r;reg6:0 state;parameter6:0 s0 = 7b0000001, s1 = 7b0000010, s2 = 7b0000100, s3 = 7b0001000, s4 = 7b0010000, s5 = 7b0100000, s6 = 7b1000000;always (posedge clk_1s or negedge reset)begin if(!reset) state = s0; else if(!start) begincase(state)s0:begin speaker = 1; if(score_a_r = 4d11 | score_b_r = 4d11) beginscore_a_r = 4b0;score_b_r = 4b0; end else if(!led_pose) beginled_move = 6b011111;state = s1; end else if(led_pose) beginled_move = 6b111110;state = s4; endends1:begin if(!key_a)begin led_move = led_move0,led_move5:1; state = s2;end else if(!key_b) begin speaker = 0; state = s0; end else state = s1;ends2:begin if(led_move2 = 0 | led_move1 = 0 | led_move0 = 0) & !key_b)state = s6; else if(led_move2 = 0 | led_move1 = 0) & key_b) |(led_move5 = 0 | led_move4 = 0 | led_move3 = 0) state = s3; else begin score_a_r = score_a_r+1; state = s0; endends3:begin led_move = led_move0,led_move5:1; state = s2;ends4:begin if(!key_b)begin led_move = led_move4:0,led_move5; state = s5;end else if(!key_a) begin speaker = 0; state = s0; end else state = s4;ends5:begin if(led_move3 = 0 | led_move4 = 0 | led_move5 = 0) & !key_a)state = s3; else if(led_move3 = 0 | led_move4 = 0) & key_a) |(led_move0 = 0 | led_move1 = 0 | led_move2 = 0) state = s6; else begin score_b_r = score_b_r+1; state = s0;endends6:begin led_move = led_move4:0,led_move5; state = s5;enddefault:state = s0;endcase end else begin led_move = 6b110011; speaker = 1; endendassign score_a = score_a_r;assign score_b = score_b_r;assign led = led_move;assign sum = score_a_r+score_b_r;endmodule 基于 FPGA乒乓球比賽游戲機頂層原理圖 后記:因為時間關(guān)系,資料沒有整理的很理順,請大家諒解,整個工程會給出,在板子上已調(diào)試成功,因為乒乓球位置控制模塊所用的時鐘為clk_1000ms,所以按鍵停留最好超過1s就能更穩(wěn)的接住球。程序有點亂,沒有優(yōu)化,僅供參考!- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 基于 FPGA 乒乓球 游戲機 Verilog 設(shè)計
鏈接地址:http://italysoccerbets.com/p-6659516.html