• 方案介紹
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

彈球游戲VGA顯示DE1-SoC開發(fā)板Verilog乒乓球小球游戲

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

名稱:彈球游戲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ā)板如下:

VGA_ball_DE1_SoC.png

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. 工程文件

4ba817b0-e4f0-4cc2-aeea-e7b21d4bb7a1.png

2. 程序文件

8830deed-8094-46e0-955c-4bdee320726d.png

3. 程序編譯

475bfd94-3294-4147-a0b2-7b6d1742ea28.png

4. RTL圖

f55fd666-ed04-489a-aadb-f13f3fd4548b.png

6. 仿真圖

整體仿真圖

復(fù)位按鍵同步模塊

VGA同步模塊

按鍵同步模塊

產(chǎn)生墻、球和球拍模塊

數(shù)碼管模塊

點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=250

相關(guān)推薦