Fixed uart device outputting data when not enabled. Also fixed uart using the wrong cycles per bit value.
diff --git a/verilog/rtl/Peripherals/UART/UARTDevice.v b/verilog/rtl/Peripherals/UART/UARTDevice.v index c6b6e25..e52e86f 100644 --- a/verilog/rtl/Peripherals/UART/UARTDevice.v +++ b/verilog/rtl/Peripherals/UART/UARTDevice.v
@@ -181,7 +181,7 @@ .clk(clk), .rst(rst || (clearWriteData[0] && clearWriteEnable && peripheralBus_byteSelect[0])), .cyclesPerBit(cyclesPerBit), - .rx(uart_rx), + .rx(uart_en ? uart_rx : 1'b1), .dataOut(rxByteIn), .dataAvailable(rxOutAvailable)); @@ -192,7 +192,7 @@ .rst(rst || (clearWriteData[1] && clearWriteEnable && peripheralBus_byteSelect[0])), .cyclesPerBit(cyclesPerBit), .tx(uart_tx), - .blockTransmition(1'b0), + .blockTransmition(!uart_en), .busy(txSendBusy), .dataIn(txByteOut), .dataAvailable(txByteOutAvailable));
diff --git a/verilog/rtl/Peripherals/UART/UART_rx.v b/verilog/rtl/Peripherals/UART/UART_rx.v index 6e983ff..bf8e8ce 100644 --- a/verilog/rtl/Peripherals/UART/UART_rx.v +++ b/verilog/rtl/Peripherals/UART/UART_rx.v
@@ -15,14 +15,15 @@ localparam STATE_WAIT_FULL = 2'b10; localparam STATE_WAIT_HIGH = 2'b11; - reg [1:0] state = STATE_IDLE; - reg [CLOCK_SCALE_BITS-1:0] delayCounter = {CLOCK_SCALE_BITS{1'b0}}; - reg [2:0] bitCounter = 3'b0; - reg [7:0] savedData = 8'b0; + reg[1:0] state = STATE_IDLE; + reg[CLOCK_SCALE_BITS-1:0] delayCounter = {CLOCK_SCALE_BITS{1'b0}}; + wire[CLOCK_SCALE_BITS-1:0] nextDelayCounter = delayCounter + 1; + + reg[2:0] bitCounter = 3'b0; + reg[7:0] savedData = 8'b0; reg newData = 1'b0; wire[CLOCK_SCALE_BITS-1:0] halfBitCounterValue = { 1'b0, cyclesPerBit[CLOCK_SCALE_BITS-1:1] }; - wire[CLOCK_SCALE_BITS-1:0] fullBitCounterValue = cyclesPerBit[CLOCK_SCALE_BITS-1:1] - 1; always @(posedge clk) begin if (rst) begin @@ -51,16 +52,16 @@ end STATE_WAIT_HALF: begin - if (delayCounter == halfBitCounterValue) begin + if (nextDelayCounter == halfBitCounterValue) begin delayCounter = 0; state = STATE_WAIT_FULL; end else begin - delayCounter = delayCounter + 1; + delayCounter = nextDelayCounter; end end STATE_WAIT_FULL: begin - if (delayCounter == fullBitCounterValue) begin + if (nextDelayCounter == cyclesPerBit) begin savedData = {rx, savedData[7:1]}; delayCounter = 0; if (bitCounter == 3'h7) begin @@ -68,7 +69,7 @@ newData = 1'b1; end else bitCounter = bitCounter + 1; end else begin - delayCounter = delayCounter + 1; + delayCounter = nextDelayCounter; end end
diff --git a/verilog/rtl/Peripherals/UART/UART_tx.v b/verilog/rtl/Peripherals/UART/UART_tx.v index 6c78d5b..3fc73a5 100644 --- a/verilog/rtl/Peripherals/UART/UART_tx.v +++ b/verilog/rtl/Peripherals/UART/UART_tx.v
@@ -19,13 +19,12 @@ reg[1:0] state = STATE_IDLE; reg[CLOCK_SCALE_BITS-1:0] delayCounter = {CLOCK_SCALE_BITS{1'b0}}; + wire[CLOCK_SCALE_BITS-1:0] nextDelayCounter = delayCounter + 1; + reg[2:0] bitCounter = 3'b0; reg[7:0] savedData = 8'b0; reg outputBuffer = 1'b0; - wire[CLOCK_SCALE_BITS-1:0] nextDelayCounter = delayCounter + 1; - wire[CLOCK_SCALE_BITS-1:0] fullBitCounterValue = cyclesPerBit[CLOCK_SCALE_BITS-1:1] - 1; - always @(posedge clk) begin if (rst) begin state = STATE_IDLE; @@ -66,7 +65,7 @@ STATE_START_BIT: begin outputBuffer = 1'b0; - if (delayCounter == fullBitCounterValue) begin + if (nextDelayCounter == cyclesPerBit) begin delayCounter = 0; state = STATE_DATA; end else begin @@ -77,7 +76,7 @@ STATE_DATA: begin outputBuffer = savedData[bitCounter]; - if (delayCounter == fullBitCounterValue) begin + if (nextDelayCounter == cyclesPerBit) begin delayCounter = 0; if (bitCounter == 3'h7) state = STATE_STOP_BIT; else bitCounter = bitCounter + 1; @@ -89,7 +88,7 @@ STATE_STOP_BIT: begin outputBuffer = 1'b1; - if (delayCounter == fullBitCounterValue) begin + if (nextDelayCounter == cyclesPerBit) begin state = STATE_IDLE; end else begin delayCounter = nextDelayCounter;