UART原理
通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片,通常集成于其他通讯接口的连结上。
1、UART发送
数据的发送实际上就是按照帧格式将寄存器中的并行数据转为串行数据,为其加上起始位和停止位,以一定的波特率进行传输。波特率可以有多种选择,如9600bits/s,14400bits/s,19200bits/s,38400bits/s等
2、UART接收
由于传输中有可能会产生毛刺,接收端极有可能将毛刺误认为是起始位,所以要对检测到的下降沿进行判别。一般采用如下的方法:取接收端的时钟频率是发送频率的16倍频,当检测到一个下降沿后,在接下来的16个周期内检测数据线上“0”的个数,若“0”的个数超过8个或者10(根据具体情况设置),则认为是起始位到来,否则认为起始位没有到来,继续检测传输线,等待起始位。
3、发送主要代码
//==============================================================================
//开始发送使能
//==============================================================================
reg start_trig_reg1 ;//延迟一拍触发信号
reg start_en ;//开始发送使能信号
always @ (posedge i_100m_clk or negedge i_rst_n)
if(!i_rst_n)
start_trig_reg1 <=1'b0;
else
start_trig_reg1 <= i_start_trig ;
always @ (posedge i_100m_clk or negedge i_rst_n)
if(!i_rst_n)
start_en <= 1'b0 ;
else if(!start_trig_reg1&&i_start_trig)//检测触发信号上升沿
start_en <= 1'b1 ;
else
start_en <= 1'b0 ;
//==============================================================================
//波特率计算
//==============================================================================
always @ (posedge i_100m_clk or negedge i_rst_n)
if(!i_rst_n)
time_cnt <= 10'h0 ;
else if(crt_state==IDLE)
time_cnt <= 10'b0 ;
else if(time_cnt=