- 串口简介
通用异步收发传输器,简称UART。
UART是一种通用的数据通信协议,发送数据时将并行数据转换为串行数据来传输,接收数据时将接收到的串行数据转换为并行数据。
- 整体原理绘制框图:
- 绘制UART-RX波形
使用多级寄存器,减少亚稳态,如下图所示:
经过三级寄存器,减少亚稳态。
时钟周期为20ns,波特率为9600,可以计算出一个波特占用的周期数如下:
(1/9600*10^9)/20=5208(个)
取中间值做信号提取,波形图如下:
编写串口模块代码如下:
module uart_rx
#(
parameter UART_BPS = 'd9600 ,
parameter CLK_FREQ = 'd50_000_000
)
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire rx ,
output reg [7:0] po_data ,
output reg po_flag
);
parameter BAUD_CNT_MAX = CLK_FREQ / UART_BPS;
reg rx_reg1 ;
reg rx_reg2 ;
reg rx_reg3 ;
reg start_flag ;
reg work_en ;
reg [12:0] baud_cnt ;
reg bit_flag ;
reg [3:0] bit_cnt ;
reg [7:0] rx_data ;
reg rx_flag ;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
rx_reg1 <= 1'b1;
else
rx_reg1 <= rx;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
rx_reg2 <= 1'b1;
else
rx_reg2 <= rx_reg1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
rx_reg3 <= 1'b1;
else
rx_reg3 <= rx_reg2;
always@(posedge sys_clk or negedge sy