串口协议简介
串口通讯(Universal Asynchronous Receiver/Transmitter,UART)是一种异步传输的通用数据总线,包括了RS232、RS485等接口标准和总线标准,传输简单,将数据在串行通信与并行通信之间转换,可以实现全双工发送和接收。 UART的工作原理是将数据的每一个bit从低到高,依次输出到总线上,其通信协议时序如下:

如上图所示,为串口协议进行数据传输的时序状态。一个完整的字节传输包括了1个起始位,8个数据位和1个停止位,总共10位数据来计算。其中,数据位可设置为5、6、7或者8(默认)。波特率(Baud)表示串口设备数据传输的速率,在图中,垂直虚线表示进行数据的切换,中间的黑点表示数据采样点。典型的波特率设置一般为9600、19200、38400、57600和115200,波特率越高,数据的传输越快。
串口发送
根据串口通信的时序,在FPGA上实现串口的发送设计。
波特率时钟计算
在进行串口发送时,需要进行波特率的时钟计算,来确定当前发送的数据时钟。首先计算出对应波特率的时钟周期,假设波特率为115200,其时钟周期为1000000000/115200=8680.6ns,根据当前的系统时钟(sys_clk)频率,算出时钟计数值。波特率时钟计数值的代码如下:
localparam BUAT_RATE9600 = 3'd0,
BUAT_RATE19200 = 3'd1,
BUAT_RATE38400 = 3'd2,
BUAT_RATE57600 = 3'd3,
BUAT_RATE115200 = 3'd4;
localparam BUAT_SENDRATE9600 = 17'd104167/SYS_CLOCK_PERIOD - 1,
BUAT_SENDRATE19200 = 16'd52083/SYS_CLOCK_PERIOD - 1,
BUAT_SENDRATE38400 = 15'd26041/SYS_CLOCK_PERIOD - 1,
BUAT_SENDRATE57600 = 15'd17361/SYS_CLOCK_PERIOD - 1,
BUAT_SENDRATE115200 = 14'd8680/SYS_CLOCK_PERIOD - 1;
always@(posedge sys_clk_i or negedge rst_n)begin
if(!rst_n)
bsp_DR <= BUAT_SENDRATE9600;
else begin
case(buad_set_i)
BUAT_RATE9600: bsp_DR <= BUAT_SENDRATE9600;
BUAT_RATE19200: bsp_DR <= BUAT_SENDRATE19200;
BUAT_RATE38400: bsp_DR <= BUAT_SENDRATE38400;
BUAT_RATE57600: bsp_DR <= BUAT_SENDRATE57600;
BUAT_RATE115200: bsp_DR <= BUAT_SENDRATE115200;
default:bsp_DR <= BUAT_SENDRATE9600;
endcase
end
end
分频计数
在计算出波特率的计数值后,利用计数器来生成波特率的时钟,实现代码如下:
always@(posedge sys_clk_i or negedge rst_n)begin
if(!rst_n)
bsp_div_cnt <= 13'd0;
else if(ua

本文详细介绍了UART串口通信的工作原理,包括起始位、数据位和停止位的传输时序。通过FPGA实现串口发送和接收,涉及到波特率计算、分频计数、数据采样及错误检测。在发送部分,展示了如何根据系统时钟生成波特率时钟和发送数据;在接收部分,使用多次采样判断数据位,确保数据准确性。此外,还提供了仿真测试结果以验证设计的正确性。
最低0.47元/天 解锁文章
900

被折叠的 条评论
为什么被折叠?



