aboutsummaryrefslogtreecommitdiff
path: root/src/competition.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/competition.sv226
1 files changed, 226 insertions, 0 deletions
diff --git a/src/competition.sv b/src/competition.sv
new file mode 100644
index 0000000..340359b
--- /dev/null
+++ b/src/competition.sv
@@ -0,0 +1,226 @@
+module competition (
+ input logic CLOCK_50,
+ input logic [3:0] KEY,
+ input logic [9:0] SW,
+
+ output logic [6:0] HEX0,
+ output logic [6:0] HEX1,
+ output logic [6:0] HEX2,
+ output logic [6:0] HEX3,
+ output logic [6:0] HEX4,
+ output logic [6:0] HEX5,
+ output logic [9:0] LEDR
+);
+
+ typedef enum logic [6:0] {
+ BLANK = 7'b1111111,
+ DASH = 7'b0111111,
+ ZERO = 7'b1000000,
+ ONE = 7'b1111001,
+ TWO = 7'b0100100,
+ THREE = 7'b0110000,
+ FOUR = 7'b0011001,
+ FIVE = 7'b0010010,
+ SIX = 7'b0000010,
+ SEVEN = 7'b1111000,
+ EIGHT = 7'b0000000,
+ NINE = 7'b0010000,
+ A = 7'b0001000,
+ B = 7'b0000011,
+ C = 7'b1000110,
+ D = 7'b0100001,
+ E = 7'b0000110,
+ F = 7'b0001110
+ } seven_seg_t;
+
+ logic clk, pll_locked, rst_n, en, rdy, key_valid;
+ logic [23:0] key;
+
+ logic [7:0] ct_addr;
+ logic [7:0] ct_rddata;
+
+ enum logic [1:0] {
+ IDLE,
+ CRACK,
+ DONE
+ } state;
+
+ pll sys_pll (
+ .refclk(CLOCK_50),
+ .rst(~KEY[3]),
+ .outclk_0(clk),
+ .locked(pll_locked)
+ );
+
+ assign rst_n = KEY[3] & pll_locked;
+ assign LEDR[0] = rdy;
+ assign LEDR[1] = key_valid;
+ assign LEDR[9:2] = '0;
+
+ ct_mem ct (
+ .address(ct_addr),
+ .clock(clk),
+ .data('0),
+ .wren('0),
+ .q(ct_rddata)
+ );
+
+ multicrack mc (
+ .clk,
+ .rst_n,
+ .en,
+ .rdy,
+ .key,
+ .key_valid,
+ .ct_addr,
+ .ct_rddata
+ );
+
+ always_ff @(posedge clk) begin
+ if (~rst_n) begin
+ state <= IDLE;
+ end else unique case (state)
+ IDLE: if (rdy) state <= CRACK;
+ CRACK: if (rdy) state <= DONE;
+ DONE: state <= DONE;
+ endcase
+ end
+
+ always_comb begin
+ if (state == IDLE && rdy) en = '1;
+ else en = '0;
+ end
+
+ always_comb begin: hex_disp
+ if (state != DONE) begin
+ HEX0 = BLANK;
+ HEX1 = BLANK;
+ HEX2 = BLANK;
+ HEX3 = BLANK;
+ HEX4 = BLANK;
+ HEX5 = BLANK;
+ end else if (~key_valid) begin
+ HEX0 = DASH;
+ HEX1 = DASH;
+ HEX2 = DASH;
+ HEX3 = DASH;
+ HEX4 = DASH;
+ HEX5 = DASH;
+ end else begin
+ unique case (key[23:20])
+ 4'h0: HEX5 = ZERO;
+ 4'h1: HEX5 = ONE;
+ 4'h2: HEX5 = TWO;
+ 4'h3: HEX5 = THREE;
+ 4'h4: HEX5 = FOUR;
+ 4'h5: HEX5 = FIVE;
+ 4'h6: HEX5 = SIX;
+ 4'h7: HEX5 = SEVEN;
+ 4'h8: HEX5 = EIGHT;
+ 4'h9: HEX5 = NINE;
+ 4'hA: HEX5 = A;
+ 4'hB: HEX5 = B;
+ 4'hC: HEX5 = C;
+ 4'hD: HEX5 = D;
+ 4'hE: HEX5 = E;
+ 4'hF: HEX5 = F;
+ endcase
+
+ unique case (key[19:16])
+ 4'h0: HEX4 = ZERO;
+ 4'h1: HEX4 = ONE;
+ 4'h2: HEX4 = TWO;
+ 4'h3: HEX4 = THREE;
+ 4'h4: HEX4 = FOUR;
+ 4'h5: HEX4 = FIVE;
+ 4'h6: HEX4 = SIX;
+ 4'h7: HEX4 = SEVEN;
+ 4'h8: HEX4 = EIGHT;
+ 4'h9: HEX4 = NINE;
+ 4'hA: HEX4 = A;
+ 4'hB: HEX4 = B;
+ 4'hC: HEX4 = C;
+ 4'hD: HEX4 = D;
+ 4'hE: HEX4 = E;
+ 4'hF: HEX4 = F;
+ endcase
+
+ unique case (key[15:12])
+ 4'h0: HEX3 = ZERO;
+ 4'h1: HEX3 = ONE;
+ 4'h2: HEX3 = TWO;
+ 4'h3: HEX3 = THREE;
+ 4'h4: HEX3 = FOUR;
+ 4'h5: HEX3 = FIVE;
+ 4'h6: HEX3 = SIX;
+ 4'h7: HEX3 = SEVEN;
+ 4'h8: HEX3 = EIGHT;
+ 4'h9: HEX3 = NINE;
+ 4'hA: HEX3 = A;
+ 4'hB: HEX3 = B;
+ 4'hC: HEX3 = C;
+ 4'hD: HEX3 = D;
+ 4'hE: HEX3 = E;
+ 4'hF: HEX3 = F;
+ endcase
+
+ unique case (key[11:8])
+ 4'h0: HEX2 = ZERO;
+ 4'h1: HEX2 = ONE;
+ 4'h2: HEX2 = TWO;
+ 4'h3: HEX2 = THREE;
+ 4'h4: HEX2 = FOUR;
+ 4'h5: HEX2 = FIVE;
+ 4'h6: HEX2 = SIX;
+ 4'h7: HEX2 = SEVEN;
+ 4'h8: HEX2 = EIGHT;
+ 4'h9: HEX2 = NINE;
+ 4'hA: HEX2 = A;
+ 4'hB: HEX2 = B;
+ 4'hC: HEX2 = C;
+ 4'hD: HEX2 = D;
+ 4'hE: HEX2 = E;
+ 4'hF: HEX2 = F;
+ endcase
+
+ unique case (key[7:4])
+ 4'h0: HEX1 = ZERO;
+ 4'h1: HEX1 = ONE;
+ 4'h2: HEX1 = TWO;
+ 4'h3: HEX1 = THREE;
+ 4'h4: HEX1 = FOUR;
+ 4'h5: HEX1 = FIVE;
+ 4'h6: HEX1 = SIX;
+ 4'h7: HEX1 = SEVEN;
+ 4'h8: HEX1 = EIGHT;
+ 4'h9: HEX1 = NINE;
+ 4'hA: HEX1 = A;
+ 4'hB: HEX1 = B;
+ 4'hC: HEX1 = C;
+ 4'hD: HEX1 = D;
+ 4'hE: HEX1 = E;
+ 4'hF: HEX1 = F;
+ endcase
+
+ unique case (key[3:0])
+ 4'h0: HEX0 = ZERO;
+ 4'h1: HEX0 = ONE;
+ 4'h2: HEX0 = TWO;
+ 4'h3: HEX0 = THREE;
+ 4'h4: HEX0 = FOUR;
+ 4'h5: HEX0 = FIVE;
+ 4'h6: HEX0 = SIX;
+ 4'h7: HEX0 = SEVEN;
+ 4'h8: HEX0 = EIGHT;
+ 4'h9: HEX0 = NINE;
+ 4'hA: HEX0 = A;
+ 4'hB: HEX0 = B;
+ 4'hC: HEX0 = C;
+ 4'hD: HEX0 = D;
+ 4'hE: HEX0 = E;
+ 4'hF: HEX0 = F;
+ endcase
+ end
+ end: hex_disp
+
+endmodule: competition