UART 传输时序
发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数
据位的时间 T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和
停止位(停止位为高电位),一帧资料发送结束。
接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电
位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接
收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或
存入缓存。
由于 UART 是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART
采用 16 倍数据波特率的时钟进行采样。每个数据有 16 个时钟采样,取中间的采样值,以保
证采样不会滑码或误码。一般 UART 一帧的数据位数为 8,这样即使每个数据有一个时钟的
误差,接收端也能正确地采样到数据。
UART 的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这
时计数器 CNT 开始计数,当计数器为 24=16+8 时,采样的值为第 0 位数据;当计数器的值
为 40 时,采样的值为第 1 位数据,依此类推,进行后面 6 个数据的采样。如果需要进行奇
偶校验,则当计数器的值为 152 时,采样的值即为奇偶位;当计数器的值为 168 时,采样的
值为“1”表示停止位,一帧数据接收完成。本节章将按上面的算法进行 Verilog HDL 语言建
模与仿真。
UART 分频器
假设数据的波特率为 p,则所需时钟的频率为 16*p。以波特率 p 为 115200 为例,系统
时钟为 50MHz,则分频系数为50000000/(16*115200) = 27.127,取整为 27。分频器 Verilog HDL
语言代码如下:
module clkdiv(clk, clkout);
input clk; //系统时钟
output clkout; //采样时钟输出
reg clkout;
reg [15:0] cnt;
always @(posedge clk) //分频进程
begin
if(cnt == 16'd12)
begin
clkout <= 1'b1;
cnt <= cnt + 16'd1;
end
else if(cnt == 16'd26)
begin
clkout <= 1'b0;
cnt <= 16'd0;
评论5