From ee117b8c99a7fc733b352fe2eaeb83b43fdfe720 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sun, 10 Jan 2021 20:51:05 +0800 Subject: [PATCH 1/4] fix score number position --- FPGA_FINAL.v | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FPGA_FINAL.v b/FPGA_FINAL.v index 55f0d3b..661c32d 100644 --- a/FPGA_FINAL.v +++ b/FPGA_FINAL.v @@ -323,12 +323,12 @@ module FPGA_FINAL( if(count_digit_enable == 0) begin count_digit_enable = 1; - COM = 2'b10; + COM = 2'b01; end else begin count_digit_enable = 0; - COM = 2'b01; + COM = 2'b10; end end From 954463448811602199e57988f1311357057eeac3 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Mon, 11 Jan 2021 03:38:47 +0800 Subject: [PATCH 2/4] add bonus ball --- FPGA_FINAL.v | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/FPGA_FINAL.v b/FPGA_FINAL.v index 1a06ba0..a5d918c 100644 --- a/FPGA_FINAL.v +++ b/FPGA_FINAL.v @@ -25,7 +25,12 @@ module FPGA_FINAL( reg handsOn; // bool,紀錄球現在丟出去了沒 reg gameOverFlag; - + + reg showBonus; // bool 顯示額外球 + reg [2:0] Bonus_x; // 額外球的位子x + reg [2:0] Bonus_y; // 額外球的位子x + + reg ball_is_on_the_gronud; // 檢查球是否沒被盤子接住 initial begin @@ -47,7 +52,9 @@ module FPGA_FINAL( horizonPosition = 0; // 預設為 正中間方向 gameOverFlag = 0; - + + showBonus = 0; + ball_is_on_the_gronud = 0; end @@ -59,6 +66,7 @@ module FPGA_FINAL( integer ballTime; + integer doubleTime; // 判斷 所有操作 always @(posedge buttonclk) begin @@ -86,6 +94,8 @@ module FPGA_FINAL( upPosition = 1; // 預設為 向上 horizonPosition = 0; // 預設為 正中間方向 + showBonus = 0; + ball_is_on_the_gronud = 0; end @@ -116,7 +126,7 @@ module FPGA_FINAL( - // 下方操作球的運行 + // 下方操作球的運 行 // 除頻用 if(ballTime<2) ballTime <= ballTime+1; @@ -196,6 +206,8 @@ module FPGA_FINAL( begin horizonPosition = 0; ball_y_position <= ball_y_position-1; + showBonus = 0; + ball_is_on_the_gronud = 1; life = life*2; // 扣除生命值 if(life==3'b000) @@ -252,6 +264,57 @@ module FPGA_FINAL( end end end + + // Bonus ball 除頻 , 每五秒從左邊射一發 + if(doubleTime<50 && showBonus == 0 && handsOn == 0 && ball_is_on_the_gronud == 0) + begin + doubleTime <= doubleTime+1; + Bonus_x = plat_position ; + Bonus_y = 1; + end + else + begin + if(handsOn == 0) + begin + doubleTime <= 0; + showBonus = 1; + if(Bonus_y == 7) + begin + showBonus = 0; + end + if(Bonus_y < 7) + begin + Bonus_y = Bonus_y + 1; + end + + // Bonus ball 撞到第一排磚塊 + if((Bonus_y == 6 && blockSecond[Bonus_x] == 1)) + begin + count_digit <= count_digit + 1'b1; + if(count_digit == 4'b1001) + begin + count_digit <= 4'b0; + count_ten = 1; + end + blockSecond[Bonus_x] = 0; + showBonus = 0; + end + + // Bonus ball 撞到第二排磚塊 + if((Bonus_y == 7 && blockFirst[Bonus_x] == 1)) + begin + count_digit <= count_digit + 1'b1; + if(count_digit == 4'b1001) + begin + count_digit <= 4'b0; + count_ten = 1; + end + blockFirst[Bonus_x] = 0; + showBonus = 0; + end + end + // Bonus ball + end end end @@ -319,6 +382,24 @@ module FPGA_FINAL( //開始畫磚塊 led[16:23] = {~blockFirst[row], ~blockSecond[row], 6'b111111}; + // 畫 Bonus ball + if(showBonus == 1) + if(row==Bonus_x) + begin + reg [7:0] map; + case(Bonus_y) + 3'b000: map = 8'b11111110 ; + 3'b001: map = 8'b11111101 ; + 3'b010: map = 8'b11111011 ; + 3'b011: map = 8'b11110111 ; + 3'b100: map = 8'b11101111 ; + 3'b101: map = 8'b11011111 ; + 3'b110: map = 8'b10111111 ; + 3'b111: map = 8'b01111111 ; + endcase + led[8:15] = map; + end + // 顯示分數 if(count_digit_enable == 0) begin From b8a5d93c7688f6f1d9c8739ea2df6b553f58ffa0 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Mon, 11 Jan 2021 03:53:29 +0800 Subject: [PATCH 3/4] Let digit of ten can show decimal number --- FPGA_FINAL.v | 71 +++++++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/FPGA_FINAL.v b/FPGA_FINAL.v index a5d918c..a52c9b3 100644 --- a/FPGA_FINAL.v +++ b/FPGA_FINAL.v @@ -27,10 +27,8 @@ module FPGA_FINAL( reg gameOverFlag; reg showBonus; // bool 顯示額外球 - reg [2:0] Bonus_x; // 額外球的位子x - reg [2:0] Bonus_y; // 額外球的位子x - - reg ball_is_on_the_gronud; // 檢查球是否沒被盤子接住 + reg Bonus_x, Bonus_y; // 額外球的位子 + initial begin @@ -54,7 +52,7 @@ module FPGA_FINAL( gameOverFlag = 0; showBonus = 0; - ball_is_on_the_gronud = 0; + end @@ -95,7 +93,6 @@ module FPGA_FINAL( horizonPosition = 0; // 預設為 正中間方向 showBonus = 0; - ball_is_on_the_gronud = 0; end @@ -206,8 +203,6 @@ module FPGA_FINAL( begin horizonPosition = 0; ball_y_position <= ball_y_position-1; - showBonus = 0; - ball_is_on_the_gronud = 1; life = life*2; // 扣除生命值 if(life==3'b000) @@ -265,28 +260,17 @@ module FPGA_FINAL( end end - // Bonus ball 除頻 , 每五秒從左邊射一發 - if(doubleTime<50 && showBonus == 0 && handsOn == 0 && ball_is_on_the_gronud == 0) - begin + // + if(doubleTime<200 && showBonus == 0 && handsOn == 0) doubleTime <= doubleTime+1; - Bonus_x = plat_position ; - Bonus_y = 1; - end else begin if(handsOn == 0) begin doubleTime <= 0; showBonus = 1; - if(Bonus_y == 7) - begin - showBonus = 0; - end - if(Bonus_y < 7) - begin - Bonus_y = Bonus_y + 1; - end - + Bonus_x = plat_position + 1; + Bonus_y = 1; // Bonus ball 撞到第一排磚塊 if((Bonus_y == 6 && blockSecond[Bonus_x] == 1)) begin @@ -299,21 +283,21 @@ module FPGA_FINAL( blockSecond[Bonus_x] = 0; showBonus = 0; end - - // Bonus ball 撞到第二排磚塊 - if((Bonus_y == 7 && blockFirst[Bonus_x] == 1)) - begin - count_digit <= count_digit + 1'b1; - if(count_digit == 4'b1001) - begin - count_digit <= 4'b0; - count_ten = 1; - end - blockFirst[Bonus_x] = 0; - showBonus = 0; - end end - // Bonus ball + // Bonus ball 撞到第二排磚塊 + if((Bonus_y == 7 && blockFirst[Bonus_x] == 1)) + begin + count_digit <= count_digit + 1'b1; + if(count_digit == 4'b1001) + begin + count_digit <= 4'b0; + count_ten = 1; + end + blockSecond[Bonus_x] = 0; + showBonus = 0; + end + else + Bonus_y <= Bonus_y + 1; end end end @@ -378,16 +362,13 @@ module FPGA_FINAL( end else led[8:15] = 8'b11111111; - - //開始畫磚塊 - led[16:23] = {~blockFirst[row], ~blockSecond[row], 6'b111111}; - + // 畫 Bonus ball if(showBonus == 1) if(row==Bonus_x) begin reg [7:0] map; - case(Bonus_y) + case(ball_y_position) 3'b000: map = 8'b11111110 ; 3'b001: map = 8'b11111101 ; 3'b010: map = 8'b11111011 ; @@ -397,9 +378,13 @@ module FPGA_FINAL( 3'b110: map = 8'b10111111 ; 3'b111: map = 8'b01111111 ; endcase - led[8:15] = map; + led[0:7] = map; + led[16:23] = map; end + //開始畫磚塊 + led[16:23] = {~blockFirst[row], ~blockSecond[row], 6'b111111}; + // 顯示分數 if(count_digit_enable == 0) begin From 0e8f3d3ab0139a9ba3b4e86cc6a7d7a96b7af2d6 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Mon, 11 Jan 2021 21:33:26 +0800 Subject: [PATCH 4/4] Optionaly select 1 or 2 row brick ( After first gameover ) --- FPGA_FINAL.v | 105 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/FPGA_FINAL.v b/FPGA_FINAL.v index a52c9b3..43dc533 100644 --- a/FPGA_FINAL.v +++ b/FPGA_FINAL.v @@ -5,20 +5,21 @@ module FPGA_FINAL( output reg [2:0] life, input left, right, input throw, + input show_two_row, output testLED, output reg a,b,c,d,e,f,g, output reg [0:1] COM ); reg [7:0]blockFirst = 8'b11111111; - reg [7:0]blockSecond = 8'b11111111; + reg [7:0]blockSecond = 8'b00000000; reg [2:0]plat_position; // 板子位置 reg [2:0]ball_position; // 球 位置 reg [2:0]ball_y_position; // 球 y 座標 - reg [3:0]count_digit; //個位數分數 - reg count_ten; //十位數分數 + reg [3:0]count_digit = 4'b000; //個位數分數 + reg [3:0]count_ten = 4'b0000; //十位數分數 reg upPosition; integer horizonPosition; @@ -27,8 +28,10 @@ module FPGA_FINAL( reg gameOverFlag; reg showBonus; // bool 顯示額外球 - reg Bonus_x, Bonus_y; // 額外球的位子 - + reg [2:0] Bonus_x; // 額外球的位子x + reg [2:0] Bonus_y; // 額外球的位子x + + reg ball_is_on_the_gronud; // 檢查球是否沒被盤子接住 initial begin @@ -44,7 +47,7 @@ module FPGA_FINAL( ball_y_position = 3'b010; // 預設在 y=1 的位置 handsOn = 1; // 預設為 為丟出狀態 count_digit = 4'b0; // 分數預設0 - count_ten = 0; + count_ten = 4'b0; upPosition = 1; // 預設為 向上 horizonPosition = 0; // 預設為 正中間方向 @@ -52,7 +55,7 @@ module FPGA_FINAL( gameOverFlag = 0; showBonus = 0; - + ball_is_on_the_gronud = 0; end @@ -71,19 +74,21 @@ module FPGA_FINAL( if(start) begin - if(reset) begin if(life==3'b000) begin blockFirst = 8'b11111111; - blockSecond = 8'b11111111; + if(show_two_row) + blockSecond = 8'b11111111; + else + blockSecond = 8'b00000000; life = 3'b111; gameOverFlag = 0; - + end - + plat_position <= 3'b010; // 預設在 x=2 的位置 ball_position <= 3'b011; // 預設在 x=3 的位置 ball_y_position <= 3'b010; // 預設在 y=1 的位置 @@ -93,6 +98,8 @@ module FPGA_FINAL( horizonPosition = 0; // 預設為 正中間方向 showBonus = 0; + ball_is_on_the_gronud = 0; + end @@ -203,6 +210,8 @@ module FPGA_FINAL( begin horizonPosition = 0; ball_y_position <= ball_y_position-1; + showBonus = 0; + ball_is_on_the_gronud = 1; life = life*2; // 扣除生命值 if(life==3'b000) @@ -221,7 +230,7 @@ module FPGA_FINAL( if(count_digit == 4'b1001) begin count_digit <= 4'b0; - count_ten = 1; + count_ten = count_ten + 1'b1; end blockSecond[ball_position] = 0; @@ -245,7 +254,7 @@ module FPGA_FINAL( if(count_digit == 4'b1001) begin count_digit <= 4'b0; - count_ten = 1; + count_ten = count_ten + 1'b1; end blockFirst[ball_position] = 0; @@ -260,17 +269,28 @@ module FPGA_FINAL( end end - // - if(doubleTime<200 && showBonus == 0 && handsOn == 0) + // Bonus ball 除頻 , 每五秒從左邊射一發 + if(doubleTime<50 && showBonus == 0 && handsOn == 0 && ball_is_on_the_gronud == 0) + begin doubleTime <= doubleTime+1; + Bonus_x = plat_position ; + Bonus_y = 1; + end else begin if(handsOn == 0) begin doubleTime <= 0; showBonus = 1; - Bonus_x = plat_position + 1; - Bonus_y = 1; + if(Bonus_y == 7) + begin + showBonus = 0; + end + if(Bonus_y < 7) + begin + Bonus_y = Bonus_y + 1; + end + // Bonus ball 撞到第一排磚塊 if((Bonus_y == 6 && blockSecond[Bonus_x] == 1)) begin @@ -278,26 +298,26 @@ module FPGA_FINAL( if(count_digit == 4'b1001) begin count_digit <= 4'b0; - count_ten = 1; + count_ten = count_ten + 1'b1; end blockSecond[Bonus_x] = 0; showBonus = 0; end - end - // Bonus ball 撞到第二排磚塊 - if((Bonus_y == 7 && blockFirst[Bonus_x] == 1)) - begin - count_digit <= count_digit + 1'b1; - if(count_digit == 4'b1001) + + // Bonus ball 撞到第二排磚塊 + if((Bonus_y == 7 && blockFirst[Bonus_x] == 1)) begin - count_digit <= 4'b0; - count_ten = 1; + count_digit <= count_digit + 1'b1; + if(count_digit == 4'b1001) + begin + count_digit <= 4'b0; + count_ten = count_ten + 1'b1; + end + blockFirst[Bonus_x] = 0; + showBonus = 0; end - blockSecond[Bonus_x] = 0; - showBonus = 0; end - else - Bonus_y <= Bonus_y + 1; + // Bonus ball end end end @@ -362,13 +382,16 @@ module FPGA_FINAL( end else led[8:15] = 8'b11111111; - + + //開始畫磚塊 + led[16:23] = {~blockFirst[row], ~blockSecond[row], 6'b111111}; + // 畫 Bonus ball if(showBonus == 1) if(row==Bonus_x) begin reg [7:0] map; - case(ball_y_position) + case(Bonus_y) 3'b000: map = 8'b11111110 ; 3'b001: map = 8'b11111101 ; 3'b010: map = 8'b11111011 ; @@ -378,13 +401,9 @@ module FPGA_FINAL( 3'b110: map = 8'b10111111 ; 3'b111: map = 8'b01111111 ; endcase - led[0:7] = map; - led[16:23] = map; + led[8:15] = map; end - //開始畫磚塊 - led[16:23] = {~blockFirst[row], ~blockSecond[row], 6'b111111}; - // 顯示分數 if(count_digit_enable == 0) begin @@ -419,8 +438,16 @@ module FPGA_FINAL( else begin case(count_ten) - 1'b0:{a,b,c,d,e,f,g}=7'b0000001; - 1'b1:{a,b,c,d,e,f,g}=7'b1001111; + 4'b0000:{a,b,c,d,e,f,g}=7'b0000001; + 4'b0001:{a,b,c,d,e,f,g}=7'b1001111; + 4'b0010:{a,b,c,d,e,f,g}=7'b0010010; + 4'b0011:{a,b,c,d,e,f,g}=7'b0000110; + 4'b0100:{a,b,c,d,e,f,g}=7'b1001100; + 4'b0101:{a,b,c,d,e,f,g}=7'b0100100; + 4'b0110:{a,b,c,d,e,f,g}=7'b0100000; + 4'b0111:{a,b,c,d,e,f,g}=7'b0001111; + 4'b1000:{a,b,c,d,e,f,g}=7'b0000000; + 4'b1001:{a,b,c,d,e,f,g}=7'b0000100; endcase end end