You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
64 lines
1.8 KiB
|
|
module uart ( input CLK, input RESET, input TX_SIGNAL, input [7:0] TX_BYTE,
|
|
output TX_ACTIVITY, output TX_LINE);
|
|
// CLK - INPUT CLOCK (12 MHZ FOR ICESTICK), RESET: IF RESET == 0, MODULE RESETS
|
|
// TX_SIGNAL - SIGNAL TO START TRANSMISSION (RISING EDGE), TX_BYTE - BYTE TO TRANSMIT
|
|
// TX_ACTIVITY = 1, IF SOME BYTE IS TRANSMITTING NOW, ELSE - 0
|
|
// TX_LINE - LINE OF UART_TX,
|
|
// IF BYTE IS TRANSMITTING, ATTEMPT TO TRANSMIT OTHER BYTE HAS NO EFFECT
|
|
// MODULE WORKS AT POSEDGE
|
|
|
|
//parameter CLK_DIV = 13; // 921600
|
|
//parameter CLK_DIV = 5000; // 2400
|
|
parameter CLK_DIV = 104; // 115200
|
|
reg TX_sig_last;
|
|
reg [3:0] tx_bit_counter;
|
|
reg [6:0] tx_clk_counter; // MUST CONTAIN CLK DIV
|
|
//reg [7:0] tx_data;
|
|
reg tx_activity;
|
|
reg tx_line;
|
|
initial begin
|
|
TX_sig_last = 0;
|
|
tx_line = 1;
|
|
end
|
|
|
|
always @ (negedge CLK) begin
|
|
if (RESET == 0) begin
|
|
/*tx_data = 0;*/ //tx_clk_counter = 0;
|
|
tx_activity = 0;
|
|
end
|
|
|
|
else begin
|
|
if (tx_activity) begin
|
|
tx_clk_counter = tx_clk_counter - 1;
|
|
if (tx_clk_counter == 0) begin
|
|
tx_clk_counter = CLK_DIV;
|
|
if (tx_bit_counter == 0)
|
|
tx_activity = 0;
|
|
else begin
|
|
tx_bit_counter = tx_bit_counter - 1;
|
|
if (tx_bit_counter > 0)
|
|
tx_line = TX_BYTE[8-tx_bit_counter];
|
|
else
|
|
tx_line = 1; // STOP_BIT
|
|
end
|
|
end
|
|
end
|
|
else begin
|
|
if ((TX_SIGNAL == 1) && (TX_sig_last == 0)) begin
|
|
//tx_data = TX_BYTE;
|
|
tx_activity = 1;
|
|
tx_bit_counter = 9; // NO PARITY, STOP 1 BIT
|
|
tx_clk_counter = CLK_DIV;
|
|
tx_line = 0; // START BIT
|
|
end
|
|
end
|
|
TX_sig_last = TX_SIGNAL;
|
|
end
|
|
end
|
|
|
|
assign TX_LINE = tx_line;
|
|
assign TX_ACTIVITY = tx_activity;
|
|
|
|
endmodule
|