- leds[3:0] = 4'h0;
-
- if (sw[2] || (tos_good[2] && ~sw[1] && ~sw[0])) begin
- tos_output = tos_inputs[2];
- leds[2] = 1;
- end else if (sw[1] | (tos_good[1] && ~sw[0])) begin
- tos_output = tos_inputs[1];
- leds[1] = 1;
- end else if (sw[0] | tos_good[0]) begin
- tos_output = tos_inputs[0];
- leds[0] = 1;
- end else
- tos_output = sw[3];
- leds[3] = tos_output;
+ cathode = data[7:0];
+ seg = data[9:8];
+ tos_select = data[11:10];
+ end
+
+ // Buttons are active-low, so invert them.
+ wire [7:0] output_stuff = { 2'b0, ~buttons, tos_good };
+
+ always @(*)
+ data_output = output_stuff[current_bit[2:0]];
+
+ TOS_Detect detect[3:0](.xtal(xtal), .tos_input(tos_inputs), .tos_good(tos_good));
+ POS_Serial serinput(.xtal(xtal), .serial(serial), .data_reg(data), .current_bit(current_bit), .data_good(data_good), .edge_counter(edge_counter));
+endmodule
+
+
+module POS_Serial(
+ input xtal,
+ input serial,
+ output reg [11:0] data_reg = 0,
+ output reg [3:0] current_bit = 0,
+ output reg [4:0] edge_counter = 0,
+ output reg data_good = 0);
+
+ reg serial_1a;
+
+ always @(posedge xtal)
+ serial_1a <= serial;
+
+ wire edge_detect = serial ^ serial_1a;
+
+
+ always @(posedge xtal) begin
+ data_good <= 0;
+
+ if (edge_detect) begin
+ if (edge_counter == 31) begin
+ current_bit <= 0;
+// data_reg <= 0;
+ end else begin
+ // data_reg[11:1] = data_reg[10:0];
+ // data_reg[0] = (edge_counter > 20);
+ data_reg[current_bit] <= ((edge_counter > 20) ? 1'b1 : 1'b0);
+ if (current_bit == 11) begin
+ current_bit <= 0;
+ end else
+ current_bit <= current_bit + 1;
+ end
+
+ edge_counter <= 0;
+ end else begin
+ if (edge_counter != 31)
+ edge_counter <= edge_counter + 1;
+ end