名稱:VIVADO彈球游戲VGA顯示Verilog代碼EGO1開發(fā)板游戲(代碼在文末下載)
軟件:VIVADO
語言: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)未成功接球時(shí),游戲結(jié)束。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在ego1開發(fā)板驗(yàn)證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
工程文件:
程序文件:
程序編譯:
RTL圖:
管腳分配:
部分代碼展示:
`timescale?1ns?/?1ps //產(chǎn)生墻、球和球拍 module?graphic_generator(clk,?rst,?btn,?pixel_x,?pixel_y,?video_on,?rgb,score); ???input????clk,?rst;? ???input????[1:0]?btn;? ???input????[9:0]?pixel_x,?pixel_y;? ???input????video_on;? ??? ???output???[11:0]?rgb;? ???output?[7:0]?score; ???reg??????[11:0]?rgb;? ??? ???wire?????refr_tick;? ??? ???//?refr-tick:?1-clock?tick?asserted?at?st?art?of?v-sync ???//?i.e..?when?the?screen?is?refreshed?(60?Hz) ???assign?refr_tick?=?(pixel_y==481)?&&?(pixel_x==0);? ???//?========================== ???//?object?output?signals ???//?========================== ??? ???wire?wall_on,?paddle_on,?ball_on;? ???wire?[11:0]?wall_rgb,?paddle_rgb,?ball_rgb;? ??? ???always?@?(posedge?clk,?posedge?rst)? ??????if?(rst)? ?????????begin??? ????????????paddle_y_reg?<=?0;? ????????????ball_x_reg???<=?0;? ????????????ball_y_reg???<=?0;? ????????????x_delta_reg??<=?10'h004;? ????????????y_delta_reg??<=?10'h004;? ?????????end ??????else? ?????????begin? ????????????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? ????????? ???//?=============== ???//?墻 ???//?=============== ???assign?wall_on??=?(pixel_x?>=?32)?&&?(pixel_x?<=?35);? ???assign?wall_rgb?=?12'hF00;??//?藍(lán)色 ??? ???//?=============== ???//?球拍 ???//?=============== ??? ???wire?[9:0]?paddle_y_t,?paddle_y_b;? ???//?register?to?track?top?boundary?(x?position?is?fixed)? ???reg?[9:0]?paddle_y_reg,?paddle_y_next;? ???assign?paddle_y_t?=?paddle_y_reg;? ???assign?paddle_y_b?=?paddle_y_t?+?72?-?1;? ??? ???assign?paddle_on??=?(pixel_x?>=?600)?&&?(pixel_x?<=?603)?&&? ???????????????????????(pixel_y?>=?paddle_y_t)?&&?(pixel_y?<=?paddle_y_b);??//bar?top?and?bottom?barriers ???assign?paddle_rgb?=?12'h0F0;?//?綠色 ??? ???//?new?paddle?y-postion? ???always@?(*)? ???begin ??????paddle_y_next?=?paddle_y_reg;? ??????if?(refr_tick) ?????????if?(btn[1]?&?(paddle_y_b?<?(480?-?1?-?4)))?//maxy?-1-?(bar?moving?velocity) ????????????paddle_y_next?=?paddle_y_reg?+?4;??//?move?down? ?????????else?if?(btn[0]?&?(paddle_y_t?>?4)) ????????????paddle_y_next?=?paddle_y_reg?-?4;??//?move?up? ???end? ??? ???//?=============== ???//?球 ???//?=============== ??? ???//?ball?left,?right?boundary? ???wire?[9:0]?ball_x_l,?ball_x_r;? ???//?ball?tob,?bottom?boundary? ???wire?[9:0]?ball_y_t,?ball_y_b;?? ???//?reg?to?track?left?,?top?position ???reg?[9:0]?ball_x_reg?,?ball_y_reg?; ???wire?[9:0]?ball_x_next?,?ball_y_next?;? ???//registers?to?track?ball?speed ???reg?[9:0]?x_delta_reg,?x_delta_next;? ???reg?[9:0]?y_delta_reg,?y_delta_next;? ??? ???//boundary? ???assign?ball_x_l?=?ball_x_reg;? ???assign?ball_y_t?=?ball_y_reg;? ???assign?ball_x_r?=?ball_x_l?+?8?-?1;? ???assign?ball_y_b?=?ball_y_t?+?8?-?1; ??? ???//pixel?within?ball? ???assign?ball_on?=?(pixel_x?>=?ball_x_l)?&&?(pixel_x?<=?ball_x_r)?&&? ????????????????????(pixel_y?>=?ball_y_t)?&&?(pixel_y?<=?ball_y_b);? ???assign?ball_rgb?=?12'hFF0;?//球色為紅綠混合色 ?? ??//?new?ball?position? ???assign?ball_x_next?=?(refr_tick)???ball_x_reg?+?x_delta_reg?:?ball_x_reg;? ???assign?ball_y_next?=?(refr_tick)???ball_y_reg?+?y_delta_reg?:?ball_y_reg;? //???assign?ball_x_next?=?(refr_tick)???ball_x_reg?+?x_delta_reg?:?10'd0;? //???assign?ball_y_next?=?(refr_tick)???ball_y_reg?+?y_delta_reg?:?10'd0;???? ???//?new?ball?velocity? ???always?@?(*)? ???begin? ??????x_delta_next?=?x_delta_reg;? ??????y_delta_next?=?y_delta_reg;? ??????if?(ball_y_t?<?1)?//reach?top? ?????????y_delta_next?=?1;? ??????else?if?(ball_y_b?>?(480?-?1))?//?reach?bottom? ?????????y_delta_next?=?-1;? ??????else?if?(ball_x_l?<=?35)?//?reach?wall? ?????????x_delta_next?=?1;?//bounce?back? ??????else?if?((ball_x_r?>=?600)?&&?(ball_x_r?<=?603)?&& ???????????????(ball_y_b?>=?paddle_y_t)?&&?(ball_y_t?<=?paddle_y_b)) ?????????//?reach?x?of?right?paddle?and?hit,?ball?bounces?back? ?????????x_delta_next?=?-1;? ???????else?if(ball_x_r>=610)begin//end?game ?????????x_delta_next?=?0;???? ?????????y_delta_next?=?0; ?????????end ???end
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=324
閱讀全文