串口(UART)通信协议制定与设计思路详解
1 概述
本文用于描述规定的串口通信协议,以及传输内容。
2 项目关于串口的要求
a) 支持BIT自检,1路UART上报BIT信息;
b) 1路UART接口,波特率可调,默认波特率为可达到3.125Mbps。
3 功能分析
支持BIT自检即需要串口自动上报BIT信息,即周期信息上报信息,本设计暂定为1s钟上报一次。
支持波特率可调,在无其他接口控制的环境下,则需要通过串口下发来调整波特率。
4 项目设计
本项目串口设计支持收和发两个方向,BIT上报为1s一次。波特率可调,默认为3.125Mbps。串口格式为:1bit起始位,8bit数据位,1bit停止位,无奇偶校验位。
通信协议如下表所示:
表 1 串口通信协议
字段 | 位宽 | 备注 |
---|---|---|
帧头frame_head | 8bit | 默认为0xfe |
地址addr | 8bit | 0x01:BIT信息 0x02:波特率信息 0x03:BIT上报状态控制 0x04:上报串口波特率使能 0x05:上报BIT信息使能 |
数据data | 32bit | 数据为大端模式 |
4.1 BIT信息内容
BIT信息包括:光纤的fiber_ok,dvi_lock,DDR初始化完成init_calib_complete等信息,优先使用低位表示,比如:
Data[0]:fiber_ok;
data[1]:dvi_lock;
data[2]: init_calib_complete
4.2 BIT上报状态控制
BIT上报控制如下:
当数据位1时,默认为自动上报;
当数据位0时,停止自动上报。
4.3 波特率
波特率设置一bps为单位.比如115200bps。
5 上传通道的包
可上传的包信息有:
-
BIT信息;
-
现在的串口波特率;
-
等其他信息
6 接收通道的包
接收后需要处理的包有:
-
BIT状态控制;
-
改变的波特率值;
7 设计思路
本设计要实现本功能主要分为7个模块。如下图所示:
图 1 模块对接图
虚线框里的模块为FPGA用逻辑需要实现的部分。
其中rx_uart为将串行的1bit从串口接收到的信号转变为8bit数据的模块,已经实现。Tx_uart为将8bit并行数据转换为1bit串行数据给串口芯片的模块,也以实现。
7.1 RX_DATA模块
RX_DATA模块为实现从接收到的数据中识别本项目需要的数据格式,本模块的输入输出端口如下表所示:
表 2 RX_DATA模块接口
序号 | 信号名 | 位宽bit | 方向I/O | 备注 |
---|---|---|---|---|
1. | clk | 1 | I | 时钟 |
2. | rst_n | 1 | I | 复位,低有效 |
3. | uart_din | 8 | I | 从rx_uart接收到的数据 |
4. | uart_din_vld | 1 | I | 从rx_uart接收到的数据有效指示信号,高有效 |
5. | addr | 8 | O | 按串口协议解析出的地址 |
6. | data | 32 | O | 按串口协议解析出的数据 |
7. | data_vld | 1 | O | 按串口协议解析出的数据有效指示信号 |
其实现过程为使用状态机判断是否为本文需要的格式,状态机如下所示:
图 2 RX_DATA控制逻辑
7.2 RX_analysis模块
本模块主要是实现从地址数据中提取出有用数据的功能。本模块的接口如下表所示:
表 3 RX_ANALYSIS模块接口
序号 | 信号名 | 位宽bit | 方向I/O | 备注 |
---|---|---|---|---|
1. | clk | 1 | I | 时钟 |
2. | rst_n | 1 | I | 复位,低有效 |
3. | addr | 8 | I | 串口协议的地址 |
4. | data | 32 | I | 串口协议的数据 |
5. | data_vld | 1 | I | 串口协议的数据有效指示信号,高有效 |
6. | bit_self_report_en | 1 | O | Bit自动上报使能信号,高有效 |
7. | uart_bps | 32 | O | 串口波特率 |
8. | Uart_bps_report_en | 1 | O | 波特率上报使能信号 |
9. | Bit_report_en | 1 | O | Bit上报一次使能信号 |
具体实现方式如下所示:
-
当addr为0x03时赋值判断:bit_self_report_en默认为1,当addr为0x03并且data_vld为1时变为data[0],其他时候保持不变;
-
当addr为0x02时赋值判断:uart_bps默认为d’3_125_000,当addr为0x02并且data_vld为1时变为data,其他时候保持不变;
-
当addr为0x04时赋值判断:data_vld有效且data[1]为1时,Uart_bps_report_en使能一次;
-
当addr为0x05时赋值判断:data_vld有效且data[1]为1时,Bit_report_en使能一次;
7.3 TX_DATA模块
本模块主要是将串口协议的数据转为换8bit的串口发射模块可以发出的格式。本模块的接口如下表所示:
表 3 RX_ANALYSIS模块接口
序号 | 信号名 | 位宽bit | 方向I/O | 备注 |
---|---|---|---|---|
10. | clk | 1 | I | 时钟 |
11. | rst_n | 1 | I | 复位,低有效 |
12. | din_addr | 8 | I | 串口协议的地址 |
13. | din_data | 32 | I | 串口协议的数据 |
14. | din_data_vld | 1 | I | 串口协议的数据有效指示信号 |
15. | din_rdy | 1 | O | 本模块准备好接受数据指示信号,高有效 |
16. | dout | 8 | O | 输出给tx_uart模块的数据 |
17. | dout_vld | 1 | O | 输出给tx_uart模块的数据有效指示信号,高有效 |
18. | dout_rdy | 1 | I | 下级模块准备好接受数据的指示信号,高有效 |
其实现思路如下所示:
-
当输入数据信号有效时,将地址数据以及帧头按串口协议格式进行组包,即位数拼接 tx_data = {帧头,地址,数据};
-
之后将tx_data输入到一个位宽转换fifo里面。Fifo的输入位宽为8+8+32=48bit,输出位宽为8bit;
-
Dout等于fifo的输出;
-
当fifo非空,且dout_rdy为1时,fifo的读使能有效,且dout_vld有效;
-
当fifo非满或者即将非满时,din_rdy有效;
7.4 Tx_ctrl模块
本模块主要是控制什么时候需要往外面发送数据,以及发送什么数据。本模块的端口如下表所示:
表 3 TX_CTRL模块接口
序号 | 信号名 | 位宽bit | 方向I/O | 备注 |
---|---|---|---|---|
1. | clk | 1 | I | 时钟 |
2. | rst_n | 1 | I | 复位,低有效 |
3. | dout_addr | 8 | O | 串口协议的地址 |
4. | dout_data | 32 | O | 串口协议的数据 |
5. | dout_data_vld | 1 | O | 串口协议的数据有效指示信号 |
6. | dout_rdy | 1 | I | 下级模块准备好接受数据指示信号,高有效 |
7. | uart_bps | 32 | I | 当前串口波特率 |
8. | bit_data | 32 | I | Bit的信息 |
9. | bit_report_en | 1 | I | Bit上报使能信号,高有效 |
10. | uart_bsp_report_en | 1 | I | 串口波特率上报使能信号,高有效 |
本模块实现的思路如下:
-
当Bit_report_en为1时,dout_addr为0x01,dout_data为bit_data,且在dout_rdy有效时,dout_data_vld有效一次;
-
Uart_bsp_report_en为1时,dout_addr为0x02,dout_data为uart_bps,且在dout_rdy有效时,dout_data_vld有效一次;
7.5 Top模块
本模块是用于整合各个模块,以及产生一个1s的定时模块。
当定时时间到或者外部有bit上报请求时,则使能一次bit上报使能。
ata为bit_data,且在dout_rdy有效时,dout_data_vld有效一次;
- Uart_bsp_report_en为1时,dout_addr为0x02,dout_data为uart_bps,且在dout_rdy有效时,dout_data_vld有效一次;
7.5 Top模块
本模块是用于整合各个模块,以及产生一个1s的定时模块。
当定时时间到或者外部有bit上报请求时,则使能一次bit上报使能。