名稱:彈球游戲VGA顯示DE1-SoC開發(fā)板Verilog乒乓球小球游戲(代碼在文末下載)
軟件:Quartus II
語言:Verilog
代碼功能:
彈球游戲:
設(shè)計(jì)一個(gè)彈球游戲,并在VGA顯示器上顯示。
1、可以控制游戲開始,開始時(shí)數(shù)碼管顯示0分。
2、使用按鍵控制球拍的運(yùn)動(dòng),當(dāng)控制球拍接住球時(shí),分?jǐn)?shù)加1。
3、彈球觸碰屏幕邊緣或者球拍時(shí)可以反彈。
4、可以控制小球的移動(dòng)速度和球拍的大小。
4、當(dāng)未成功接球時(shí),游戲結(jié)束。
本代碼已在DE1-SoC開發(fā)板驗(yàn)證,其他開發(fā)板可以修改管腳適配,開發(fā)板如下:
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
部分代碼展示:
//彈球控制游戲 module?vga_controller_top(clk_50M,?rst,?speed_sw,?size_sw,?btn_up,?btn_down,?hsync,?vsync,?VGA_CLK,?VGA_BLANK_N,?HEX1,HEX,?rgb); ???input?????????clk_50M;//時(shí)鐘 ???input?????????rst;//復(fù)位 ???input?[1:0]???speed_sw;//球速控制 ???input?[1:0]???size_sw;//球拍大小控制 ???input?????????btn_up;//上按鍵 ???input?????????btn_down;//下按鍵 ???output????????hsync;//VGA水平同步信號(hào) ???output????????vsync;//VGA垂直同步信號(hào) ???output????????VGA_CLK;//VGA控制時(shí)鐘 ???output????????VGA_BLANK_N;//VGA控制有效信號(hào) ???output?[6:0]??HEX;//數(shù)碼管信號(hào) output?[6:0]??HEX1;//數(shù)碼管信號(hào) ???output?[11:0]?rgb;//RGB信號(hào) ??? ??? ???wire??????????clk; ???wire??????????video_on; ???wire??????????rst_s; ???wire?[9:0]????pixel_x; ???wire?[9:0]????pixel_y; ???wire??????????db_btn_up; ???wire??????????db_btn_down; ??? ???wire?[1:0]????btn_up_dowm; ???wire?[7:0]????score; ???wire??????????hsync_buf; ???wire??????????vsync_buf; ???wire?[11:0]???rgb_buf; ???//信號(hào)輸出 ???assign?hsync?=?hsync_buf; ???assign?vsync?=?vsync_buf; ???assign?rgb?=?rgb_buf; ??? ???assign?clk?=?clk_50M; ??? ???//復(fù)位信號(hào)同步模塊 ???aiso_rst?u0(.clk(clk),?.reset(rst),?.reset_s(rst_s)); ??? ???//VGA時(shí)序控制模塊 ???vga_sync?u1(.clk(clk),?.rst(rst_s),?.VGA_CLK(VGA_CLK),?.VGA_BLANK_N(VGA_BLANK_N),?.hsync(hsync_buf),?.vsync(vsync_buf),?.pixel_x(pixel_x),?.pixel_y(pixel_y),?.video_on(video_on)); ??? ???//按鍵信號(hào)控制模塊 ???debounce?u2(.clk(clk),?.reset(rst_s),?.sw(btn_up),?.db(db_btn_up)); ??? ???//按鍵信號(hào)控制模塊 ???debounce?u3(.clk(clk),?.reset(rst_s),?.sw(btn_down),?.db(db_btn_down)); ???//將上下控制按鍵信號(hào)拼接為一個(gè)2位的信號(hào) ???assign?btn_up_dowm?=?({db_btn_down,?db_btn_up}); ??? ??? ???//調(diào)用圖形控制模塊 ???graphic_generator?u4(.clk(clk),?.rst(rst_s),?.btn(btn_up_dowm),?.pixel_x(pixel_x),?.pixel_y(pixel_y),?.speed_sw(speed_sw),?.size_sw(size_sw),?.video_on(video_on),?.score(score),?.rgb(rgb_buf)); ??? ???//調(diào)用數(shù)碼管顯示模塊 ???display?u5(.score(score),?.HEX(HEX),?.HEX1(HEX1)); ??? endmodule //圖形控制模塊 module?graphic_generator(clk,?rst,?speed_sw,?size_sw,?btn,?pixel_x,?pixel_y,?video_on,?score,?rgb); ??? ???input?????????clk;//時(shí)鐘 ???input?????????rst;//復(fù)位 ??? ???input?[1:0]???speed_sw;//速度控制 ???input?[1:0]???size_sw;//球拍大小控制 ???input?[1:0]???btn;//按鍵 ???input?[9:0]???pixel_x;//x坐標(biāo) ???input?[9:0]???pixel_y;//y坐標(biāo) ???input?????????video_on;//圖像使能信號(hào) ???output?[7:0]??score;//分?jǐn)?shù) ???output?[11:0]?rgb;//RGB信號(hào) ???reg?[11:0]????rgb; ??? ??????//中間信號(hào)定義 ???wire??????????refr_tick; ??? ???wire?[9:0]????paddle_y_t; ???wire?[9:0]????paddle_y_b; ???reg?[9:0]?????paddle_y_reg; ???reg?[9:0]?????paddle_y_next; ??? ???wire?[9:0]????ball_x_l; ???wire?[9:0]????ball_x_r; ???wire?[9:0]????ball_y_t; ???wire?[9:0]????ball_y_b; ???reg?[9:0]?????ball_x_reg; ???reg?[9:0]?????ball_y_reg; ???wire?[9:0]????ball_x_next; ???wire?[9:0]????ball_y_next; ???reg?[9:0]?????x_delta_reg; ???reg?[9:0]?????x_delta_next; ???reg?[9:0]?????y_delta_reg; ???reg?[9:0]?????y_delta_next; ??? ???wire??????????wall_on; ???wire??????????paddle_on; ???wire??????????ball_on; ???wire?[11:0]???wall_rgb; ???wire?[11:0]???paddle_rgb; ???wire?[11:0]???ball_rgb; ??? ???reg???????????hit_on; ???reg???????????hit_on_buf0; ???reg???????????hit_on_buf1; ???reg?[7:0]?????score_buf; ???//y坐標(biāo)481,x坐標(biāo)0 ???assign?refr_tick?=?(((pixel_y?==?10'b0111100001)?&?(pixel_x?==?10'b0000000000)))???1'b1?:? ??????????????????????1'b0; ???assign?score?=?score_buf;//分?jǐn)?shù) ??? ??? ???always?@(posedge?clk?or?posedge?rst) ??????if?(rst?==?1'b1) ??????begin ?????????paddle_y_reg?<=?10'b0000000000; ?????????ball_x_reg?<=?10'b0000000000; ?????????ball_y_reg?<=?10'b0000000000; ?????????x_delta_reg?<=?10'b0000000100; ?????????y_delta_reg?<=?10'b0000000100; ??????end ??????else? ??????begin//D觸發(fā)器緩存信號(hào) ?????????paddle_y_reg?<=?paddle_y_next; ?????????ball_x_reg?<=?ball_x_next; ?????????ball_y_reg?<=?ball_y_next; ?????????x_delta_reg?<=?x_delta_next; ?????????y_delta_reg?<=?y_delta_next; ??????end ???//繪制墻,x坐標(biāo)32到35,4像素,y坐標(biāo)0~480,即左側(cè)一條豎線 ???assign?wall_on?=?(((pixel_x?>=?10'b0000100000)?&?(pixel_x?<=?10'b0000100011)))???1'b1?:? ????????????????????1'b0; ???assign?wall_rgb?=?12'b000000001111;//墻的顏色 ??? ???assign?paddle_y_t?=?paddle_y_reg; ??? //size_sw來控制球拍大?。▂坐標(biāo)) ???assign?paddle_y_b?=?((size_sw?==?2'b00))???paddle_y_t?+?10'b0001100100?:?//100像素 ???????????????????????((size_sw?==?2'b01))???paddle_y_t?+?10'b0001010000?:?//80像素 ???????????????????????((size_sw?==?2'b10))???paddle_y_t?+?10'b0000111100?:?//60像素 ???????????????????????paddle_y_t?+?10'b0000101000;//40像素 ??? //600,603。控制球拍的x,y坐標(biāo),x坐標(biāo)4像素,y坐標(biāo)根據(jù)size_sw控制 ???assign?paddle_on?=?(((pixel_x?>=?10'b1001011000)?&?(pixel_x?<=?10'b1001011011)?&?(pixel_y?>=?paddle_y_t)?&?(pixel_y?<=?paddle_y_b)))???1'b1?:? ??????????????????????1'b0; ??? ???assign?paddle_rgb?=?12'b000011110000;//球拍顏色 ??? ???//按鍵控制球拍 ???always?@(paddle_y_reg?or?refr_tick?or?btn?or?paddle_y_b?or?paddle_y_t) ???begin ??????paddle_y_next?<=?paddle_y_reg; ??????if?(refr_tick?==?1'b1) ??????begin ?????????if?((btn[1])?==?1'b1?&?(paddle_y_b?<?10'b0111011011))//475 ????????????paddle_y_next?<=?paddle_y_reg?+?10'b0000000100;//上升,一次移動(dòng)4像素 ?????????else?if?((btn[0])?==?1'b1?&?(paddle_y_t?>?10'b0000000100))//4 ????????????paddle_y_next?<=?paddle_y_reg?-?10'b0000000100;//下降,一次移動(dòng)4像素 ??????end ???end ???//彈球控制 ???assign?ball_x_l?=?ball_x_reg;//球心坐標(biāo) ???assign?ball_y_t?=?ball_y_reg;//球心坐標(biāo) ???assign?ball_x_r?=?ball_x_l?+?10'b0000001000?-?10'b0000000001;//球外徑坐標(biāo) ???assign?ball_y_b?=?ball_y_t?+?10'b0000001000?-?10'b0000000001;//球外徑坐標(biāo)
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
6. 仿真圖
整體仿真圖
復(fù)位按鍵同步模塊
VGA同步模塊
按鍵同步模塊
產(chǎn)生墻、球和球拍模塊
數(shù)碼管模塊
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=250