61 lines
1.9 KiB
Verilog

module uart_rx_control
(
input clk_50m,
input rst_n,
input uart_rx_done,
input [7:0] uart_rx_data,
output [31:0] data_out_0,
output [15:0] data_out_1,
output [15:0] data_out_2,
output uart_done
);
reg [31:0] uart_data_buf_0;
reg [31:0] data_out_r_0;
reg [15:0] uart_data_buf_1;
reg [15:0] data_out_r_1;
reg [15:0] uart_data_buf_2;
reg [15:0] data_out_r_2;
reg [4:0] state;
reg uart_done_buf;
always@(posedge clk_50m or negedge rst_n)
begin
if(!rst_n)
begin
state <= 4'd0;
uart_data_buf_0 <= 32'd0;
uart_data_buf_1 <= 15'd0;
uart_data_buf_2 <= 15'd0;
uart_done_buf <= 1'd0;
end
else
begin
case(state)
5'd0:begin uart_done_buf<=1'd0; state<=state+1; end
5'd1:if((uart_rx_data == 8'h99)&&uart_rx_done)begin state<=state+1; end
5'd2:if((uart_rx_data == 8'h50)&&uart_rx_done)begin state<=state+1; end
5'd3:if(uart_rx_done)begin uart_data_buf_0[7:0]<=uart_rx_data; state<=state+1; end
5'd4:if(uart_rx_done)begin uart_data_buf_0[15:8]<=uart_rx_data; state<=state+1; end
5'd5:if(uart_rx_done)begin uart_data_buf_0[23:16]<=uart_rx_data; state<=state+1; end
5'd6:if(uart_rx_done)begin uart_data_buf_0[31:24]<=uart_rx_data; state<=state+1; end
5'd7:if(uart_rx_done)begin uart_data_buf_1[7:0]<=uart_rx_data; state<=state+1; end
5'd8:if(uart_rx_done)begin uart_data_buf_1[15:8]<=uart_rx_data; state<=state+1; end
5'd9:if(uart_rx_done)begin uart_data_buf_2[7:0]<=uart_rx_data; state<=state+1; end
5'd10:if(uart_rx_done)begin uart_data_buf_2[15:8]<=uart_rx_data; state<=state+1; end
5'd11:begin data_out_r_0<=uart_data_buf_0;
data_out_r_1<=uart_data_buf_1;
data_out_r_2<=uart_data_buf_2;
uart_done_buf<=1'd1; state<=4'd0;
end
endcase
end
end
assign data_out_0 = data_out_r_0;
assign data_out_1 = data_out_r_1;
assign data_out_2 = data_out_r_2;
assign uart_done = uart_done_buf;
endmodule