串行通信
AI summary
文档详细介绍了基于UART协议的串行通信,包括接收器和发送器的实现、数据格式、波特率设置、全双工功能测试以及基于FPGA的通信显示系统设计。重点讨论了UART的工作原理、数据传输过程、波特率调节和简易通信显示系统的架构与实现。
Last edited time
Sep 24, 2024 06:58 AM
Last edited by
Tags
Serial Communication
Communication Protocols
Data Transmission Methods
通信基本知识一:处理器和外围设备通信的方式二:串行通信的通信方式三:串行通信的通信方向四:常用的串行通信(3大串行总线协议)五:UART(通用异步收发器)六:UART接收器实现七:UART发送器实现八:UART发送/接收器波特率可调节九:UART全双工功能测试十:练习基于FPGA的通信显示系统一:简易通信显示系统二:图像采集系统三:简易通信显示系统分析四:简易通信显示系统架构五:练习
通信基本知识
一:处理器和外围设备通信的方式
- 并行通信
发送设备和接收设备交互数据时,通过多条数据线对数据进行同时传输。
优点:传输数据速度快
缺点:占用引脚资源多
- 串行通信
发送设备和接收设备交互数据时,通过一条数据线对数据一位一位进行传输。
MSB(高位)~LSB(低位):高位数据优先 LSB~MSB:低位数据优先
优点:线路简单(占用引脚资源少)
缺点:传输数据速度慢
二:串行通信的通信方式
- 同步通信
发送设备和接收设备传输数据时,需要采用同步时钟来进行数据的交互。
- 异步通信
发送设备和接收设备传输数据时,发送设备可以拟定时钟进行数据的发送;接收设备也可以拟定时钟用于数据的接收。
三:串行通信的通信方向
- 单工
数据只能沿一个方向进行传输。
- 半双工
数据可以沿两个方向进行传输,但需要分时进行。
时间1:可以认为是数据的写入(FPGA和存储器间的通信)
时间2:可以认为是数据的读取(存储器和FPGA间的通信)
- 全双工
数据可以同时沿两个方向进行传输。
四:常用的串行通信(3大串行总线协议)
通信协议 | 通信接口 | 通信方式 | 通信方向 | 说明 |
UART:通用异步收发器 | TXD,RXD | 异步通信 | 全双工 | |
SPI:串行外设接口 | CS_N,SCLK,MISO,MOSI | 同步通信 | 全双工 | |
IIC:集成电路总线 | SCL,SDA | 同步通信 | 半双工 |
- UART
Universal Asynchronous Receiver-Transmitter:通用异步收发器(俗称串口)。
- SPI(4线制)
Serial Peripheral Interface:串行外设接口
- IIC
Inter-Integrated Circuit(集成电路总线)
assign SDA = (en == 1’b1) ? sda_buff : 1’bz;
五:UART(通用异步收发器)
- 物理层
引脚编号 | 端口描述 |
Pin1 | 悬空 |
Pin2 | RXD:接收信号线 |
Pin3 | TXD:发送信号线 |
Pin4~pin9 | 悬空/接地 |
在ZX-1开发板原理图中,电平标准采用MAX232电平转换芯片。
可以详见max232手册。
- 协议层
(1):数据格式
数据格式中要求:起始位、数据位、校验位、停止位…
校验位:奇校验/偶校验/忽略校验
奇校验:数据中1的个数为奇数时,校验位为0,反之为1;
偶校验:数据中1的个数为偶数时,校验位为0,反之为1;
(2):传输数据速率
一般采用波特率进行表示:Baud(简称:Bd),每秒传输二进制数的位数。常用的波特率9600/19200/38400/57600/115200…
波特率和比特率的关系:
比特率=波特率*单个调制状态对应的二进制位数。
六:UART接收器实现
- RXD数据格式
规定:在一个完整的字符帧中,有1个起始位,8个数据位,忽略校验位,2个停止位。
- UART接收器功能
将数据一位一位进行接收(LSB~MSB),称为串行方式,接收的数据往往放置在存储器中,称为并行方式(串行~并行)。
- UART接收器分析
功能:UART接收数据时,将接收到的数据转换成并行数据。
分析:对于接收器而言,需要对每一位数据进行采样,一般情况下采样数据会在每一位数据的中心点位置(中心点位置数据最稳定)。所以在一般应用当中,采样数据的中心时刻的电平就可以认为是此刻数据的电平。
需要设置合适的采样点,采样点多(数据稳定)/少(数据不稳定)。
如果采样点个数比较少,设置4个采样点,那么中心点位置趋近于2/3采样点,此时偏离中心点比较远,可能会出现数据不稳定的时间。
如果采样点个数比较多,设置16个采样点,那么中心点位置趋近于7/8采样点,此时距离中心点比较近,数据比较稳定。
由于UART属于异步传输,没有传输的同步时钟,为了保证传输数据的正确性,UART采用16倍的波特率进行采样,每一个数据都会有16个采样点,以保证采样到的数据不会出现误码/滑码现象,一般UART传输的数据往往是8bit,如果出现一个周期的误差,接收端也会正确的接收到数据。
假设UART传输数据时采用Baud=9600,接收端一个UART时钟16*Baud=16*9600HZ。
- UART接收器端口
- UART接收器实现
采用线性序列机实现:LSM
LSM_1S:节拍计数(RXD拉低后,记录接收一帧时序中时钟的个数:采样点个数)
LSM_2S:在指定的时钟节拍下,完成动作(接收数据:中心点位置)
1个起始位,8个数据位,忽略校验位,2个停止位。
将每一位数据都设置为16个采样点,起始位需要16个采样点(0~15),第一个数据位D0需要16个采样点(16~31)…直到满足规定的数据格式(11*16);在1*16+7采样点接收D0数据,在2*16+7采样点接收D1数据,依次在8*16+7采样点接收D7数据,将数据接收完成后,放置在接收数据寄存器中同时产生接收8bit数据完成标志。
- UART接收器测试
需要模拟RXD线上的数据,D0~D7这8位数据,每一位数据持续时间均为波特率周期
`timescale 1ns/1ps
Baud=9600 TBaud=10^9/9600
`timescale 1us/1ps
Baud=9600 TBaud=10^6/9600
可以自行模拟一组/多组数据,模拟时必须按照数据格式,从起始位~停止位(RXD=1);可以接着模拟下一组数据(RXD=0),模拟数据和第一组情况一致。
- 线性序列表
节拍 | LSM_1S:节拍计数 | LSM_2S:节拍上发生动作 | 说明 |
0 | (rxd==1’b0):cnt=0 | rec_data=8’h0,temp_data=8’h0,rec_data_flag=1’b0 | 初始值 |
1*16+7 | cnt=cnt+1 | temp_data[0]=rxd | 接收第一位数据:D0(LSB) |
2*16+7 | cnt=cnt+1 | temp_data[1]=rxd | 接收第二位数据:D1 |
3*16+7 | cnt=cnt+1 | temp_data[2]=rxd | 接收第三位数据:D2 |
4*16+7 | cnt=cnt+1 | temp_data[3]=rxd | 接收第四位数据:D3 |
5*16+7 | cnt=cnt+1 | temp_data[4]=rxd | 接收第五位数据:D4 |
6*16+7 | cnt=cnt+1 | temp_data[5]=rxd | 接收第六位数据:D5 |
7*16+7 | cnt=cnt+1 | temp_data[6]=rxd | 接收第七位数据:D6 |
8*16+7 | cnt=cnt+1 | temp_data[7]=rxd | 接收第八位数据:D7(MSB) |
9*16+1 | cnt=cnt+1 | rec_data=temp_data,rec_data_flag=1’b1 | 产生输出数据和标志 |
9*16+2 | cnt=cnt+1 | rec_data_flag=1’b0 | 尖峰脉冲(占UART时钟一个周期高电平) |
- 仿真测试
模拟RXD线上两组数据(8’h55和8’h66)。
- 下板验证
- 通过FIFO对UART接收器接收的数据进行缓存
- 仿真测试
七:UART发送器实现
- TXD数据格式
规定:在一个完整的字符帧中,有1个起始位,8个数据位,忽略校验位,2个停止位。
- UART发送器功能
将待发送的数据(send_data[7:0])通过TXD数据线一位一位发送出去(并行数据串行输出)。
- UART发送器分析
功能:UART发送数据时,将待发送数据(并行数据)通过TXD数据线一位一位发送出去(串行数据)。
分析:对于发送器而言,只需要在发送数据持续时间段内,将数据丢出去即可。(常见在数据刚开始时候发送数据)。
- UART接收器和UART发送器区别
对于接收器而言:当接收完8bit数据后,接收数据完成。
对于发送器而言:当发送完8bit数据后,还有没有数据需要再次发送/已经发送完成,停止位一旦出现(TXD=1),代表数据已经发送完成。
- UART发送器实现
采用线性序列机实现:LSM
LSM_1S:节拍计数(在TXD=0时(起始位),需要将节拍计数从0开始)。
LSM_2S:在指定的时钟节拍下,完成动作(发送数据:数据刚开始时:1*16 2*16~8*16),发送完成后,手动将TXD置高(停止位)。
- UART发送器端口
- 采用线性序列机实现
节拍 | LSM_1S:节拍计数 | LSM_2S:节拍上发生动作 | 说明 |
`EP(12*16) | (sys_rst_n==0):cnt=`EP | (sys_rst_n==0):TXD=1,send_data_flag=0 | 初始状态值 |
0 | (cnt>=`EP):cnt=0 | TXD=0 | 起始位(需要将TXD拉低) |
1*16 | cnt=cnt+1 | TXD=send_data[0] | 发送第一位数据(D0:LSB) |
2*16 | cnt=cnt+1 | TXD=send_data[1] | 发送第二位数据(D1) |
3*16 | cnt=cnt+1 | TXD=send_data[2] | 发送第三位数据(D2) |
4*16 | cnt=cnt+1 | TXD=send_data[3] | 发送第四位数据(D3) |
5*16 | cnt=cnt+1 | TXD=send_data[4] | 发送第五位数据(D4) |
6*16 | cnt=cnt+1 | TXD=send_data[5] | 发送第六位数据(D5) |
7*16 | cnt=cnt+1 | TXD=send_data[6] | 发送第七位数据(D6) |
8*16 | cnt=cnt+1 | TXD=send_data[7] | 发送第八位数据(D7:MSB) |
9*16 | cnt=cnt+1 | TXD=1, | 停止位(2个) |
9*16+1 | cnt=cnt+1 | send_data_flag=1 | 产生发送8bit数据完成标志(尖峰脉冲) |
9*16+2 | cnt=cnt+1 | send_data_flag=0 |
- 仿真测试
- UART发送器下板验证1
- UART发送器下板验证2
通过外部设备产生待发送数据,将产生待发送数据通过FIFO缓存,读取FIFO数据通过TXD一位一位发送数据。
- 仿真测试
- 下板验证
八:UART发送/接收器波特率可调节
常用的波特率9600/19200/38400/57600/115200…
Baud=9600 UART_CLK=153.6KHZ
Baud=19200/38400/57600 UART_CLK=XX
Baud=115200 UART_CLK=1.8432MHZ
波特率设置:baud_cnt | 波特率 | 系统时钟:sys_clk | 计算 | 说明:计数器最大值(CNT_MAX) |
0 | 9600 | T=1/sys_clk=20ns | Fsys_clk/Fuart_clk | ~=325.52 |
1 | 19200 | T=1/sys_clk=20ns | Fsys_clk/Fuart_clk | ~=162.76 |
2 | 38400 | T=1/sys_clk=20ns | Fsys_clk/Fuart_clk | ~=81.38 |
3 | 57600 | T=1/sys_clk=20ns | Fsys_clk/Fuart_clk | ~=54.25 |
4 | 115200 | T=1/sys_clk=20ns | Fsys_clk/Fuart_clk | ~=27.13 |
以Baud=9600为例:Fuart_clk = 153.6KHZ=16*Baud
CNT_MAX(计数器最大值)= Fsys_clk / Fuart_clk = 50MHZ/153.6KHZ~=326
- 设计分析
- 设计架构(以UART接收器为例)
- 仿真测试(以UART接收器为例)
九:UART全双工功能测试
- 讨论UART回环测试端口:
- 讨论信号间时序关系:
- 仿真测试
- 下板验证
十:练习
- 理解通信基本知识
- 掌握UART物理层/协议层
- 尝试完成UART接收器实现(采用LSM)。
- 完成上课内容(UART_RX/UART_RX_ISSP/UART_RECEIVER)。
- 尝试完成UART发送器设计(考虑LSM)。
- 完成上课内容(UART发送器发送1个数据,串口调试期接收1个数据)
- 尝试完成波特率可调节(设置Baud_cnt为定值),在不同Baud下正常能够接收/发送数据(串口调试器:9600/19200 UART_CLK:16*Baud)
基于FPGA的通信显示系统
一:简易通信显示系统
通信协议:UART协议 显示接口:VGA接口
综合设计项目1:上位机软件(串口调试器)发送图片数据(图片大小:200*200)通过UART接收器对图片数据进行接收,接收到的数据通过VGA接口显示在显示器中。
二:图像采集系统
通信协议:SCCB协议(类似IIC协议) SDRAM芯片手册
算法实现:二值化/灰度化/Sobel算法… 显示接口:VGA接口
三:简易通信显示系统分析
- 选择片内存储
DPRAM:双端口RAM(同一时钟/不同时钟)。
DCFIFO:双时钟FIFO。
由于VGA控制器在图片显示区域内,控制地址变化,将读取图片数据给到RGB。
所以选择片内存储时,优先选择DPRAM(读写数据时,有读写地址和使能)。
写数据写地址:1个地址写入1个图片的像素点数据(控制WREN:写使能)。
- 串口调试器
串口调试器:选择支持以文件的方式作为发送的数据(图片数据:200*200),以一定的速率对图片的数据进行传输,通过UART接收器对图片的像素点数据1个1个进行接收(串口调试器发送1个数据,UART接收端接收1个数据,对数据进行存储和终端显示)。
- 显示现象
四:简易通信显示系统架构
- DPRAM采用双时钟(wr_clk和rd_clk不同)
WR_CLK:UART时钟(16*Baud) RD_CLK:VGA时钟(40MHZ)
- DPRAM采用双时钟(wr_clk和rd_clk不同)内部信号分析
- DPRAM采用双时钟(wr_clk和rd_clk相同)
WR_CLK:VGA时钟(40MHZ) RD_CLK:VGA时钟(40MHZ)
- DPRAM采用双时钟(wr_clk和rd_clk相同)内部信号分析
如果DPRAM写时钟采用40MHZ,此时接收8bit数据标志依然给DPRAM写使能,在写时钟上升沿来时,检测到写使能为高,开始进行写数据(会将55数据写入N个地址:不满足接收1个数据写入1个地址要求)。
- 仿真测试
- 仿真第一部分:RXD接收到的数据写入DPRAM中(5组数据对应5个地址)
- 仿真第二部分:读取DPRAM中数据在VGA显示区域内显示
五:练习
- 完成上课内容
- 完成第四部分(1和2),现象和上课演示一致。
Loading...