# VGA Display Minesweeper Game A 10x10 minesweeper game written by verilog [Toc] ## Architecture ![](https://i.imgur.com/C5tCBth.png) ## Top Module ```verilog= module mine_game( input clk, input rst, /* Keyboard input */ input ps2_clk, input ps2_data, /* VGA display */ output hsync, output vsync, output [3:0] red, output [3:0] green, output [3:0] blue, /* Seven segment display */ output [6:0] hundreds, output [6:0] tens, output [6:0] units, /* Dot matrix display */ output [7:0] dot_row, output [7:0] dot_col ); /* VGA Clock */ wire clk_25M; /* Matrix Clock */ wire clk_matrix; /* Timer Clock */ wire clk_1; /* pointer_x: A unsigned integer indicate the pointer's x position pointer_y: A unsigned integer indicate the pointer's y position click: 1 bit contain button status. */ wire [3:0] pointer_x; wire [3:0] pointer_y; wire click; /* game_map: This variable contains 10x10 blocks' current status. |empty|open|bomb|n[2]|n[1]|n[0]| block_position: Passing the index of map block_data: Return the map data in 'block_position' index. game_over: 1 for game_over */ wire [6:0] block_position; wire [5:0] block_data; wire game_over; clk_div #(0) u0(clk, clk_25M); clk_div #(16667) u1(clk, clk_matrix); clk_div #(25000000) u2(clk, clk_1); keyboard_driver (ps2_clk, ps2_data, rst, pointer_x, pointer_y, click); seven_driver (clk_1, rst, game_over, hundreds, tens, units); mine_logic (rst, pointer_x, pointer_y, click, block_position, block_data, game_over); vga_driver (clk_25M, rst, pointer_x, pointer_y, block_position, block_data, hsync, vsync, red, green, blue); matrix_driver (clk_matrix, rst, game_over, dot_row, dot_col); endmodule ``` ## Clock divider ```verilog= module clk_div #(parameter div = 0) ( input clk, output reg clk_out ); reg [31:0] counter; always @(posedge clk) begin if (counter == div) begin clk_out <= ~clk_out; counter <= 0; end else begin counter <= counter + 1; end end endmodule ``` ## PS/2 Keyboard 接入 PS/2 鍵盤,在上下左右與空白被按下時計算現在位置並輸出 x y position 與 click ```verilog= module keyboard_driver( input clk, input data, input rst, output [3:0] ox, output [3:0] oy, output reg click ); reg [4:0] byte_count; reg [7:0] keycode; reg [4:0] x; reg [4:0] y; reg complete; assign ox = x >> 2; assign oy = y >> 2; always @(posedge clk or negedge rst) begin if (~rst) begin byte_count <= 0; x <= 0; y <= 0; click <= 0; complete <= 0; end else begin if (byte_count <= 10) byte_count <= byte_count + 1; else byte_count <= 0; if (byte_count == 0) keycode <= 0; else if (byte_count == 1) keycode[0] <= data; else if (byte_count == 2) keycode[1] <= data; else if (byte_count == 3) keycode[2] <= data; else if (byte_count == 4) keycode[3] <= data; else if (byte_count == 5) keycode[4] <= data; else if (byte_count == 6) keycode[5] <= data; else if (byte_count == 7) keycode[6] <= data; else if (byte_count == 8) keycode[7] <= data; else if (byte_count == 9) complete <= 1; else begin complete <= 0; keycode <= 0; byte_count <= 0; click <= 0; end if (complete && keycode == 8'd41) begin click <= 1; end else if (complete && keycode == 8'd117) begin if (y == 0) y <= 0; else y <= y - 1; end else if (complete && keycode == 8'd114) begin if (y == 18) y <= 18; else y <= y + 1; end else if (complete && keycode == 8'd107) begin if (x == 0) x <= 0; else x <= x - 1; end else if (complete && keycode == 8'd116) begin if (x == 18) x <= 18; else x <= x + 1; end else begin x <= x; y <= y; end end end endmodule ``` ## Mouse Driver (deprecated) ```verilog= module mouse_driver( input clk, input rst, input data, output reg [9:0] x, output reg [9:0] y, output reg click ); /* Internal buffer for data recevicing */ reg complete; reg [4:0] byte_count; reg x_ov; reg y_ov; reg internal_click; reg signed [8:0] internal_x; reg signed [8:0] internal_y; always @(negedge clk or negedge rst) begin if (~rst) begin byte_count <= 0; end else begin if (byte_count == 0) y_ov <= data; else if (byte_count == 1) x_ov <= data; else if (byte_count == 2) internal_y[8] <= data; else if (byte_count == 3) internal_x[8] <= data; else if (byte_count == 6) internal_click <= data; else if (byte_count == 8) internal_x[7] <= data; else if (byte_count == 9) internal_x[6] <= data; else if (byte_count == 10) internal_x[5] <= data; else if (byte_count == 11) internal_x[4] <= data; else if (byte_count == 12) internal_x[3] <= data; else if (byte_count == 13) internal_x[2] <= data; else if (byte_count == 14) internal_x[1] <= data; else if (byte_count == 15) internal_x[0] <= data; else if (byte_count == 16) internal_y[7] <= data; else if (byte_count == 17) internal_y[6] <= data; else if (byte_count == 18) internal_y[5] <= data; else if (byte_count == 19) internal_y[4] <= data; else if (byte_count == 20) internal_y[3] <= data; else if (byte_count == 21) internal_y[2] <= data; else if (byte_count == 22) internal_y[1] <= data; else internal_y[0] <= data; if (byte_count == 23) begin byte_count <= 0; complete <= 1; end else begin byte_count <= byte_count + 1; complete <= 0; end end end always @(posedge complete) begin if (x_ov) begin if (x <= 255 && internal_x[8] == 1) begin x <= 0; end else if (x + 255 >= 639 && internal_x[8] == 0) begin x <= 639; end else if (internal_x[8] == 1) begin x <= x - 255; end else begin x <= x + 255; end end else begin if (internal_x < 0 && x < -internal_x) begin x <= 0; end else if (internal_x > 0 && x + internal_x >= 639) begin x <= 639; end else begin x <= x + internal_x; end end if (y_ov) begin if (y <= 255 && internal_y[8] == 1) begin y <= 0; end else if (y + 255 >= 479 && internal_y[8] == 0) begin y <= 479; end else if (internal_x[8] == 1) begin y <= y - 255; end else begin y <= y + 255; end end else begin if (internal_y < 0 && y < -internal_y) begin y <= 0; end else if (internal_y > 0 && y + internal_y >= 479) begin y <= 479; end else begin y <= y + internal_y; end end end endmodule ``` ## Keypad (deprecated) ```verilog= module keypad_driver( input keypadcol, input click_i,//button input rst, output reg [3:0]keypadrow, output reg [9:0] x, output reg [9:0] y, output reg click_o ); always @(negedge rst) begin if (~rst) begin x <= 0; y <= 0; click_o <= 0; end else begin case(keypadcol) begin 4'b0111 : x <= x - 1; 4'b1011 : y <= y - 1; 4'b1101 : y <= y + 1; 4'b1110 : x <= x + 1; end case(click_i) begin 0 : click_o <= 0; 1 : click_o <= 1; end end end endmodule ``` ## Mine Logic click 訊號 Posedge 時使用 x y 值來打開方塊 內部需要有一個 game_over flag,按到炸彈時寫為 1 同時停止處理滑鼠點擊 地圖(Python): ``` [.1 .1 11 -1 -1 21 .2 .2 .2 .2] [11 11 12 2 2 21 21 .2 .2 .2] [ 2 -1 3 1 2 -1 21 .2 .2 .2] [ 3 -1 3 -1 2 1 21 21 21 21] [-1 3 32 31 32 1 1 1 -1 1] [-1 3 31 .3 31 -1 31 31 31 31] [ 3 -1 31 .3 31 31 31 .3 .3 .3] [-1 3 31 .3 .3 .3 .3 .3 .3 .3] [-1 3 31 .3 .3 .3 .3 .3 .3 .3] [ 2 -1 31 .3 .3 .3 .3 .3 .3 .3] ``` 地圖(Verilog): ```verilog! map[0] <= 8'b01100001; map[1] <= 8'b01100001; map[2] <= 8'b01000001; map[3] <= 8'b00001000; map[4] <= 8'b00001000; map[5] <= 8'b10000001; map[6] <= 8'b10100010; map[7] <= 8'b10100010; map[8] <= 8'b10100010; map[9] <= 8'b10100010; map[10] <= 8'b01000001; map[11] <= 8'b01000001; map[12] <= 8'b01000010; map[13] <= 8'b00000010; map[14] <= 8'b00000010; map[15] <= 8'b10000001; map[16] <= 8'b10000001; map[17] <= 8'b10100010; map[18] <= 8'b10100010; map[19] <= 8'b10100010; map[20] <= 8'b00000010; map[21] <= 8'b00001000; map[22] <= 8'b00000011; map[23] <= 8'b00000001; map[24] <= 8'b00000010; map[25] <= 8'b00001000; map[26] <= 8'b10000001; map[27] <= 8'b10100010; map[28] <= 8'b10100010; map[29] <= 8'b10100010; map[30] <= 8'b00000011; map[31] <= 8'b00001000; map[32] <= 8'b00000011; map[33] <= 8'b00001000; map[34] <= 8'b00000010; map[35] <= 8'b00000001; map[36] <= 8'b10000001; map[37] <= 8'b10000001; map[38] <= 8'b10000001; map[39] <= 8'b10000001; map[40] <= 8'b00001000; map[41] <= 8'b00000011; map[42] <= 8'b11000010; map[43] <= 8'b11000001; map[44] <= 8'b11000010; map[45] <= 8'b00000001; map[46] <= 8'b00000001; map[47] <= 8'b00000001; map[48] <= 8'b00001000; map[49] <= 8'b00000001; map[50] <= 8'b00001000; map[51] <= 8'b00000011; map[52] <= 8'b11000001; map[53] <= 8'b11100011; map[54] <= 8'b11000001; map[55] <= 8'b00001000; map[56] <= 8'b11000001; map[57] <= 8'b11000001; map[58] <= 8'b11000001; map[59] <= 8'b11000001; map[60] <= 8'b00000011; map[61] <= 8'b00001000; map[62] <= 8'b11000001; map[63] <= 8'b11100011; map[64] <= 8'b11000001; map[65] <= 8'b11000001; map[66] <= 8'b11000001; map[67] <= 8'b11100011; map[68] <= 8'b11100011; map[69] <= 8'b11100011; map[70] <= 8'b00001000; map[71] <= 8'b00000011; map[72] <= 8'b11000001; map[73] <= 8'b11100011; map[74] <= 8'b11100011; map[75] <= 8'b11100011; map[76] <= 8'b11100011; map[77] <= 8'b11100011; map[78] <= 8'b11100011; map[79] <= 8'b11100011; map[80] <= 8'b00001000; map[81] <= 8'b00000011; map[82] <= 8'b11000001; map[83] <= 8'b11100011; map[84] <= 8'b11100011; map[85] <= 8'b11100011; map[86] <= 8'b11100011; map[87] <= 8'b11100011; map[88] <= 8'b11100011; map[89] <= 8'b11100011; map[90] <= 8'b00000010; map[91] <= 8'b00001000; map[92] <= 8'b11000001; map[93] <= 8'b11100011; map[94] <= 8'b11100011; map[95] <= 8'b11100011; map[96] <= 8'b11100011; map[97] <= 8'b11100011; map[98] <= 8'b11100011; map[99] <= 8'b11100011; ``` ```verilog= module mine_logic( input rst, input [3:0] position_x, input [3:0] position_y, input click, /* |empty|open|bomb|n[2]|n[1]|n[0]| */ input [6:0] block_position, output [5:0] block_data, output reg game_over ); reg [5:0] map[0:99]; reg [7:0] i; wire [6:0] position; wire [5:0] click_block; wire [6:0] adj_0; wire [6:0] adj_1; wire [6:0] adj_2; wire [6:0] adj_3; wire [6:0] adj_5; wire [6:0] adj_6; wire [6:0] adj_7; wire [6:0] adj_8; assign block_data = map[block_position]; assign position = position_y * 10 + position_x; assign click_block = map[position]; /* | adj_0 | adj_1 | adj_2 | | adj_3 | block | adj_5 | | adj_6 | adj_7 | adj_8 | */ assign adj_0 = (position_y >= 1 ? position_y - 1 : 0) * 10 + (position_x >= 1 ? position_x - 1 : 0); assign adj_1 = (position_y >= 1 ? position_y - 1 : 0) * 10 + position_x; assign adj_2 = (position_y >= 1 ? position_y - 1 : 0) * 10 + (position_x <= 8 ? position_x + 1 : 9); assign adj_3 = position_y * 10 + (position_x >= 1 ? position_x - 1 : 0); assign adj_5 = position_y * 10 + (position_x <= 8 ? position_x + 1 : 9); assign adj_6 = (position_y <= 8 ? position_y + 1 : 9) * 10 + (position_x >= 1 ? position_x - 1 : 0); assign adj_7 = (position_y <= 8 ? position_y + 1 : 9) * 10 + position_x; assign adj_8 = (position_y <= 8 ? position_y + 1 : 9) * 10 + (position_x <= 8 ? position_x + 1 : 9); always @(posedge click or negedge rst) begin if (~rst) begin game_over <= 0; end else begin // click and judge is open // block is not empty and block is not bomb if((click_block & 6'b101000) == 6'b000000) begin map[position] <= map[position] | 6'b010000; // open this block // block is empty end else if ((click_block & 6'b100000) == 6'b100000) begin for (i = 0; i < 100; i = i + 1) begin if ( // block is empty and adjacent to click_block ((map[i] & 6'b100000) == 6'b100000 && (map[i] & 3'b111) == (click_block & 3'b111)) || // block is not empty but adjacent to click_block (map[i] & 6'b101000) == 6'b000000 && ( (map[adj_0] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_1] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_2] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_3] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_5] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_6] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_7] & 6'b101111) == (map[i] & 6'b101111) || (map[adj_8] & 6'b101111) == (map[i] & 6'b101111) ) ) begin map[i] <= map[i] | 6'b010000; end else begin // do nothing map[i] <= map[i]; end end // block is bomb end else if ((click_block & 6'b001000) == 6'b001000) begin game_over <= 1; end end end endmodule ``` ## Seven Display ```verilog= module seven_driver( input clk, input rst, input game_over, output [6:0] hundreds, output [6:0] tens, output [6:0] units ); reg [9:0] count; wire [3:0] display_100; wire [3:0] display_10; wire [3:0] display_1; assign display_100 = (count / 100) % 10; assign display_10 = (count / 10) % 10; assign display_1 = count % 10; seven_display(display_100, hundreds); seven_display(display_10, tens); seven_display(display_1, units); always @(posedge clk or negedge rst) begin if(~rst) begin count <= 0; end else begin if (game_over) begin count <= count; end else begin count <= count + 1; end end end endmodule module seven_display( input [3:0] value, output reg [6:0] out ); always @(value) begin case(value) 0: out <= 7'b1000000; 1: out <= 7'b1111001; 2: out <= 7'b0100100; 3: out <= 7'b0110000; 4: out <= 7'b0011001; 5: out <= 7'b0010010; 6: out <= 7'b0000010; 7: out <= 7'b1111000; 8: out <= 7'b0000000; 9: out <= 7'b0010000; 10: out <= 7'b0001000; 11: out <= 7'b0000011; 12: out <= 7'b1000110; 13: out <= 7'b0100001; 14: out <= 7'b0000110; 15: out <= 7'b0001110; endcase end endmodule ``` ## Matrix Display ```verilog= module matrix_driver( input clk, input rst, input game_over, output reg [7:0] dot_row, output reg [7:0] dot_col ); reg [2:0] row_count; always @(posedge clk or negedge rst) begin if(~rst) begin dot_row <= 8'b11111111; dot_col <= 8'b00000000; row_count <= 3'd0; end else begin row_count <= row_count + 1; case (row_count) 3'd0 : dot_row <= 8'b01111111; 3'd1 : dot_row <= 8'b10111111; 3'd2 : dot_row <= 8'b11011111; 3'd3 : dot_row <= 8'b11101111; 3'd4 : dot_row <= 8'b11110111; 3'd5 : dot_row <= 8'b11111011; 3'd6 : dot_row <= 8'b11111101; 3'd7 : dot_row <= 8'b11111110; endcase if (~game_over) begin row_count <= 8'b00000000; end else begin case (row_count) 3'd0 : dot_col <= 8'b10000001; 3'd1 : dot_col <= 8'b01000010; 3'd2 : dot_col <= 8'b00100100; 3'd3 : dot_col <= 8'b00011000; 3'd4 : dot_col <= 8'b00011000; 3'd5 : dot_col <= 8'b00100100; 3'd6 : dot_col <= 8'b01000010; 3'd7 : dot_col <= 8'b10000001; endcase end end end endmodule ``` ## VGA Display ![](https://i.imgur.com/TUnDSTu.png) ```verilog= module vga_driver( input clk, input rst, input [3:0] x, input [3:0] y, input [5:0] block_data, output [9:0] block_position, output hsync, output vsync, output [3:0] red, output [3:0] green, output [3:0] blue, ); wire [9:0] h_counter; wire [9:0] v_counter; wire [3:0] internal_red; wire [3:0] internal_green; wire [3:0] internal_blue; assign hsync = (h_counter < 92) ? 1'b1 : 1'b0; assign vsync = (v_counter < 2) ? 1'b1 : 1'b0; assign active = 143 < h_counter && h_counter < 784 && 34 < v_counter && v_counter < 515; assign red = active ? internal_red : 4'h0; assign green = active ? internal_green : 4'h0; assign blue = active ? internal_blue : 4'h0; sync_counter (clk, rst, h_counter, v_counter); color_control (h_counter, v_counter, x, y, block_data, block_position, internal_red, internal_green, internal_blue); endmodule module sync_counter( input clk, input rst, output reg [9:0] h_counter; output reg [9:0] v_counter; ); always @(posedge clk or negedge rst) begin if (~rst) begin h_counter <= 0; v_counter <= 0; end else begin if (h_counter <= 799) begin h_counter <= h_counter + 1; end else begin h_counter <= 0; end if (v_counter <= 524) begin if (h_counter == 0) begin v_counter <= v_counter + 1; end else begin v_counter <= v_counter; end end else begin v_counter <= 0; end end end endmodule module color_control( input [9:0] h_counter, input [9:0] v_counter, input [3:0] x, input [3:0] y, input [5:0] block_data, output [9:0] block_position, output reg [3:0] red, output reg [3:0] green, output reg [3:0] blue ); wire [3:0] row_coor, col_coor; wire [5:0] i_val, j_val; /* color: 0: white 1: black 2: gray */ reg [1:0] color; reg [2:0] block_type; assign col_coor = (h_counter - 144) / 64; assign row_coor = (v_counter - 35) / 48; assign block_position = row_coor * 10 + col_coor; assign j_val = (h_counter - 144) % 64; assign i_val = (v_counter - 35) % 48; always @(*) begin if(col_coor >= 10 || row_coor >= 10) begin color <= 2; end else begin block_type <= block_data & 6'b000111; case(block_type) 4'd0: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color <= 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color <= 1; else color <= 2; end 4'd1: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color <= 1; else if(11 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color <= 1; else color <= 2; end 4'd2: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color <= 1; else if(7 <= i_val && i_val <= 10 && 27 <= j_val && j_val <= 38) color <= 1; else if(11 <= i_val && i_val <= 22 && 39 <= j_val && j_val <= 42) color <= 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color <= 1; else if(27 <= i_val && i_val <= 38 && 23 <= j_val && j_val <= 26) color <= 1; else if(39 <= i_val && i_val <= 42 && 27 <= j_val && j_val <= 38) color <= 1; else color <= 2; end 4'd3: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color <= 1; else if(7 <= i_val && i_val <= 10 && 27 <= j_val && j_val <= 38) color <= 1; else if(11 <= i_val && i_val <= 22 && 39 <= j_val && j_val <= 42) color <= 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color <= 1; else if(27 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color <= 1; else if(39 <= i_val && i_val <= 42 && 27 <= j_val && j_val <= 38) color <= 1; else color <= 2; end 4'd4: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(11 <= i_val && i_val <= 22 && (23 <= j_val && j_val <= 26 || 39 <= j_val && j_val <= 42)) color <= 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color <= 1; else if(27 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color <= 1; else color <= 2; end default: color <= (0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63) ? 1 : 2; endcase end case(color) 2'b00: begin red <= 4'b0000; green <= 4'b0000; blue <= 4'b0000; end 2'b01: begin red <= 4'b1111; green <= 4'b1111; blue <= 4'b1111; end default: begin if (x == col_coor && y == row_coor) begin red <= 4'b0111; green <= 4'b0111; blue <= 4'b0000; end else begin red <= 4'b0101; green <= 4'b0101; blue <= 4'b0101; end end endcase end endmodule ``` ## Bitmap :::spoiler 8 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 7 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 6 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 5 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 4 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000111100000000000011110000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 3 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 2 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000000011111111111100000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000111100000000000000000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000001111111111100000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler 1 ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000011110000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler empty ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler bomb ``` { 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000011111100000000000000000000001111, 64'b1111000000000000000000000000001111111111000000000110000000001111, 64'b1111000000000000000000000000011110001111100000001110000000001111, 64'b1111000000000000000000000000111100000011110000001110000000001111, 64'b1111000000000000000000000000111000000001111000011100000000001111, 64'b1111000000000000000000000001111000000000111111111000000000001111, 64'b1111000000000000000000000111111110000000001111110000000000001111, 64'b1111000000000000000000111111111111110000000000000000000000001111, 64'b1111000000000000000001111100000011111000000000000000000000001111, 64'b1111000000000000000011100000000000011100000000000000000000001111, 64'b1111000000000000000111000000000000001110000000000000000000001111, 64'b1111000000000000001110000000000000000111000000000000000000001111, 64'b1111000000000000011100000000000000000011100000000000000000001111, 64'b1111000000000000111000000000000000000001110000000000000000001111, 64'b1111000000000000110000000000000000000000110000000000000000001111, 64'b1111000000000000110000000000000000000000110000000000000000001111, 64'b1111000000000001110000000000000000000000111000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001100000000000000000000000011000000000000000001111, 64'b1111000000000001110000000000000000000000111000000000000000001111, 64'b1111000000000000110000000000000000000000110000000000000000001111, 64'b1111000000000000110000000000000000000000110000000000000000001111, 64'b1111000000000000111000000000000000000001110000000000000000001111, 64'b1111000000000000011100000000000000000011100000000000000000001111, 64'b1111000000000000001110000000000000000111000000000000000000001111, 64'b1111000000000000000111000000000000001110000000000000000000001111, 64'b1111000000000000000011100000000000011100000000000000000000001111, 64'b1111000000000000000001111100000011111000000000000000000000001111, 64'b1111000000000000000000111111111111110000000000000000000000001111, 64'b1111000000000000000000000111111110000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111000000000000000000000000000000000000000000000000000000001111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111, 64'b1111111111111111111111111111111111111111111111111111111111111111 } ``` ::: :::spoiler vga code - vga_driver ```verilog= module vga_driver(clk, Hsynq, Vsynq, Red, Green, Blue, reset); input clk, reset; output Hsynq, Vsynq; output [3:0] Red, Green, Blue; wire clk_25Mhz; wire enable_V_Counter; wire [15:0] H_Count_Value, V_Count_Value; wire [3:0] val_red, val_green, val_blue; wire active; clock_divider (clk, clk_25Mhz); horizontal_counter (clk_25Mhz, enable_V_Counter, H_Count_Value); vertical_counter (clk_25Mhz, enable_V_Counter, V_Count_Value); color_control (H_Count_Value, V_Count_Value, val_red, val_green, val_blue); assign Hsynq = (H_Count_Value < 92) ? 1'b1 : 1'b0; assign Vsynq = (V_Count_Value < 2) ? 1'b1 : 1'b0; assign active = 143 < H_Count_Value && H_Count_Value < 784 && 34 < V_Count_Value && V_Count_Value < 515; assign Red = active ? val_red : 4'h0; assign Green = active ? val_green : 4'h0; assign Blue = active ? val_blue : 4'h0; endmodule ``` - color control ```verilog= module color_control(hcounter, vcounter, val_red, val_green, val_blue); input [15:0] hcounter, vcounter; output reg [3:0] val_red = 0, val_green = 0, val_blue = 0; wire [3:0] row_coor, col_coor; wire [5:0] i_val, j_val; reg [1:0] color; // 0: white, 1: black, 2: grey; reg [2:0] block_type; assign col_coor = (hcounter - 144) / 64; assign row_coor = (vcounter - 35) / 48; assign j_val = (hcounter - 144) % 64; assign i_val = (vcounter - 35) % 48; always @(*) begin if(col_coor >= 10 || row_coor >= 10) begin color = 2; end else begin block_type = 0; case(block_type) 4'd0: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color = 1; else color = 2; end 4'd1: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(11 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color = 1; else color = 2; end 4'd2: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(7 <= i_val && i_val <= 10 && 27 <= j_val && j_val <= 38) color = 1; else if(11 <= i_val && i_val <= 22 && 39 <= j_val && j_val <= 42) color = 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color = 1; else if(27 <= i_val && i_val <= 38 && 23 <= j_val && j_val <= 26) color = 1; else if(39 <= i_val && i_val <= 42 && 27 <= j_val && j_val <= 38) color = 1; else color = 2; end 4'd3: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(7 <= i_val && i_val <= 10 && 27 <= j_val && j_val <= 38) color = 1; else if(11 <= i_val && i_val <= 22 && 39 <= j_val && j_val <= 42) color = 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color = 1; else if(27 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color = 1; else if(39 <= i_val && i_val <= 42 && 27 <= j_val && j_val <= 38) color = 1; else color = 2; end 4'd4: begin if((0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63)) color = 1; else if(11 <= i_val && i_val <= 22 && (23 <= j_val && j_val <= 26 || 39 <= j_val && j_val <= 42)) color = 1; else if(23 <= i_val && i_val <= 26 && 27 <= j_val && j_val <= 38) color = 1; else if(27 <= i_val && i_val <= 38 && 39 <= j_val && j_val <= 42) color = 1; else color = 2; end default: color = (0 <= i_val && i_val <= 3) || (44 <= i_val && i_val <= 47) || (0 <= j_val && j_val <= 3) || (60 <= j_val && j_val <= 63) ? 1 : 2; endcase end end always @(*) begin case(color) 2'b00: begin val_red <= 4'b0000; val_green <= 4'b0000; val_blue <= 4'b0000; end 2'b01: begin val_red <= 4'b1111; val_green <= 4'b1111; val_blue <= 4'b1111; end default: begin val_red <= 4'b0101; val_green <= 4'b0101; val_blue <= 4'b0101; end endcase end endmodule ``` - vertical counter ```verilog= module vertical_counter(clk_25Mhz, enable_V_Counter, V_Count_Value); input clk_25Mhz, enable_V_Counter; output reg [15:0] V_Count_Value = 0; always @(posedge clk_25Mhz) begin if( enable_V_Counter == 1'b1) begin if(V_Count_Value < 524) begin V_Count_Value <= V_Count_Value + 1; end else begin V_Count_Value <= 0; end end end endmodule ``` - horizontal conter ```verilog= module vertical_counter(clk_25Mhz, enable_V_Counter, V_Count_Value); input clk_25Mhz, enable_V_Counter; output reg [15:0] V_Count_Value = 0; always @(posedge clk_25Mhz) begin if( enable_V_Counter == 1'b1) begin if(V_Count_Value < 524) begin V_Count_Value <= V_Count_Value + 1; end else begin V_Count_Value <= 0; end end end endmodule ``` - clock divider ```verilog= module vertical_counter(clk_25Mhz, enable_V_Counter, V_Count_Value); input clk_25Mhz, enable_V_Counter; output reg [15:0] V_Count_Value = 0; always @(posedge clk_25Mhz) begin if( enable_V_Counter == 1'b1) begin if(V_Count_Value < 524) begin V_Count_Value <= V_Count_Value + 1; end else begin V_Count_Value <= 0; end end end endmodule ``` :::