111 lines
3.4 KiB
Verilog

module uart_tx_control
(
input clk_50m,
input rst_n,
input uart_tx_done,
input start_sig,
input [31:0] uart_data_a,
input [31:0] uart_data_b,
input [1:0] mod,
output [7:0] uart_tx_data,
output tx_sig_q,
output uart_tx_en
);
parameter clk_pw_div_1 = 16'd44999;
parameter clk_pw_div_2 = 16'd249999;
reg [4:0] state;
reg [7:0] uart_tx_data_r;
reg tx_en_r;
reg tx_sig;
reg [31:0] uart_data_a_buf;
reg [31:0] uart_data_b_buf;
reg start_sig_buf;
reg [2:0] state_sweep;
reg [2:0] state_piont;
reg [22:0] clk_cnt;
always@(posedge clk_50m or negedge rst_n)
begin
if(!rst_n)
begin
start_sig_buf <= 1'd0;
state_sweep <= 3'd0;
state_piont <= 3'd0;
clk_cnt <= 23'd0;
end
else if(mod == 2'b01)//扫频
begin
state_piont <= 3'd0;
case(state_sweep)
3'd0:begin start_sig_buf<=1'd0; clk_cnt<=15'd0; state_sweep<=3'd1;end
3'd1:begin if(start_sig) state_sweep<=2'd2;end
3'd2:begin if(clk_cnt==clk_pw_div_1) state_sweep<=3'd3; else clk_cnt<=clk_cnt+23'd1;end
3'd3:begin start_sig_buf<=1'd1; state_sweep<=3'd0; end
endcase
end
else if(mod == 2'b10)//点频
begin
state_sweep <= 3'd0;
case(state_piont)
3'd0:begin start_sig_buf<=1'd0; clk_cnt<=15'd0; state_piont<=3'd1;end
3'd1:begin if(start_sig) state_piont<=2'd2;end
3'd2:begin start_sig_buf<=1'd0; if(clk_cnt==clk_pw_div_2) state_piont<=3'd3; else clk_cnt<=clk_cnt+23'd1;end
3'd3:begin start_sig_buf<=1'd1; clk_cnt<=15'd0; state_piont<=3'd2; end
endcase
end
else
begin
start_sig_buf <= 1'd0;
state_sweep <= 3'd0;
state_piont <= 3'd0;
clk_cnt <= 15'd0;
end
end
always@(posedge clk_50m or negedge rst_n)
begin
if(!rst_n)
begin
uart_data_a_buf <= 28'd0;
uart_data_b_buf <= 28'd0;
end
else if(start_sig_buf)
begin
uart_data_a_buf <= uart_data_a;
uart_data_b_buf <= uart_data_b;
end
end
always@(posedge clk_50m or negedge rst_n)
begin
if(!rst_n)
begin
state <= 5'd0;
tx_sig <= 1'd0;
uart_tx_data_r <= 8'd0;
tx_en_r <= 1'd0;
end
else
begin
case(state)
5'd0:begin if(start_sig_buf)begin state<=state+1; tx_sig<=0; tx_en_r<=1; end end
5'd1:begin uart_tx_data_r<=8'h99; tx_en_r<=1; state<=state+1; end
5'd2:begin if(uart_tx_done) begin uart_tx_data_r<=8'h24; tx_en_r<=1; state<=state+1; end end
5'd3:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_a_buf[7:0]; tx_en_r<=1; state<=state+1; end end
5'd4:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_a_buf[15:8]; tx_en_r<=1; state<=state+1; end end
5'd5:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_a_buf[23:16]; tx_en_r<=1; state<=state+1; end end
5'd6:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_a_buf[31:24]; tx_en_r<=1; state<=state+1; end end
5'd7:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_b_buf[7:0]; tx_en_r<=1; state<=state+1; end end
5'd8:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_b_buf[15:8]; tx_en_r<=1; state<=state+1; end end
5'd9:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_b_buf[23:16]; tx_en_r<=1; state<=state+1; end end
5'd10:begin if(uart_tx_done) begin uart_tx_data_r<=uart_data_b_buf[31:24]; tx_en_r<=1; state<=state+1; end end
5'd11:begin tx_en_r<=0; state<=state+1; end
5'd12:begin if(uart_tx_done) begin tx_sig<=1; state<=5'd0;end end
default:begin state <= 0; end
endcase
end
end
assign uart_tx_data = uart_tx_data_r;
assign uart_tx_en = tx_en_r;
assign tx_sig_q = tx_sig;
endmodule