MMC/rtl/peripherals/UART_TX.v
JefferyLi0903 38ecdbb1b1 fix: style
2023-05-06 13:47:13 +08:00

74 lines
1.8 KiB
Verilog

module UART_TX (
input clk ,
input clk_uart,
input RSTn ,
input [7:0] data ,
input tx_en ,
output reg TXD ,
output wire state ,
output wire bps_en
);
//FIFO 8bit-16depth
wire FIFOrd_en;
wire FIFOwr_en;
wire [7:0] FIFOdata ;
wire FIFOempty;
wire FIFOfull ;
FIFO FIFO (
.clock(clk ),
.sclr (RSTn ),
.rdreq(FIFOrd_en),
.wrreq(FIFOwr_en),
.full (FIFOfull ),
.empty(FIFOempty),
.data (data ),
.q (FIFOdata )
);
//FIFO write control
assign FIFOwr_en = (~FIFOfull) & tx_en;
assign state = FIFOfull;
//UART TX
reg counter_en;
reg [3:0] counter ;
wire trans_finish;
assign trans_finish = (counter == 4'hb);
wire trans_start;
assign trans_start = (~FIFOempty) & (~counter_en);
always@(posedge clk or negedge RSTn) begin
if(~RSTn) counter_en <= 1'b0;
else if(trans_start) counter_en <= 1'b1;
else if(trans_finish) counter_en <= 1'b0;
end
always@(posedge clk or negedge RSTn) begin
if(~RSTn) counter <= 4'h0;
else if(counter_en) begin
if(clk_uart) counter <= counter + 1'b1;
else if(trans_finish) counter <= 4'h0;
end
end
assign bps_en = counter_en;
wire [9:0] data_formed;
assign data_formed = {1'b1,FIFOdata,1'b0};
always@(posedge clk or negedge RSTn) begin
if(~RSTn) TXD <= 1'b1;
else if(counter_en) begin
if(clk_uart && (counter <= 4'h9)) TXD <= data_formed[counter];
end else TXD <= 1'b1;
end
//FIFO read control
assign FIFOrd_en = (~FIFOempty) & trans_finish;
endmodule