UART介绍
通用异步收发器(Univeral Asynchronous Receiver/Transmitter,UART)。UART相关特点的总结如下表所示。
特点 | UART | 解释 |
---|---|---|
信号线 | RX TX | RX负责接收、TX负责发送。 |
通信方式 | 全双工通信 | 通信允许数据在两个方向上同时传输,即RX接收数据时,TX可以发送数据。 |
通信特征 | 异步串行 | 数据以帧为单位串行传输,一帧可以包含5/6/7/8位数据。由于UART为异步通信协议,不含同步时钟,收发双方通过约定相同的波特率来传输数据,波特率的单位为bit/s(位/秒),常用的波特率为115200 bit/s或9600 bit/s。 |
传输单位 | 帧 | UART以帧为单位传输数据,一个帧由4部分组成,分别是起始位、数据位、奇偶校验位、停止位。起始位表示一帧数据的开始,一般为1 bit的0;数据位保存需要传递的数据,一般为5/6/7/8 bit数据;奇偶检验位负责对传输的数据进行检查,用于检验数据在传输时是否出错;停止位表示一帧数据的结束,一般为1 bit、1.5 bit或2 bit的1。 |
UART实现
约定UART的帧格式和波特率。
- 帧格式
- 起始位:1 bit,0有效。
- 数据位:8 bit。
- 奇偶校验位:0 bit
- 停止位:1 bit,1有效。
- 波特率
- 9600 bit/s
传输模块
`timescale 1ns / 1ps
module uart_tx (
input wire clk_i,
input wire rst_i,
input wire [7:0] data_i,
input wire tx_en_i,
output reg tx_data_o
);
// 波特率 9600
parameter BPS = 9600;
// 时钟频率 50MHz
parameter CLK_FREQ = 50000000;
localparam BPS_CNT = CLK_FREQ / BPS;
localparam IDLE = 0;
localparam START = 1;
localparam SEND = 2;
localparam STOP = 3;
// 分频计数
reg [31:0] count;
// 已传输的bit数
reg [31:0] send_count;
reg [1:0] cur_state;
reg [1:0] next_state;
// 三段式状态机
// cur_state
always @ (posedge clk_i) begin
if(rst_i == 1'b1) begin
cur_state <= IDLE;
end else begin
cur_state <= next_state;
end
end
// next_state
always @ (*) begin
case(cur_state)
IDLE : begin
if(tx_en_i == 1'b1) begin
next_state = START;
end else begin
next_state = IDLE;
end
end
START : begin
if(count == BPS_CNT - 1) begin
next_state = SEND;
end else begin
next_state = START;
end
end
SEND : begin
if(send_count == 8 - 1 && count == BPS_CNT - 1) begin
next_state = STOP;
end else begin
next_state = SEND;
end
end
STOP : begin
if(count == BPS_CNT - 1) begin
next_state = IDLE;
end else begin
next_state = STOP;
end
end
default : next_state = IDLE;
endcase
end
// count
always @ (posedge clk_i) begin
if(rst_i == 1'b1) begin
count <= 0<