UART:universal asynchronous receiver-transmitter通用异步收发,控制器与外部设备进行数据通信无非两种,一种是串行通信另一种是并行通信。并行通信在早期的计算机系统中很常见,它相比串行通信在相同时钟下有着更高的速度。可以简单的理解成并行通信传输的数据线不止一根,而是由多根组成。但是随着CPU的频率越来越高,和外部器件的工作频率的提升,并行通信的弊端也随之而来:由于外界环境干扰并行通信的数据线上的信号并不是同一时刻到达,这就导致在实际信号传送和接收在时钟采样下建立时间和保持时间不满足,产生亚稳态,数据传输有差错。还有就是一根线的数据出错这一次的传输的所有数据都需要重新传输。对比并行通信串行通信的优势就体现出来了。串行通信能比并行通信跑的时钟频率要高。
串行通信我们常听到的有SPI,IIC,UART,其中异步的UART,和同步传输的SPI,IIC,最大不同是UART发送端不需要给接收端时钟,但要保证双方的波特率一致。而spi和IIC是要给从设备时钟,一般spi和IIC常用于一些传感器(AD/DA),FLASH等设备
UART是双工通信方式,其中常用的是全双工,与外设相连只需三根线,TXD:发送端,RXD:接收端,GND:地。发送时需要将数据由并行转换为串行传输,在接收端将数据由串行转换为并行。
以下为RS232,UART传输时序如下:
发送端:为了便于仿真观察将波特率设置很高,如有需求可以自己更改
module uart_send(
input sclk,
input rst_n,
input [7:0] urat_din,
input urat_en,
output urat_txd
);
parameter CLK_FREQ = 50000000; //系统时钟频率
parameter UART_BPS = 9600; //串口波特率
localparam DIV_CNT = 8; // CLK_FREQ/UART_BPS,分频计数5208(1 0100 0101 1000)个系统时钟周期为一个数据的发送周期
reg [12:0] cnt;//计数器
reg [2:0] urat_en_r;//用于检测urat_en下降沿
reg send_flag;//发送阶段标志
wire tx_flag;//给发送标志上标志的标志
reg [7:0] tx_data;
reg [3:0] tx_cnt;
reg