`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/11/25 13:30:32
// Design Name:
// Module Name: uart
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module uart #
(
parameter num_cnt2=4'd9
)
(
input clk_sys ,
input rst_n ,
input i_uart ,
output reg[7:0] o_led ,
output reg o_cnt_flag ,
input[1:0]i_sel_bps
);
reg reg1_uart;
reg reg2_uart;
reg reg3_uart;
reg [17:0] para_bps;
reg [17:0]cnt1;
reg [3:0]cnt2;
always@(*)
begin
case(i_sel_bps)
2'b0:para_bps<=104167;//9600
2'b1:para_bps<=8681;//115200
default:para_bps<=104167;//9600
endcase
end
// inter_clock
always@(posedge clk_sys or negedge rst_n )
begin
if(rst_n==0)
begin
reg1_uart<=0;
reg2_uart<=0;
reg3_uart<=0;
end
else
begin
reg1_uart<=i_uart;
reg2_uart<=reg1_uart ;
reg3_uart<=reg2_uart;
end
end
//negedge check & output o_cnt_flag
always@(posedge clk_sys or negedge rst_n )
begin
if(rst_n==0)
o_cnt_flag<=0;
else if(reg2_uart==1&®3_uart==0)
o_cnt_flag<=1;
else if(cnt2==num_cnt2-1)
o_cnt_flag<=0;
else
o_cnt_flag<=o_cnt_flag;
end
//cnt1
always@(posedge clk_sys or negedge rst_n )
begin
if(rst_n==0)
cnt1<=0;
else if(cnt1==para_bps-1)
cnt1<=0;
else if(o_cnt_flag)
cnt1<=cnt1+1;
else
cnt1<=cnt1;
end
//cnt2
always@(posedge clk_sys or negedge rst_n )
begin
if(rst_n==0)
cnt2<=0;
else if(cnt2==num_cnt2-1)
cnt2<=0;
else if(cnt1==para_bps-1)
cnt2<=cnt2+1;
else
cnt2<=cnt2;
end
//LED
always@(posedge clk_sys or negedge rst_n )
begin
if(rst_n==0)
o_led<=0;
else if(cnt2==num_cnt2/2-1)
o_led[cnt2-1]<=i_uart;
else
o_led<=o_led;
end