FPGA串口(UART)通信协议制定与设计思路详解示例

2023-05-16

串口(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_head8bit默认为0xfe
地址addr8bit0x01:BIT信息 0x02:波特率信息 0x03:BIT上报状态控制 0x04:上报串口波特率使能 0x05:上报BIT信息使能
数据data32bit数据为大端模式

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 上传通道的包

可上传的包信息有:

  1. BIT信息;

  2. 现在的串口波特率;

  3. 等其他信息

6 接收通道的包

接收后需要处理的包有:

  1. BIT状态控制;

  2. 改变的波特率值;

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.clk1I时钟
2.rst_n1I复位,低有效
3.uart_din8I从rx_uart接收到的数据
4.uart_din_vld1I从rx_uart接收到的数据有效指示信号,高有效
5.addr8O按串口协议解析出的地址
6.data32O按串口协议解析出的数据
7.data_vld1O按串口协议解析出的数据有效指示信号

其实现过程为使用状态机判断是否为本文需要的格式,状态机如下所示:

在这里插入图片描述

图 2 RX_DATA控制逻辑

7.2 RX_analysis模块

本模块主要是实现从地址数据中提取出有用数据的功能。本模块的接口如下表所示:

表 3 RX_ANALYSIS模块接口

序号信号名位宽bit方向I/O备注
1.clk1I时钟
2.rst_n1I复位,低有效
3.addr8I串口协议的地址
4.data32I串口协议的数据
5.data_vld1I串口协议的数据有效指示信号,高有效
6.bit_self_report_en1OBit自动上报使能信号,高有效
7.uart_bps32O串口波特率
8.Uart_bps_report_en1O波特率上报使能信号
9.Bit_report_en1OBit上报一次使能信号

具体实现方式如下所示:

  1. 当addr为0x03时赋值判断:bit_self_report_en默认为1,当addr为0x03并且data_vld为1时变为data[0],其他时候保持不变;

  2. 当addr为0x02时赋值判断:uart_bps默认为d’3_125_000,当addr为0x02并且data_vld为1时变为data,其他时候保持不变;

  3. 当addr为0x04时赋值判断:data_vld有效且data[1]为1时,Uart_bps_report_en使能一次;

  4. 当addr为0x05时赋值判断:data_vld有效且data[1]为1时,Bit_report_en使能一次;

7.3 TX_DATA模块

本模块主要是将串口协议的数据转为换8bit的串口发射模块可以发出的格式。本模块的接口如下表所示:

表 3 RX_ANALYSIS模块接口

序号信号名位宽bit方向I/O备注
10.clk1I时钟
11.rst_n1I复位,低有效
12.din_addr8I串口协议的地址
13.din_data32I串口协议的数据
14.din_data_vld1I串口协议的数据有效指示信号
15.din_rdy1O本模块准备好接受数据指示信号,高有效
16.dout8O输出给tx_uart模块的数据
17.dout_vld1O输出给tx_uart模块的数据有效指示信号,高有效
18.dout_rdy1I下级模块准备好接受数据的指示信号,高有效

其实现思路如下所示:

  1. 当输入数据信号有效时,将地址数据以及帧头按串口协议格式进行组包,即位数拼接 tx_data = {帧头,地址,数据};

  2. 之后将tx_data输入到一个位宽转换fifo里面。Fifo的输入位宽为8+8+32=48bit,输出位宽为8bit;

  3. Dout等于fifo的输出;

  4. 当fifo非空,且dout_rdy为1时,fifo的读使能有效,且dout_vld有效;

  5. 当fifo非满或者即将非满时,din_rdy有效;

7.4 Tx_ctrl模块

本模块主要是控制什么时候需要往外面发送数据,以及发送什么数据。本模块的端口如下表所示:

表 3 TX_CTRL模块接口

序号信号名位宽bit方向I/O备注
1.clk1I时钟
2.rst_n1I复位,低有效
3.dout_addr8O串口协议的地址
4.dout_data32O串口协议的数据
5.dout_data_vld1O串口协议的数据有效指示信号
6.dout_rdy1I下级模块准备好接受数据指示信号,高有效
7.uart_bps32I当前串口波特率
8.bit_data32IBit的信息
9.bit_report_en1IBit上报使能信号,高有效
10.uart_bsp_report_en1I串口波特率上报使能信号,高有效

本模块实现的思路如下:

  1. 当Bit_report_en为1时,dout_addr为0x01,dout_data为bit_data,且在dout_rdy有效时,dout_data_vld有效一次;

  2. 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有效一次;

  1. Uart_bsp_report_en为1时,dout_addr为0x02,dout_data为uart_bps,且在dout_rdy有效时,dout_data_vld有效一次;

7.5 Top模块

本模块是用于整合各个模块,以及产生一个1s的定时模块。

当定时时间到或者外部有bit上报请求时,则使能一次bit上报使能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA串口(UART)通信协议制定与设计思路详解示例 的相关文章

  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • 从零开始zynq linux AXI DMA传输

    本文从0开始叙述过程 使用的工具为vivado2016 4 sdk也是2016 4 准备工作 首先下载如下的目标文件 1 下载xilinx官方的bootloader文件 git clone https github com Xilinx u
  • FPGA Lattice Diamond 开发环境搭建

    FPGA Lattice Diamond 开发环境搭建 Lattice Diamond 软件下载 在浏览器中输入 Lattice 的官网地址 http www latticesemi com 进入官网首页在上方选择产品系列选项 出现如下图所
  • UART ISR Tx Rx 架构

    我让事情变得复杂了吗 我正在构建我的代码 以便通过 UART 从 8051 micro 与外围设备进行通信 外设响应主机的命令 一次只能响应一个命令 这是一个简单的发送和接收协议 tx1 rx1 tx2 rx2 tx3 rx3 每个 TX
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • 用python接收高速率的UDP数据包

    我正在使用 python 来从 FPGA 接收 UDP 数据包流 并尝试丢失尽可能少的数据包 数据包速率从大约 5kHz 到一些 MHz 我们希望在特定时间窗口 代码中的 acq time 内获取数据 我们现在有这样的代码 BUFSIZE
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART) 与 HAL 库?

    背景 这是我的一些背景 以便你们知道我有或没有哪些相关知识 我完全是这种嵌入式系统的新手 而且我对电子产品一无所知 我是一个纯粹的软件人员 我唯一的嵌入式系统经验是Raspberry Pi 它与STM32F4 Discovery有很大不同
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • Android Things 5​​.1 - 9 位 UART

    我正在尝试使用 Android Things 支持 9 位 UART 当我尝试将数据大小设置为 9 时 我收到 IO 异常 唯一有效的配置是 7 位和 8 位 我知道可以使用奇偶校验错误中断进行 9 位模拟 但在 Android 上 我没有

随机推荐