diff --git a/FPGraph.srcs/sources_1/new/FPGraph.v b/FPGraph.srcs/sources_1/new/FPGraph.v index f6ec3e9..6795eaa 100644 --- a/FPGraph.srcs/sources_1/new/FPGraph.v +++ b/FPGraph.srcs/sources_1/new/FPGraph.v @@ -5,6 +5,11 @@ module FPGraph( input wire clk, + input btnC, + input btnU, + input btnD, + input btnL, + input btnR, output reg [3:0] vgaRed, output reg [3:0] vgaGreen, output reg [3:0] vgaBlue, @@ -13,6 +18,7 @@ module FPGraph( output reg sanity_led, output wire [3:0] an, output wire [7:0] seg, + output [7:0] JB, // Mouse IO inout PS2Clk, @@ -80,6 +86,142 @@ module FPGraph( .b(graph_blue) ); + + + wire main_reset; + wire clock_25Mhz; + wire clock_6_25Mhz; + wire [12:0] pixel_index; + wire [7:0] x_cor = pixel_index % 96; + wire [7:0] y_cor = pixel_index / 96; + + // Generate 25 MHz clock for control_screen + flexible_clock #( .CLK_DIV(3) ) clk_gen_25Mhz ( + .clk_in(clk), + .clk_out(clock_25Mhz) + ); + + // Generate 6.25 MHz clock for oled_driver + flexible_clock #( .CLK_DIV(7) ) clk_gen_6_25Mhz ( + .clk_in(clk), + .clk_out(clock_6_25Mhz) + ); + + // Declare wires for the outputs + wire [15:0] colour_out; + wire [6:0] int_part_A1, int_part_B1, int_part_C1; + wire [6:0] int_part_A2, int_part_B2, int_part_C2; + wire [6:0] int_part_A3, int_part_B3, int_part_C3; + + wire is_neg_A1, is_neg_B1, is_neg_C1; + wire is_neg_A2, is_neg_B2, is_neg_C2; + wire is_neg_A3, is_neg_B3, is_neg_C3; + + // Instantiate control_screen + control_screen u_control_screen ( + .CLOCK(clock_25Mhz), + .x_cor(x_cor), + .y_cor(y_cor), + .pixel_index(pixel_index), + .btnc(btnC), + .btnr(btnR), + .btnl(btnL), + .btnu(btnU), + .btnd(btnD), + .colour_out(colour_out), + .int_part_A1(int_part_A1), .int_part_B1(int_part_B1), .int_part_C1(int_part_C1), + .int_part_A2(int_part_A2), .int_part_B2(int_part_B2), .int_part_C2(int_part_C2), + .int_part_A3(int_part_A3), .int_part_B3(int_part_B3), .int_part_C3(int_part_C3), + .is_negA1(is_neg_A1), .is_negB1(is_neg_B1), .is_negC1(is_neg_C1), + .is_negA2(is_neg_A2), .is_negB2(is_neg_B2), .is_negC2(is_neg_C2), + .is_negA3(is_neg_A3), .is_negB3(is_neg_B3), .is_negC3(is_neg_C3) + ); + + Oled_Display oled_driver( + .clk(clock_6_25Mhz), + .reset(main_reset), + .frame_begin(), + .sending_pixels(), + .sample_pixel(), + .pixel_index(pixel_index), + .pixel_data(colour_out), + .cs(JB[0]), + .sdin(JB[1]), + .sclk(JB[3]), + .d_cn(JB[4]), + .resn(JB[5]), + .vccen(JB[6]), + .pmoden(JB[7]) + ); + + +// // Wires/regs to connect (you'll need real values or signals for these) + + + + wire [13:0] r0_c0_int, r0_c0_dec, r0_c1_int, r0_c1_dec; + wire [13:0] r1_c0_int, r1_c0_dec, r1_c1_int, r1_c1_dec; + wire [13:0] r2_c0_int, r2_c0_dec, r2_c1_int, r2_c1_dec; + wire [13:0] r3_c0_int, r3_c0_dec, r3_c1_int, r3_c1_dec; + wire [13:0] r4_c0_int, r4_c0_dec, r4_c1_int, r4_c1_dec; + wire [13:0] r5_c0_int, r5_c0_dec, r5_c1_int, r5_c1_dec; + + wire r0_c0_s, r0_c1_s; + wire r1_c0_s, r1_c1_s; + wire r2_c0_s, r2_c1_s; + wire r3_c0_s, r3_c1_s; + wire r4_c0_s, r4_c1_s; + wire r5_c0_s, r5_c1_s; + + wire en_r0, en_r1, en_r2, en_r3, en_r4, en_r5; + wire [1:0] intercept_state; + + wire [3:0] sidebar_red, sidebar_green, sidebar_blue; + + SideBar #( + .BASE_X(430), + .BASE_Y0(40), + .BASE_Y1(240), + .CHAR_WIDTH(8), + .CHAR_HEIGHT(16) + ) sidebar_inst ( + .clk(clk), + .x(x), + .y(y), + + .a1_1(int_part_A1 / 10), .a0_1(int_part_A1 % 10), .b1_1(int_part_B1 / 10), .b0_1(int_part_B1 % 10), .c1_1(int_part_C1 / 10), .c0_1(int_part_C1 % 10), + .a1_2(int_part_A2 / 10), .a0_2(int_part_A2 % 10), .b1_2(int_part_B2 / 10), .b0_2(int_part_B2 % 10), .c1_2(int_part_C2 / 10), .c0_2(int_part_C2 % 10), + .a1_3(int_part_A3 / 10), .a0_3(int_part_A3 % 10), .b1_3(int_part_B3 / 10), .b0_3(int_part_B3 % 10), .c1_3(int_part_C3 / 10), .c0_3(int_part_C3 % 10), + + .sa_1(is_neg_A1), .sb_1(is_neg_B1), .sc_1(is_neg_C1), + .sa_2(is_neg_A2), .sb_2(is_neg_B2), .sc_2(is_neg_C1), + .sa_3(is_neg_A3), .sb_3(is_neg_B3), .sc_3(is_neg_C1), + + .r0_c0_int(r0_c0_int), .r0_c0_dec(r0_c0_dec), .r0_c1_int(r0_c1_int), .r0_c1_dec(r0_c1_dec), + .r1_c0_int(r1_c0_int), .r1_c0_dec(r1_c0_dec), .r1_c1_int(r1_c1_int), .r1_c1_dec(r1_c1_dec), + .r2_c0_int(r2_c0_int), .r2_c0_dec(r2_c0_dec), .r2_c1_int(r2_c1_int), .r2_c1_dec(r2_c1_dec), + .r3_c0_int(r3_c0_int), .r3_c0_dec(r3_c0_dec), .r3_c1_int(r3_c1_int), .r3_c1_dec(r3_c1_dec), + .r4_c0_int(r4_c0_int), .r4_c0_dec(r4_c0_dec), .r4_c1_int(r4_c1_int), .r4_c1_dec(r4_c1_dec), + .r5_c0_int(r5_c0_int), .r5_c0_dec(r5_c0_dec), .r5_c1_int(r5_c1_int), .r5_c1_dec(r5_c1_dec), + + .r0_c0_s(r0_c0_s), .r0_c1_s(r0_c1_s), + .r1_c0_s(r1_c0_s), .r1_c1_s(r1_c1_s), + .r2_c0_s(r2_c0_s), .r2_c1_s(r2_c1_s), + .r3_c0_s(r3_c0_s), .r3_c1_s(r3_c1_s), + .r4_c0_s(r4_c0_s), .r4_c1_s(r4_c1_s), + .r5_c0_s(r5_c0_s), .r5_c1_s(r5_c1_s), + + .en_r0(en_r0), .en_r1(en_r1), .en_r2(en_r2), + .en_r3(en_r3), .en_r4(en_r4), .en_r5(en_r5), + + .intercept_state(intercept_state), + + .sidebar_red(sidebar_red), + .sidebar_green(sidebar_green), + .sidebar_blue(sidebar_blue) + ); + + always @ (posedge p_tick) begin if (p_en) begin sanity_led <= 1; diff --git a/FPGraph.srcs/sources_1/new/charRom.v b/FPGraph.srcs/sources_1/new/charRom.v new file mode 100644 index 0000000..7b5cbe7 --- /dev/null +++ b/FPGraph.srcs/sources_1/new/charRom.v @@ -0,0 +1,362 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 03/18/2025 11:05:40 PM +// Design Name: +// Module Name: charRom +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module charRom( + input [7:0] char, + input [2:0] row, col, + output pixel + ); + + reg [4:0] data [45:0][4:0]; + + initial begin + // '0' + data[0][0] = 5'b01100; + data[0][1] = 5'b10110; + data[0][2] = 5'b11010; + data[0][3] = 5'b10010; + data[0][4] = 5'b01100; + + // '1' + data[1][0] = 5'b00100; + data[1][1] = 5'b01100; + data[1][2] = 5'b00100; + data[1][3] = 5'b00100; + data[1][4] = 5'b00100; + + // '2' + data[2][0] = 5'b01100; + data[2][1] = 5'b10010; + data[2][2] = 5'b00100; + data[2][3] = 5'b01000; + data[2][4] = 5'b11110; + + // '3' + data[3][0] = 5'b01100; + data[3][1] = 5'b10010; + data[3][2] = 5'b00100; + data[3][3] = 5'b10010; + data[3][4] = 5'b01100; + + // '4' + data[4][0] = 5'b10010; + data[4][1] = 5'b10010; + data[4][2] = 5'b11110; + data[4][3] = 5'b00010; + data[4][4] = 5'b00010; + + // '5' + data[5][0] = 5'b11110; + data[5][1] = 5'b10000; + data[5][2] = 5'b11100; + data[5][3] = 5'b00010; + data[5][4] = 5'b11100; + + // '6' + data[6][0] = 5'b01100; + data[6][1] = 5'b10000; + data[6][2] = 5'b11100; + data[6][3] = 5'b10010; + data[6][4] = 5'b01100; + + // '7' + data[7][0] = 5'b11110; + data[7][1] = 5'b10010; + data[7][2] = 5'b00100; + data[7][3] = 5'b00100; + data[7][4] = 5'b00100; + + // '8' + data[8][0] = 5'b01100; + data[8][1] = 5'b10010; + data[8][2] = 5'b01100; + data[8][3] = 5'b10010; + data[8][4] = 5'b01100; + + // '9' + data[9][0] = 5'b01100; + data[9][1] = 5'b10010; + data[9][2] = 5'b01110; + data[9][3] = 5'b00010; + data[9][4] = 5'b01100; + + // 'A' + data[10][0] = 5'b00100; + data[10][1] = 5'b01110; + data[10][2] = 5'b01010; + data[10][3] = 5'b11111; + data[10][4] = 5'b10001; + + // 'B' + data[11][0] = 5'b11100; + data[11][1] = 5'b10010; + data[11][2] = 5'b11110; + data[11][3] = 5'b10001; + data[11][4] = 5'b11110; + + // 'C' + data[12][0] = 5'b01110; + data[12][1] = 5'b10000; + data[12][2] = 5'b10000; + data[12][3] = 5'b10000; + data[12][4] = 5'b01110; + + // 'D' + data[13][0] = 5'b11100; + data[13][1] = 5'b10010; + data[13][2] = 5'b10001; + data[13][3] = 5'b10001; + data[13][4] = 5'b11110; + + // 'E' + data[14][0] = 5'b11111; + data[14][1] = 5'b10000; + data[14][2] = 5'b11111; + data[14][3] = 5'b10000; + data[14][4] = 5'b11111; + + // 'F' + data[15][0] = 5'b11111; + data[15][1] = 5'b10000; + data[15][2] = 5'b11111; + data[15][3] = 5'b10000; + data[15][4] = 5'b10000; + + // 'G' + data[16][0] = 5'b01111; + data[16][1] = 5'b10000; + data[16][2] = 5'b10111; + data[16][3] = 5'b10010; + data[16][4] = 5'b01110; + + // 'H' + data[17][0] = 5'b10001; + data[17][1] = 5'b10001; + data[17][2] = 5'b11111; + data[17][3] = 5'b10001; + data[17][4] = 5'b10001; + + // 'I' + data[18][0] = 5'b11111; + data[18][1] = 5'b00100; + data[18][2] = 5'b00100; + data[18][3] = 5'b00100; + data[18][4] = 5'b11111; + + // 'J' + data[19][0] = 5'b11111; + data[19][1] = 5'b00100; + data[19][2] = 5'b00100; + data[19][3] = 5'b10100; + data[19][4] = 5'b01000; + + // 'K' + data[20][0] = 5'b10001; + data[20][1] = 5'b10010; + data[20][2] = 5'b11100; + data[20][3] = 5'b10010; + data[20][4] = 5'b10001; + + // 'L' + data[21][0] = 5'b10000; + data[21][1] = 5'b10000; + data[21][2] = 5'b10000; + data[21][3] = 5'b10000; + data[21][4] = 5'b11111; + + // 'M' + data[22][0] = 5'b10101; + data[22][1] = 5'b11111; + data[22][2] = 5'b10101; + data[22][3] = 5'b10101; + data[22][4] = 5'b10001; + + // 'N' + data[23][0] = 5'b10001; + data[23][1] = 5'b11001; + data[23][2] = 5'b10101; + data[23][3] = 5'b10011; + data[23][4] = 5'b10001; + + + // 'O' + data[24][0] = 5'b01110; + data[24][1] = 5'b10001; + data[24][2] = 5'b10001; + data[24][3] = 5'b10001; + data[24][4] = 5'b01110; + + // 'P' + data[25][0] = 5'b11110; + data[25][1] = 5'b10001; + data[25][2] = 5'b11110; + data[25][3] = 5'b10000; + data[25][4] = 5'b10000; + + // 'Q' + data[26][0] = 5'b01110; + data[26][1] = 5'b10001; + data[26][2] = 5'b10101; + data[26][3] = 5'b01110; + data[26][4] = 5'b00001; + + // 'R' + data[27][0] = 5'b11110; + data[27][1] = 5'b10001; + data[27][2] = 5'b11111; + data[27][3] = 5'b10010; + data[27][4] = 5'b10001; + + // 'S' + data[28][0] = 5'b01111; + data[28][1] = 5'b10000; + data[28][2] = 5'b01110; + data[28][3] = 5'b00001; + data[28][4] = 5'b11110; + + // 'T' + data[29][0] = 5'b11111; + data[29][1] = 5'b00100; + data[29][2] = 5'b00100; + data[29][3] = 5'b00100; + data[29][4] = 5'b00100; + + // 'U' + data[30][0] = 5'b10001; + data[30][1] = 5'b10001; + data[30][2] = 5'b10001; + data[30][3] = 5'b10001; + data[30][4] = 5'b01110; + + // 'V' + data[31][0] = 5'b10001; + data[31][1] = 5'b10001; + data[31][2] = 5'b01010; + data[31][3] = 5'b01010; + data[31][4] = 5'b00100; + + // 'W' + data[32][0] = 5'b10001; + data[32][1] = 5'b10101; + data[32][2] = 5'b10101; + data[32][3] = 5'b11011; + data[32][4] = 5'b10001; + + // 'X' + data[33][0] = 5'b10001; + data[33][1] = 5'b01010; + data[33][2] = 5'b00100; + data[33][3] = 5'b01010; + data[33][4] = 5'b10001; + + // 'Y' + data[34][0] = 5'b10001; + data[34][1] = 5'b01010; + data[34][2] = 5'b00100; + data[34][3] = 5'b00100; + data[34][4] = 5'b00100; + + // 'Z' + data[35][0] = 5'b10001; + data[35][1] = 5'b10001; + data[35][2] = 5'b11111; + data[35][3] = 5'b10001; + data[35][4] = 5'b10001; + + // ' ' + data[36][0] = 5'b00000; + data[36][1] = 5'b00000; + data[36][2] = 5'b00000; + data[36][3] = 5'b00000; + data[36][4] = 5'b00000; + + // '.' in the middle + data[37][0] = 5'b00000; + data[37][1] = 5'b01110; + data[37][2] = 5'b01110; + data[37][3] = 5'b01110; + data[37][4] = 5'b00000; + + // '+' + data[38][0] = 5'b00000; + data[38][1] = 5'b00100; + data[38][2] = 5'b01110; + data[38][3] = 5'b00100; + data[38][4] = 5'b00000; + + //'-' + data[39][0] = 5'b00000; + data[39][1] = 5'b00000; + data[39][2] = 5'b01110; + data[39][3] = 5'b00000; + data[39][4] = 5'b00000; + + //'divide' + data[40][0] = 5'b00100; + data[40][1] = 5'b00000; + data[40][2] = 5'b01110; + data[40][3] = 5'b00000; + data[40][4] = 5'b00100; + + //'multiply' + data[41][0] = 5'b10101; + data[41][1] = 5'b01110; + data[41][2] = 5'b11111; + data[41][3] = 5'b01110; + data[41][4] = 5'b10101; + + //'power' + data[42][0] = 5'b00100; + data[42][1] = 5'b01110; + data[42][2] = 5'b10001; + data[42][3] = 5'b00000; + data[42][4] = 5'b00000; + + //'=' + data[43][0] = 5'b00000; + data[43][1] = 5'b01110; + data[43][2] = 5'b00000; + data[43][3] = 5'b01110; + data[43][4] = 5'b00000; + + //'.' in the bot + data[44][0] = 5'b00000; + data[44][1] = 5'b00000; + data[44][2] = 5'b00000; + data[44][3] = 5'b00000; + data[44][4] = 5'b00100; + + //'.' in the bot + data[45][0] = 5'b11111; + data[45][1] = 5'b11111; + data[45][2] = 5'b11111; + data[45][3] = 5'b11111; + data[45][4] = 5'b11111; + + + + + end + + assign pixel = data[char][row][4-col]; + +endmodule diff --git a/FPGraph.srcs/sources_1/new/control_screen.v b/FPGraph.srcs/sources_1/new/control_screen.v new file mode 100644 index 0000000..387eea7 --- /dev/null +++ b/FPGraph.srcs/sources_1/new/control_screen.v @@ -0,0 +1,123 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 03/18/2025 09:55:39 PM +// Design Name: +// Module Name: control_screen +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module control_screen( + input CLOCK, + input [7:0] x_cor, + input [7:0] y_cor, + input [12:0] pixel_index, + input btnc, + input btnr, + input btnl, + input btnu, + input btnd, + output reg [15:0] colour_out, + output [6:0] int_part_A1, int_part_B1, int_part_C1, + int_part_A2, int_part_B2, int_part_C2, + int_part_A3, int_part_B3, int_part_C3, + + output is_negA1, is_negB1, is_negC1, + is_negA2, is_negB2, is_negC2, + is_negA3, is_negB3, is_negC3 + + ); + + parameter [7:0] x_incr = 5; + parameter [7:0] y_incr = 5; + parameter [7:0] start_x = 3; + parameter [7:0] start_y = 2; + parameter [7:0] end_x = 92; + parameter [7:0] end_y = 61; + + + reg [15:0] oled_holder; + + + + +//18 pixels on x and 12 pixels on y.this is storing row by row + wire [7:0] screen_chars; // Stores character codes + // Declare a 2D wire array to store pixel outputs + //wire pixel_array [0:11][0:17]; + + wire [2:0] x; + wire [2:0] y; + + assign x = (x_cor - start_x) % 5; + assign y = (y_cor - start_y) % 5; + + wire [15:0] text_colour; + wire [15:0] back_colour; + + //scene_controller control_scene (.btnc(btnc), .btnr(btnr), .btnl(btnl), .btnu(btnu), .btnd(btnd), .x_cor(x_cor), .CLOCK(CLOCK), .y_cor(y_cor), .array_out(screen_chars)); + // Instantiate the scene_controller module + scene_controller u_scene_controller ( + .btnc(btnc), + .btnr(btnr), + .btnl(btnl), + .btnu(btnu), + .btnd(btnd), + .CLOCK(CLOCK), + .x_cor(x_cor), + .y_cor(y_cor), + .array_out(screen_chars), + + .int_part_A1(int_part_A1), .int_part_B1(int_part_B1), .int_part_C1(int_part_C1), + .int_part_A2(int_part_A2), .int_part_B2(int_part_B2), .int_part_C2(int_part_C2), + .int_part_A3(int_part_A3), .int_part_B3(int_part_B3), .int_part_C3(int_part_C3), + + + .is_negA1(is_negA1), .is_negB1(is_negB1), .is_negC1(is_negC1), + .is_negA2(is_negA2), .is_negB2(is_negB2), .is_negC2(is_negC2), + .is_negA3(is_negA3), .is_negB3(is_negB3), .is_negC3(is_negC3), + + .text_colour(text_colour),.back_colour(back_colour) + ); + + + wire pixel_out; + + charRom rom (.char(screen_chars), .row(y), .col(x), .pixel(pixel_out)); + + +reg [7:0] x_pos; +reg [7:0] y_pos; + + always @(posedge CLOCK) begin + if (x_cor > end_x || y_cor > end_y || x_cor < start_x || y_cor < start_y) begin + colour_out <= back_colour; + end else begin + x_pos = (x_cor - start_x) / 5; + y_pos = (y_cor - start_y) / 5; + + if (pixel_out) begin + colour_out <= text_colour; + end else begin + colour_out <= back_colour; + end + + + end + + + end +endmodule diff --git a/FPGraph.srcs/sources_1/new/debounce.v b/FPGraph.srcs/sources_1/new/debounce.v new file mode 100644 index 0000000..26b72d3 --- /dev/null +++ b/FPGraph.srcs/sources_1/new/debounce.v @@ -0,0 +1,61 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 10.04.2025 02:34:51 +// Design Name: +// Module Name: debounce +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module debounce( + input wire signal_in, + input wire clk_in, + output reg signal_out +); + parameter TIME_OUT = 4000000; + + reg [31:0] counter = 0; + reg time_out = 0; + + always @ (posedge clk_in) begin + if (time_out == 1) begin + if (counter + 1 == TIME_OUT) begin + time_out <= 0; + counter <= 0; + + end + else begin + if (signal_in == 1) begin + counter <= 0; + end else begin + counter <= counter + 1; + end + + end + signal_out <= 0; + end + else begin + if (signal_in == 1) begin + counter <= 0; + signal_out <= 1; + time_out <= 1; + end + else begin + signal_out <= 0; + end + end + end +endmodule diff --git a/FPGraph.srcs/sources_1/new/num_gen.v b/FPGraph.srcs/sources_1/new/num_gen.v new file mode 100644 index 0000000..8462024 --- /dev/null +++ b/FPGraph.srcs/sources_1/new/num_gen.v @@ -0,0 +1,59 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 04/06/2025 02:30:59 PM +// Design Name: +// Module Name: num_gen +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module num_gen( + input [4:0] digit_in, + input add, + input clear, + input CLOCK, + + input is_neg, + output [6:0] int_part, + output [7:0] neg_sign, + output [7:0] b4, //these are pos of digits assuming all digits are used + output [7:0] b3 + ); + + reg [6:0] int =7'd0; + parameter [7:0] space = 8'd36; + parameter [7:0] neg = 8'd39; + + always @ (posedge CLOCK) begin + if (clear) begin + int <= 0; + end + if (add) begin + + int <= (int < 7'd10) ? (int * 10 + digit_in) : ((int % 10) * 10 + digit_in); + end + end + + wire [2:0] int_digits = (int / 10 != 0) ? 3'd2 : 3'd1; + //wire [2:0] deci_digits = (deci / 10 != 0) ? (2'd2) : ((deci != 0) ? 2'd1 : 2'd0); + + assign neg_sign = (is_neg) ? neg : space; + assign b4 = (int_digits == 1) ? int : int/10; + assign b3 = (int_digits == 1) ? space : int % 10; + + assign int_part = int; + +endmodule diff --git a/FPGraph.srcs/sources_1/new/scene_controller.v b/FPGraph.srcs/sources_1/new/scene_controller.v new file mode 100644 index 0000000..32b8104 --- /dev/null +++ b/FPGraph.srcs/sources_1/new/scene_controller.v @@ -0,0 +1,1108 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 03/20/2025 09:27:17 PM +// Design Name: +// Module Name: scene_controller +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module scene_controller( + input btnc, + input btnr, + input btnl, + input btnu, + input btnd, + input CLOCK, + input [7:0] x_cor, + input [7:0] y_cor, + output reg [7:0] array_out, + output [6:0] int_part_A1, int_part_B1, int_part_C1, + int_part_A2, int_part_B2, int_part_C2, + int_part_A3, int_part_B3, int_part_C3, + + output reg is_negA1 = 0, is_negB1 = 0, is_negC1 = 0, + is_negA2 = 0, is_negB2 = 0, is_negC2 = 0, + is_negA3 = 0, is_negB3 = 0, is_negC3 = 0, + output reg [15:0] text_colour = 16'hFFFF, + output reg [15:0] back_colour = 16'h0000 + + + + ); + + reg [7:0] pixel_array [0:11][0:17]; + parameter [7:0] start_x = 3; + parameter [7:0] start_y = 2; + parameter [7:0] end_x = 92; + parameter [7:0] end_y = 61; + + wire [7:0] x = ((x_cor - 3) / 5 > 17) ? 17 : (x_cor < 3) ? 0 : (x_cor - 3) / 5; + wire [7:0] y = ((y_cor - 2) / 5 > 11) ? 11 : (y_cor < 2) ? 0 : (y_cor - 2) / 5; + + + + //debouncing + // Debounce counter and period + reg [23:0] debounceCounter = 0; + //reg prevPushState = 0; + localparam DEBOUNCE_PERIOD = 24'd5000000; // 160ms at 25MHz + wire btnc_press, btnr_press; + wire btnl_press, btnu_press; + wire btnd_press; + reg [4:0] prevPushState; + + //states + parameter [3:0] interstate = 4'd0; + parameter [3:0] mainmenu_1 = 4'd1; + parameter [3:0] quadrmenu = 4'd2; + parameter [3:0] start = 4'd6; + parameter [3:0] colour = 4'd7; + parameter [3:0] numpad = 4'd4; + parameter [3:0] eqnmenu = 4'd5; + + //state var + reg [7:0] state = interstate; + reg [7:0] nextstate = start; + reg [7:0] prevstate = interstate; + reg [7:0] dot_x = 4; + reg [7:0] dot_y = 7; + reg [7:0] eqn = 1; + + + //displayed var + reg [7:0] letter; + integer i,j; + + // Shared across all instances + reg [4:0] digit_in; + reg is_deci; + + reg addA1, addB1, addC1; + reg addA2, addB2, addC2; + reg addA3, addB3, addC3; + + reg addD1, addD2, addD3; + reg is_negD1, is_negD2, is_negD3; + reg clearD1, clearD2, clearD3; + + + + // Bitmaps for pixel drawing + wire [7:0] b4D1, b3D1, neg_signD1; + wire [7:0] b4D2, b3D2, neg_signD2; + wire [7:0] b4D3, b3D3, neg_signD3; + + //colours + //background + parameter [15:0] black = 16'h0000; + parameter [15:0] blue = 16'h001F; + parameter [15:0] grey = 16'h8410; + parameter [15:0] orange = 16'hFD20; + + //text + parameter [15:0] white = 16'hFFFF; + parameter [15:0] green = 16'h07E0; + parameter [15:0] red = 16'hF800; + parameter [15:0] cyan = 16'h07FF; + + reg [1:0] text_state = 0; + reg [1:0] back_state = 0; + + + // ----- Instance A1 ----- + //wire [13:0] int_part_A1; wire [6:0] deci_part_A1; + wire [7:0] b4A1, b3A1, neg_signA1; + reg clearA1; + + // ----- Instance B1 ----- + //wire [13:0] int_part_B1; wire [6:0] deci_part_B1; + wire [7:0] b4B1, b3B1, neg_signB1; + reg clearB1; + + // ----- Instance C1 ----- + //wire [13:0] int_part_C1; wire [6:0] deci_part_C1; + wire [7:0] b4C1, b3C1, neg_signC1; + reg clearC1; + + // ----- Instance A2 ----- + //wire [13:0] int_part_A2; wire [6:0] deci_part_A2; + wire [7:0] b4A2, b3A2, neg_signA2; + reg clearA2; + + // ----- Instance B2 ----- + //wire [13:0] int_part_B2; wire [6:0] deci_part_B2; + wire [7:0] b4B2, b3B2, neg_signB2; + reg clearB2; + + // ----- Instance C2 ----- + //wire [13:0] int_part_C2; wire [6:0] deci_part_C2; + wire [7:0] b4C2, b3C2, neg_signC2; + reg clearC2; + + // ----- Instance A3 ----- + //wire [13:0] int_part_A3; wire [6:0] deci_part_A3; + wire [7:0] b4A3, b3A3, neg_signA3; + reg clearA3; + + // ----- Instance B3 ----- + //wire [13:0] int_part_B3; wire [6:0] deci_part_B3; + wire [7:0] b4B3, b3B3, neg_signB3; + reg clearB3; + + // ----- Instance C3 ----- + //wire [13:0] int_part_C3; wire [6:0] deci_part_C3; + wire [7:0] b4C3, b3C3, neg_signC3; + reg clearC3; + + // ----- A1 ----- + num_gen A1 ( + .digit_in(digit_in), .add(addA1), .clear(clearA1), .CLOCK(CLOCK), + .is_neg(is_negA1), + .int_part(int_part_A1), .neg_sign(neg_signA1), + .b4(b4A1), .b3(b3A1) + ); + + // ----- B1 ----- + num_gen B1 ( + .digit_in(digit_in), .add(addB1), .clear(clearB1), .CLOCK(CLOCK), + .is_neg(is_negB1), + .int_part(int_part_B1), .neg_sign(neg_signB1), + .b4(b4B1), .b3(b3B1) + ); + + // ----- C1 ----- + num_gen C1 ( + .digit_in(digit_in), .add(addC1), .clear(clearC1), .CLOCK(CLOCK), + .is_neg(is_negC1), + .int_part(int_part_C1), .neg_sign(neg_signC1), + .b4(b4C1), .b3(b3C1) + ); + + // ----- A2 ----- + num_gen A2 ( + .digit_in(digit_in), .add(addA2), .clear(clearA2), .CLOCK(CLOCK), + .is_neg(is_negA2), + .int_part(int_part_A2), .neg_sign(neg_signA2), + .b4(b4A2), .b3(b3A2) + ); + + // ----- B2 ----- + num_gen B2 ( + .digit_in(digit_in), .add(addB2), .clear(clearB2), .CLOCK(CLOCK), + .is_neg(is_negB2), + .int_part(int_part_B2), .neg_sign(neg_signB2), + .b4(b4B2), .b3(b3B2) + ); + + // ----- C2 ----- + num_gen C2 ( + .digit_in(digit_in), .add(addC2), .clear(clearC2), .CLOCK(CLOCK), + .is_neg(is_negC2), + .int_part(int_part_C2), .neg_sign(neg_signC2), + .b4(b4C2), .b3(b3C2) + ); + + // ----- A3 ----- + num_gen A3 ( + .digit_in(digit_in), .add(addA3), .clear(clearA3), .CLOCK(CLOCK), + .is_neg(is_negA3), + .int_part(int_part_A3), .neg_sign(neg_signA3), + .b4(b4A3), .b3(b3A3) + ); + + // ----- B3 ----- + num_gen B3 ( + .digit_in(digit_in), .add(addB3), .clear(clearB3), .CLOCK(CLOCK), + .is_neg(is_negB3), + .int_part(int_part_B3), .neg_sign(neg_signB3), + .b4(b4B3), .b3(b3B3) + ); + + // ----- C3 ----- + num_gen C3 ( + .digit_in(digit_in), .add(addC3), .clear(clearC3), .CLOCK(CLOCK), + .is_neg(is_negC3), + .int_part(int_part_C3), .neg_sign(neg_signC3), + .b4(b4C3), .b3(b3C3) + ); + + +debounce a( + .signal_in(btnu), + .clk_in(CLOCK), + .signal_out(btnu_press) +); +debounce b( + .signal_in(btnd), + .clk_in(CLOCK), + .signal_out(btnd_press) +); +debounce c( + .signal_in(btnl), + .clk_in(CLOCK), + .signal_out(btnl_press) +); +debounce d( + .signal_in(btnr), + .clk_in(CLOCK), + .signal_out(btnr_press) +); +debounce e( + .signal_in(btnc), + .clk_in(CLOCK), + .signal_out(btnc_press) +); + + + + + //Button synchronization and edge detection +// always @(posedge CLOCK) begin + +// if (debounceCounter == 0) begin +// // No new presses this cycle +// btnu_press <= 0; btnd_press <= 0; +// btnc_press <= 0; btnr_press <= 0; btnl_press <= 0; +// end + +// if (debounceCounter > 0) begin +// debounceCounter <= debounceCounter - 1; +// btnu_press <= 0; btnd_press <= 0; +// btnc_press <= 0; btnr_press <= 0; btnl_press <= 0; +// end else begin +// // Detect new press per button (rising edge) +// if (btnu && !prevPushState[0]) begin +// btnu_press <= 1; +// debounceCounter <= DEBOUNCE_PERIOD; +// end +// if (btnd && !prevPushState[1]) begin +// btnd_press <= 1; +// debounceCounter <= DEBOUNCE_PERIOD; +// end +// if (btnc && !prevPushState[2]) begin +// btnc_press <= 1; +// debounceCounter <= DEBOUNCE_PERIOD; +// end +// if (btnr && !prevPushState[3]) begin +// btnr_press <= 1; +// debounceCounter <= DEBOUNCE_PERIOD; +// end +// if (btnl && !prevPushState[4]) begin +// btnl_press <= 1; +// debounceCounter <= DEBOUNCE_PERIOD; +// end +// end + +// // Always update prevPushState at the end +// prevPushState[0] <= btnu; +// prevPushState[1] <= btnd; +// prevPushState[2] <= btnc; +// prevPushState[3] <= btnr; +// prevPushState[4] <= btnl; + +// end + + always @ (posedge CLOCK) begin + if (state == interstate) begin + for (i = 0 ; i < 18 ; i = i + 1)begin + for (j = 0 ; j < 12 ; j = j + 1) begin + pixel_array[j][i] <= 8'd36; + end + end + + state <= nextstate; + + //BTN UP + end else if (btnu_press) begin + + case(state) + + quadrmenu:begin + if (dot_y == 5) begin + pixel_array[dot_y][dot_x] <=8'd36; + dot_y <= 1; + dot_x <= 1; + end else if (dot_y > 5) begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= dot_y - 2; + dot_x <= 4; + end + end + + + numpad:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_x == 13) ? ((dot_y > 8) ? dot_y - 3 : dot_y) : ((dot_y > 2) ? dot_y - 3 : dot_y); + end + + eqnmenu:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y == 11) ? dot_y - 2 : (dot_y > 3) ? dot_y - 3 : dot_y; + end + + start:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y > 7) ? dot_y - 2 : dot_y; + end + + colour:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y > 4) ? dot_y - 2 : dot_y; + end + + default:state <= interstate; + endcase + + end + + //BTN DOWN + else if (btnd_press) begin + case(state) + + quadrmenu:begin + if (dot_y == 1) begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= 5; + dot_x <= 4; + end + else begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y < 9) ? dot_y + 2: dot_y; + end + end + + + + numpad:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y < 11) ? dot_y + 3 : dot_y; + dot_x <= (dot_x == 9 && dot_y == 8) ? 5 : dot_x; + end + + eqnmenu:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y == 9) ? dot_y + 2 : (dot_y < 9) ? dot_y + 3 : dot_y; + end + + start:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y < 9) ? dot_y + 2 : dot_y; + end + + colour:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_y <= (dot_y < 8) ? dot_y + 2 : dot_y; + end + + default:state <= interstate; + endcase + end + + + //BTN CNTR + else if (btnc_press) begin + + case(state) + + quadrmenu:begin + if (dot_y == 1 && dot_x ==1) begin + + case(eqn) + 1:begin + is_negA1 <= 0; + clearA1 <= 1; + is_negB1 <= 0; + clearB1 <= 1; + is_negC1 <= 0; + clearC1 <= 1; + + end + 2:begin + is_negA2 <= 0; + clearA2 <= 1; + is_negB2 <= 0; + clearB2 <= 1; + is_negC2 <= 0; + clearC2 <= 1; + + end + 3:begin + is_negA3 <= 0; + clearA3 <= 1; + is_negB3 <= 0; + clearB3 <= 1; + is_negC3 <= 0; + clearC3 <= 1; + + end + default:; + endcase + end + else if (dot_x == 12 && dot_y == 1) begin + state <= interstate; nextstate <= eqnmenu; + dot_x <= 1; + dot_y <= eqn * 3; + end + + else begin + if (dot_y == 5 && dot_x == 4) begin + letter <= 6'd10; + end + else if (dot_y == 7 && dot_x == 4) begin + letter <= 6'd11; + end + else if (dot_y == 9 && dot_x == 4) begin + letter <= 6'd12; + end + + + state <= interstate; + nextstate <= numpad; + prevstate <= quadrmenu; + dot_x <= 1; + dot_y <= 2; + end + + + end + + + numpad:begin + if (dot_x == 13 && dot_y == 8) begin + dot_x <= 4; dot_y <= 5 + (letter - 10) * 2; + nextstate <= prevstate; + state <= interstate; + + end + else if (dot_x == 5 && dot_y == 11) begin + digit_in <= 0; + case(eqn) + 1:begin + if (letter == 6'd10) begin + addA1 <= 1; + end + if (letter == 6'd11) begin + addB1 <= 1; + end + if (letter == 6'd12) begin + addC1 <= 1; + end + + end + 2:begin + if (letter == 6'd10) begin + addA2 <= 1; + end + if (letter == 6'd11) begin + addB2 <= 1; + end + if (letter == 6'd12) begin + addC2 <= 1; + end + + end + 3:begin + if (letter == 6'd10) begin + addA3 <= 1; + end + if (letter == 6'd11) begin + addB3 <= 1; + end + if (letter == 6'd12) begin + addC3 <= 1; + end + + end + default:; + endcase + end + + else if (dot_x == 1 && dot_y == 11) begin + case(eqn) + 1: begin + if (letter == 6'd10) begin + is_negA1 <= 1; + end + if (letter == 6'd11) begin + is_negB1 <= 1; + end + if (letter == 6'd12) begin + is_negC1 <= 1; + end + + end + + 2: begin + if (letter == 6'd10) begin + is_negA2 <= 1; + end + if (letter == 6'd11) begin + is_negB2 <= 1; + end + if (letter == 6'd12) begin + is_negC2 <= 1; + end + + end + + 3: begin + if (letter == 6'd10) begin + is_negA3 <= 1; + end + if (letter == 6'd11) begin + is_negB3 <= 1; + end + if (letter == 6'd12) begin + is_negC3 <= 1; + end + + end + + default: ; + endcase + end + + else if (dot_x == 13 && dot_y == 11) begin + case(eqn) + 1: begin + if (letter == 6'd10) begin + clearA1 <= 1; + + is_negA1 <= 0; + end + if (letter == 6'd11) begin + clearB1 <= 1; + + is_negB1 <= 0; + end + if (letter == 6'd12) begin + clearC1 <= 1; + + is_negC1 <= 0; + end + + end + + 2: begin + if (letter == 6'd10) begin + clearA2 <= 1; + + is_negA2 <= 0; + end + if (letter == 6'd11) begin + clearB2 <= 1; + + is_negB2 <= 0; + end + if (letter == 6'd12) begin + clearC2 <= 1; + + is_negC2 <= 0; + end + + end + + 3: begin + if (letter == 6'd10) begin + clearA3 <= 1; + + is_negA3 <= 0; + end + if (letter == 6'd11) begin + clearB3 <= 1; + + is_negB3 <= 0; + end + if (letter == 6'd12) begin + clearC3 <= 1; + + is_negC3 <= 0; + end + + end + + default: ; + endcase + + + end + + else begin + digit_in <= 1 + ((dot_x - 1) / 4) + ((dot_y - 2)); + case(eqn) + 1: begin + if (letter == 6'd10) begin + addA1 <= 1; + end + if (letter == 6'd11) begin + addB1 <= 1; + end + if (letter == 6'd12) begin + addC1 <= 1; + end + + end + + 2: begin + if (letter == 6'd10) begin + addA2 <= 1; + end + if (letter == 6'd11) begin + addB2 <= 1; + end + if (letter == 6'd12) begin + addC2 <= 1; + end + + end + + 3: begin + if (letter == 6'd10) begin + addA3 <= 1; + end + if (letter == 6'd11) begin + addB3 <= 1; + end + if (letter == 6'd12) begin + addC3 <= 1; + end + + end + + default: ; + endcase + + end + + end + + eqnmenu:begin + if (dot_y == 11) begin + state <= interstate; + nextstate <= start; + dot_x <= 4; + dot_y <= 7; + end else begin + + eqn <= dot_y / 3; + state <= interstate; + nextstate <= quadrmenu; + dot_x <= 1; + dot_y <= 1; + end + + end + + start:begin + if (dot_y == 7) begin + state <= interstate; + nextstate <= eqnmenu; + dot_x <= 1; + dot_y <= 3; + end + else if (dot_y == 9) begin + state <= interstate; + nextstate <= colour; + dot_x <= 1; + dot_y <= 4; + end + end + + colour:begin + if (dot_y == 6) begin + text_state <= (text_state == 2'd3) ? 0 : text_state + 1; + end + else if (dot_y == 4) begin + back_state <= (back_state == 2'd3) ? 0 : back_state + 1; + end + else if (dot_y == 8) begin + state <= interstate; + nextstate <= start; + dot_x <= 4; + dot_y <= 9; + end + end + + default:state <= interstate; + endcase + end + + + //BTN RIGHT + else if (btnr_press) begin + case(state) + quadrmenu:begin + if (dot_y == 1 && dot_x == 1) begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_x <= 12; + end + end + + + numpad:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_x <= (dot_y == 11 && dot_x == 5) ? dot_x + 8 : (dot_y < 8) ? ((dot_x < 9) ? dot_x + 4 : dot_x) : ((dot_x < 13) ? dot_x + 4 : dot_x); + end + + + + default:; + endcase + end + + + //BTN LEFT + else if (btnl_press) begin + case(state) + quadrmenu:begin + if (dot_y == 1 && dot_x == 12) begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_x <= 1; + end + + end + + + + numpad:begin + pixel_array[dot_y][dot_x] <= 8'd36; + dot_x <= (dot_x == 13 && dot_y == 11) ? dot_x - 8 : (dot_x > 1) ? dot_x - 4 : dot_x; + end + + + default:; + endcase + end + + else if (state == nextstate) begin + + case(state) + + quadrmenu: begin + //reset + pixel_array[1][3] <= 8'd27;pixel_array[1][4] <= 8'd14; + pixel_array[1][5] <= 8'd28;pixel_array[1][6] <= 8'd14; + pixel_array[1][7] <= 8'd29; + //done + pixel_array[1][14] <= 8'd13;pixel_array[1][15] <= 8'd24; + pixel_array[1][16] <= 8'd23;pixel_array[1][17] <= 8'd14; + //dot + pixel_array[dot_y][dot_x] <= 8'd37; + + + //y=ax^2+bx+c + pixel_array[3][2] <= 8'd34;pixel_array[3][3] <= 8'd43; + pixel_array[3][4] <= 8'd10;pixel_array[3][5] <= 8'd33; + pixel_array[3][6] <= 8'd42;pixel_array[3][7] <= 8'd2; + pixel_array[3][8] <= 8'd38;pixel_array[3][9] <= 8'd11; + pixel_array[3][10] <= 8'd33;pixel_array[3][11] <= 8'd38; + pixel_array[3][12] <= 8'd12; + //a= + pixel_array[5][6] <= 8'd10;pixel_array[5][7] <= 8'd43; + //b= + pixel_array[7][6] <= 8'd11;pixel_array[7][7] <= 8'd43; + //c= + pixel_array[9][6] <= 8'd12;pixel_array[9][7] <= 8'd43; + + + // DISPLAY THE NUM + case(eqn) + 1: begin + // A1 + pixel_array[5][9] <= b4A1; pixel_array[5][10] <= b3A1; + pixel_array[5][8] <= neg_signA1; + + // B1 + pixel_array[7][9] <= b4B1; pixel_array[7][10] <= b3B1; + pixel_array[7][8] <= neg_signB1; + + // C1 + pixel_array[9][9] <= b4C1; pixel_array[9][10] <= b3C1; + pixel_array[9][8] <= neg_signC1; + + end + + 2: begin + // A2 + pixel_array[5][9] <= b4A2; pixel_array[5][10] <= b3A2; + pixel_array[5][8] <= neg_signA2; + + // B2 + pixel_array[7][9] <= b4B2; pixel_array[7][10] <= b3B2; + pixel_array[7][8] <= neg_signB2; + + // C2 + pixel_array[9][9] <= b4C2; pixel_array[9][10] <= b3C2; + pixel_array[9][8] <= neg_signC2; + + end + + 3: begin + // A3 + pixel_array[5][9] <= b4A3; pixel_array[5][10] <= b3A3; + pixel_array[5][8] <= neg_signA3; + + // B3 + pixel_array[7][9] <= b4B3; pixel_array[7][10] <= b3B3; + pixel_array[7][8] <= neg_signB3; + + // C3 + pixel_array[9][9] <= b4C3; pixel_array[9][10] <= b3C3; + pixel_array[9][8] <= neg_signC3; + + end + + default: ; + endcase + + end + + + numpad: begin + //numbers + pixel_array[2][3] <= 8'd1;pixel_array[2][7] <= 8'd2; + pixel_array[2][11] <= 8'd3;pixel_array[5][3] <= 8'd4; + pixel_array[5][7] <= 8'd5;pixel_array[5][11] <= 8'd6; + pixel_array[8][3] <= 8'd7;pixel_array[8][7] <= 8'd8; + pixel_array[8][11] <= 8'd9;pixel_array[11][3] <= 8'd39; + pixel_array[11][7] <= 8'd0; + pixel_array[8][15] <= 8'd28;pixel_array[8][16] <= 8'd14; + pixel_array[8][17] <= 8'd29;pixel_array[11][15] <= 8'd12; + pixel_array[11][16] <= 8'd21;pixel_array[11][17] <= 8'd27; + + //dot + pixel_array[dot_y][dot_x] <= 8'd37; + + addA1 <= 0; addB1 <= 0; addC1 <= 0; + addA2 <= 0; addB2 <= 0; addC2 <= 0; + addA3 <= 0; addB3 <= 0; addC3 <= 0; + + + + + //letter + pixel_array[0][1] <= letter; pixel_array[0][2] <= 8'd43; + if (letter == 8'd10) begin + case(eqn) + 1:begin + pixel_array[0][4] <= b4A1; pixel_array[0][5] <= b3A1; + pixel_array[0][3] <= neg_signA1; + end + + 2:begin + pixel_array[0][4] <= b4A2; pixel_array[0][5] <= b3A2; + pixel_array[0][3] <= neg_signA2; + end + + 3:begin + pixel_array[0][4] <= b4A3; pixel_array[0][5] <= b3A3; + pixel_array[0][3] <= neg_signA3; + end + default:; + endcase + end + + if (letter == 8'd11) begin + case(eqn) + 1: begin + pixel_array[0][4] <= b4B1; pixel_array[0][5] <= b3B1; + pixel_array[0][3] <= neg_signB1; + end + + 2: begin + pixel_array[0][4] <= b4B2; pixel_array[0][5] <= b3B2; + pixel_array[0][3] <= neg_signB2; + end + + 3: begin + pixel_array[0][4] <= b4B3; pixel_array[0][5] <= b3B3; + pixel_array[0][3] <= neg_signB3; + end + default: ; + endcase + end + + if (letter == 8'd12) begin + case(eqn) + 1: begin + pixel_array[0][4] <= b4C1; pixel_array[0][5] <= b3C1; + pixel_array[0][3] <= neg_signC1; + end + + 2: begin + pixel_array[0][4] <= b4C2; pixel_array[0][5] <= b3C2; + pixel_array[0][3] <= neg_signC2; + end + + 3: begin + pixel_array[0][4] <= b4C3; pixel_array[0][5] <= b3C3; + pixel_array[0][3] <= neg_signC3; + end + default: ; + endcase + end + + end + + eqnmenu: begin + + //dot + pixel_array[dot_y][dot_x] <= 8'd37; + + //fpgraph + pixel_array[0][0] <= 8'd15; pixel_array[0][1] <= 8'd25; + pixel_array[0][2] <= 8'd16; pixel_array[0][3] <= 8'd27; + pixel_array[0][4] <= 8'd10; pixel_array[0][5] <= 8'd25; + pixel_array[0][6] <= 8'd17; + + //equation 1 + pixel_array[3][3] <= 8'd14; pixel_array[3][4] <= 8'd26; + pixel_array[3][5] <= 8'd30; pixel_array[3][6] <= 8'd10; + pixel_array[3][7] <= 8'd29; pixel_array[3][8] <= 8'd18; + pixel_array[3][9] <= 8'd24; pixel_array[3][10] <= 8'd23; + pixel_array[3][12] <= 8'd1; + + //equation 2 + pixel_array[6][3] <= 8'd14; pixel_array[6][4] <= 8'd26; + pixel_array[6][5] <= 8'd30; pixel_array[6][6] <= 8'd10; + pixel_array[6][7] <= 8'd29; pixel_array[6][8] <= 8'd18; + pixel_array[6][9] <= 8'd24; pixel_array[6][10] <= 8'd23; + pixel_array[6][12] <= 8'd2; + + //equation 3 + pixel_array[9][3] <= 8'd14; pixel_array[9][4] <= 8'd26; + pixel_array[9][5] <= 8'd30; pixel_array[9][6] <= 8'd10; + pixel_array[9][7] <= 8'd29; pixel_array[9][8] <= 8'd18; + pixel_array[9][9] <= 8'd24; pixel_array[9][10] <= 8'd23; + pixel_array[9][12] <= 8'd3; + + //back + pixel_array[11][3] <= 8'd11; pixel_array[11][4] <= 8'd10; + pixel_array[11][5] <= 8'd12; pixel_array[11][6] <= 8'd20; + + end + + start:begin + //FP big big + pixel_array[1][2] <= 8'd45; pixel_array[1][3] <= 8'd45; + pixel_array[1][4] <= 8'd45; + pixel_array[1][6] <= 8'd45; pixel_array[1][7] <= 8'd45; + pixel_array[1][8] <= 8'd45; pixel_array[2][2] <= 8'd45; + pixel_array[2][6] <= 8'd45; pixel_array[2][9] <= 8'd45; + pixel_array[3][2] <= 8'd45; pixel_array[3][3] <= 8'd45; + pixel_array[3][4] <= 8'd45; pixel_array[3][6] <= 8'd45; + pixel_array[3][7] <= 8'd45; pixel_array[3][8] <= 8'd45; + pixel_array[4][2] <= 8'd45; pixel_array[4][6] <= 8'd45; + pixel_array[5][2] <= 8'd45; pixel_array[5][6] <= 8'd45; + + //graph + pixel_array[5][10] <= 8'd16; pixel_array[5][11] <= 8'd27; + pixel_array[5][12] <= 8'd10; pixel_array[5][13] <= 8'd25; + pixel_array[5][14] <= 8'd17; + + //dot + pixel_array[dot_y][dot_x] <= 8'd37; + + //start + pixel_array[7][6] <= 8'd28; pixel_array[7][7] <= 8'd29; + pixel_array[7][8] <= 8'd10; pixel_array[7][9] <= 8'd27; + pixel_array[7][10] <= 8'd29; + + //options + pixel_array[9][6] <= 8'd24; pixel_array[9][7] <= 8'd25; + pixel_array[9][8] <= 8'd29; pixel_array[9][9] <= 8'd18; + pixel_array[9][10] <= 8'd24; pixel_array[9][11] <= 8'd23; + pixel_array[9][12] <= 8'd28; + + end + + colour:begin + //dot + pixel_array[dot_y][dot_x] <= 8'd37; + //colour text + pixel_array[6][10] <= (text_state == 0) ? 8'd32 : + (text_state == 1) ? 8'd16 : + (text_state == 2) ? 8'd27 : 8'd12; + + //colour back + pixel_array[3][10] <= (back_state == 0) ? 8'd11 : + (back_state == 1) ? 8'd11 : + (back_state == 2) ? 8'd16 : 8'd24; + pixel_array[3][11] <= (back_state == 0 || back_state == 1) ? 8'd21 : 8'd36; + pixel_array[3][12] <= (back_state == 0) ? 8'd20 :(back_state == 1) ? 8'd30 : 8'd36; + + //colour select + pixel_array[1][3] <= 8'd12; pixel_array[1][4] <= 8'd24; + pixel_array[1][5] <= 8'd21; pixel_array[1][6] <= 8'd24; + pixel_array[1][7] <= 8'd30; pixel_array[1][8] <= 8'd27; + pixel_array[1][11] <= 8'd14; pixel_array[1][10] <= 8'd28; + pixel_array[1][13] <= 8'd14; pixel_array[1][12] <= 8'd21; + pixel_array[1][15] <= 8'd29; pixel_array[1][14] <= 8'd12; + + //background + pixel_array[3][3] <= 8'd11; pixel_array[3][4] <= 8'd10; + pixel_array[3][5] <= 8'd12; pixel_array[3][6] <= 8'd20; + pixel_array[4][3] <= 8'd16; pixel_array[4][4] <= 8'd27; + pixel_array[4][5] <= 8'd24; pixel_array[4][6] <= 8'd30; + pixel_array[4][7] <= 8'd23; pixel_array[4][8] <= 8'd13; + + //text + pixel_array[6][3] <= 8'd29; pixel_array[6][4] <= 8'd14; + pixel_array[6][5] <= 8'd33; pixel_array[6][6] <= 8'd29; + + //back + pixel_array[8][3] <= 8'd11; pixel_array[8][4] <= 8'd10; + pixel_array[8][5] <= 8'd13; pixel_array[8][6] <= 8'd20; + end + + default: state <= interstate; + endcase + // Clear all clears + clearA1 <= 0; clearB1 <= 0; clearC1 <= 0; + clearA2 <= 0; clearB2 <= 0; clearC2 <= 0; + clearA3 <= 0; clearB3 <= 0; clearC3 <= 0; + + end + + + + + end//end of always block + + + + + //end//always + + //assign array_out = (x_cor > end_x || y_cor > end_y || x_cor < start_x || y_cor < start_y) ? 0 : pixel_array[0][0]; + always @ (posedge CLOCK) begin + array_out <= (x_cor > end_x || y_cor > end_y || x_cor < start_x || y_cor < start_y) ? 8'd36 : pixel_array[y][x]; + text_colour <= (text_state == 0) ? white : + (text_state == 1) ? green : + (text_state == 2) ? red : + cyan; + + back_colour <= (back_state == 0) ? black : + (back_state == 1) ? blue : + (back_state == 2) ? grey : + orange; + end + +endmodule + + +