diff options
Diffstat (limited to '')
| -rw-r--r-- | src/competition.sv | 226 |
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 |