(已通过板级验证)
Uart: 异步串口通信
Uart: Universal Asynchronous Transmitter/Receiver 是异步串口通信的总称。 在其数据发送时将并行输入的数据转换成串行输出,在接受数据时将串行数据转换为并行数据输出。
通信协议: UART, IIC, SPI, USE, Ethernet
RS232,RS449,RS423,RS485是接口标准规范和总线标准规范,规定了通信口的电器特性,传输速率,连接特性和接口的机械特性等。
Uart 管脚
我们现在只用到pin2和pin3,也就是tx发送数据和rx接受数据。
Uart 关键参数以及时序图
- 数据位(Data bits): 该参数定义单个UART数据传输从开始到停止期间发送的数据位数。可选择: 5,6,7,8(默认)。
- 波特率(Buad):从一设备发送到另一设备的波特率,即每秒钟可以通信的数据比特个数。典型的波特率:300,1200,2400,9600,19200,115200。例:当波特率为2400时, 也就是1秒传输2400比特的数据,所以1比特需要416666 ns。
- 开始位(Start bit): 在数据发送之前,发送开始位,来标志着传输开始。从高电平‘1’变为低电平‘0’;
- 停止位(Stop bit): 在每个字节的数据为发送完成之后,发送停止位,来标志着一次数据传输完成。可选择为:1 (默认),1.5 或 2 位。
RS-232 标准中,常用的配置时8N1(8个数据位,无奇偶校验,一个停止位)
1: 1位起始位 :0
2: 8位数据位: 低位先输出
3: 1位停止位:0
实现的逻辑功能:
start: 脉冲信号,出现一次传输一次数据;(连接到按键)
data_byte: 八位输入数据;
baud_set: 波特率设置;
rs232_tx: 串行输出数据;
tx_done: 完成信号,当传输完成为1,传输信号为0;
uart_state: 空闲置0,工作置1;
VHDL 代码实现
Baud LUT
由Baud LUT实现通过baud_set[2:0]来选择相应的波特率,产生bps_clk.
本实验中硬件开发板的系统时钟为50MHZ,也就是时钟周期为20ns,所以 当波特率为9600, 传输一个数据需要(1*10^9 ns/9600) / 20 ns -1 = 5208-1 次 时钟周期
case( baud_set ) is
when "000" => baud_bps<= 166666; -- 300
when "001" => baud_bps<= 41666; -- 1200
when "010" => baud_bps<= 20832; -- 2400
when "011" => baud_bps<= 5207; -- 9600
when "100" => baud_bps<= 2603; -- 19200
when "101" => baud_bps<= 1301; -- 38400
when "110"