串口回环测试

2023-05-16

串口lookback测试

  1. 基础知识
    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART 是一种通用的数据通信协议,也是异步串行通信口(串口)的总称。发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。它包括了 RS232、RS499、RS423、RS422 和 RS485 等接口标准规范和总线标准规范。
  2. RS232
    使用DB9接口通信,下图是公头的引脚说明,公头与母头引脚2、3相反:
    在这里插入图片描述
    一般只是用2,3,5,三个口即可。
  • 波特率 ,每秒钟通过信号传输的码元数称为码元的传输速率,简称波特率,常用符号“Baud”表示,其单位为“波特每秒(Bps)”。携带数据信息的信号单元叫码元(因为串口是 1bit 进行传输的,所以其码元就是代表一个二进制数)。
  • 比特率,每秒钟通信信道传输的信息量称为位传输速率,简称比特率,其单位为“每秒比特数(bps)”。比特率可由波特率计算得出,公式为:比特率=波特率 x 单个调制状态对应的二进制位数。如果使用的是 9600 的波特率,其串口的比特率为:9600Bps x 1bit= 9600bps。
  1. 由计算得串口发送或者接收 1bit 数据的时间为一个波特,即 1/9600 秒,如果用50MHz(周期为 20ns)的系统时钟来计数,需要计数的个数为 cnt = (1s * 10^9)ns / 9600bit)ns / 20ns ≈ 5208 个系统时钟周期,即每个 bit 数据之间的间隔要在 50MHz 的时钟频率下计数 5208 次。
  2. 系统整体模块框图
    在这里插入图片描述
  3. 串口接收模块
    模块框图:
    在这里插入图片描述
    波形设计:
    在这里插入图片描述
    其中rx_reg1、rx_reg2是为了解决亚稳态的问题,用 rx_reg2 信号和 rx_reg3 信号产生 staet_nedge 作为下降沿标志信号。单比特信号从慢速时钟域同步到快速时钟域需要使用打两拍的方式消除亚稳态。

原因:当你使用示波器把一个矩形脉冲的上升沿或下降沿放大后会发现其上升沿和下降沿并不是瞬间被拉高或拉低的,而是有一个倾斜变化的过程,这在运放中被称为“压摆率”。如果 FPGA 的系统时钟刚好采集到 rx 信号上升沿或下降沿的中间位置附近,即 FPGA 在接收 rx 数据时不满足内部寄存器的建立时间 Tsu(指触发器的时钟信号上升沿到来以前,数据稳定不变的最小时间)和保持时间 Th(指触发器的时钟信号上升沿到来以后,数据稳定不变的最小时间),此时 FPGA 的第一级寄存器的输出端在时钟沿到来之后比较长的一段时间内都处于不确定的状态,在 0 和 1 之间处于振荡状态,而不是等于串口输入的确定的 rx 值。
第一级寄存器产生亚稳态并经过自身后可以稳定输出的概率为 70%~80%左右,第二级寄存器可以稳定输出的概率为 99%左右,后面再多加寄存器的级数改善效果就不明显了,所以数据进来后一般选择打两拍即可。

  • work_en,因为当前帧后面的比特可能还会出现下降沿,那就会在把start_nedge作为条件判断时出现误判,所以这里用标志信号work_en来防止误判。当接收完一帧数据后取反。
  • 根据波特率计数器一个一个接收数据,什么时候取数据呢?在稳定区间取即可,这里选取计数一半取,当然更为准确的是多次在稳定区间取值然后去概率最大的。然后我们就用bit_flg来定位取值时刻。
  • 串口是基于帧数据传输,所以需要计数收到几个bit了,bit_cnt计数,这里计数0-8,已包含8个有效数据,所以最后的停止位没有计数。(也可以计数到9)
  • 然后需要将接收到的串行数据转换为并行数据,需要移位,这里通过位拼接实现移位,rx_data = {rx_reg3, rx_data[7:1]}.而要在移位完成后该数据才可以被后继模块使用,所以需要一个标志信号表示移位完成,数据稳定。这就是rx_flag.
  • 对于po_flag信号不能直接使用rx_flag,因为po_data相比rx_data延一拍,所以输出稳定性好也得延一拍。就需要一个新的标志信号。
  1. 串口发送模块
    模块框图:
    在这里插入图片描述
    波形设计:
    在这里插入图片描述
  • 什么时候一位一位输出数据?
    由于使用 9600bps 的波特率,所以发送 1bit 数据需要的时间也约为 5208 个系统时钟周期,这就需要产生一个和接收数据时一样的波特率计数器,我们取名为 baud_cnt。
  • 计数需要何时开始?
    可能会想到pi_flag,但是它只有一小段高电平脉冲,不好判断计数,所以引出了work_en信号,让wor_en信号在发送一帧数据期间拉高。当检测到数据有效标志信号 pi_flag 为高电平时拉高工作使能信号 work_en。
  • 什么时候发该比特数据?
    这与接收数据类似,都不能在边界值进行数据发送与接收,所以在这期间都可以。一帧数据发送需要计数发了几个,引出bit_cnt,为了实现计数添加了bit_flag标志信号。
  • 怎么确定一帧数据发送完成?
    一帧数据10位(包括起始位和停止位),所以发送一帧数据后拉低work_en信号,不在发送。关于bit_cnt计数到9还是10的问题,停止位和空闲情况下都为高电平,所以最有一个停止位就没有必要再单独计数了,所以 bit_cnt 计数器计数到 9 清零是完全可以的,当然让 bit_cnt 计数器计数到 10 更是可以的。
  1. 仿真学习
    task任务实现数据一个一个发送,而且可以相互调用。
    关于此模块代码的结构:
    首先是定义task任务,里面放入参数(可能没有);
    然后是任务功能编写,比如在这里是每次发送一位数据;
    最后是结束任务,endtask.

尽量不要在 RTL 代码中使用,尤其是对它们理解不深刻的情况下。而我们在 Testbench 中使用就不用担心这么
多,且可以大大简化我们的代码,提高效率,是十分好用的。

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

串口回环测试 的相关文章

  • 低成本DIY:4G/5G网络遥控无人机-无人车-图传/数传/遥控一体!

    方案概述 无人机 无人车 无人船等机器 通过数据线连接安卓手机 xff0c 手机4G上网于是就可以实现超远程图传 数传和遥控 再在控制端手机上通过 2R酷玩 App远程操控 如果你本来就有一套常规遥控器控制的无人机 无人车的东西 xff0c
  • 你知道底层自旋锁是如何实现的吗

    我们在开发中 xff0c 经常会用到自旋锁 xff0c 对于使用接口来讲 xff0c 仿照例子谁都会用 xff0c 但是你知道其是如何实现自旋的吗 xff1f 今天我们就来讨论一下其实现原理 1 首先 xff0c 我们需要实现一个结构体用于
  • Ardupilot IMU恒温控制代码学习

    目录 文章目录 目录 摘要 第一章原理图学习 第二章恒温代码学习 1 目标温度怎么设置 摘要 本节主要学习ardupilot的IMU恒温控制代码 采用的飞控是pixhawk v5 欢迎一起交流学习 第一章原理图学习
  • Windows10安装或重装ubuntu18.04双系统教程(平民教程)

    一 引言 1 电脑配置 操作系统 xff1a Win10专业版机型 xff1a Dell G3 15 3500显卡 xff1a NVIDIA GeForce GTX 1660Ti内存 xff1a 32G硬盘 xff1a 双硬盘 xff08
  • 不同国家的日期写法

    题目描述 对于年 月 日的写法 xff0c 不同的国家有不同的描述形式 请按年 月 日的顺序读入日期 xff0c 然后分别输出中国式写法 xff08 年 月 日 xff09 xff0c 英国式写法 xff08 日 月 年 xff09 和美国
  • 二维数组最大值及位置

    题目描述 有一个3 4的矩阵 xff0c 要求编程求出其中值最大的那个元素 xff0c 以及其所在的行号和列号 xff08 如果最大数有多个 xff0c 则显示第1个出现的数据的信息 xff09 输入要求 从键盘输入12个数字组成一个3 4
  • 比较两个字符串的大小

    题目描述 设计函数 xff0c 比较两个字符串的大小 每个字符串长度不超过50 输入要求 从键盘分别读入两个字符串 xff0c 每个字符串以换行符结束 输出要求 比较两个串的大小 xff0c 输出相应的结果 输入样例 Hello hi 输出
  • 心形曲线(java)

    心形曲线java简易表示法 span class token keyword import span span class token namespace java span class token punctuation span awt
  • c++运行不输出结果怎么办

    C C 43 43 运行不出结果怎么调试 main函数中可在各个地方插入return 0提前结束程序 xff0c 直到有结果出现 xff0c 问题就出在return 0的下方 如果在自定义函数内部 xff0c 则需要使用exit xff08
  • 如何解决VS2019控制台输出中文乱码问题

    情况一 xff1a 下载插件 xff0c 将VS的输出编码更改为UTF 8 情况二 xff1a 如果已经装了UTF 8插件但是控制台输出的中文仍然是乱码 则按以下步骤进行 xff08 1 xff09 打开电脑的控制面板 xff0c 然后打开
  • 如何解决vs2019 scanf报错问题

    1 在程序最前面加 xff1a define CRT SECURE NO DEPRECATE 2 在程序最前面加 xff1a pragma warning disable 4996 3 将scanf改为scanf s 4 无需在程序前面加那
  • 函数曲线的绘制

    初等函数曲线的简易绘制 span class token macro property span class token directive keyword include span span class token string lt s
  • 花里胡哨的IDEA 2021启动界面

    一 前言 作为一个花里胡哨的男人 xff0c 总是在不停的研究各种花里胡哨的东西 xff0c 每次上机第一件事 xff0c 肯定是打开开发神器 xff1a Intellij IDEA 2021 xff0c 每次打开都是一个图片 xff0c
  • java中常见排序算法

    一 冒泡排序 span class token comment 64 author liyong 64 date 2021年12月02日 23 33 span span class token keyword public span spa
  • linux下栈空间大小(ulimit)

    linux下栈空间大小 第一次写博客 xff0c 很多地方写的不好请多见谅 xff0c 希望这篇文章对大家有帮助 首先说下为什么会写linux下栈空间大小这个内容 在评审同事代码的时候发现代码中有两个函数互相调用 xff0c 且无法退出导致
  • 解决npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

    解决办法 https github com npm cli issues 4980 issuecomment 1145334203 解决步骤 xff08 1 xff09 找到装 node js 路径下的 npm cmd xff08 2 xf
  • 1. 两数之和【return new int[]{i, j}、hashtable.containsKey()、get、put】

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target xff0c 请你在该数组中找出 和为目标值 target 的那 两个 整数 xff0c 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 xff0c 数
  • yarn的安装和使用(极其详细)

    一 yarn的简介 xff1a Yarn是facebook发布的一款取代npm的包管理工具 二 yarn的特点 xff1a 速度超快 Yarn 缓存了每个下载过的包 xff0c 所以再次使用时无需重复下载 同时利用并行下载以最大化资源 利用
  • Java构造方法(与类名相同的方法)、类方法、类变量、实例方法、实例变量

    目录 一 构造方法1 构造方法的特点 xff1a 2 构造方法分类3 构造方法的重载4 构造方法中的 this 二 类方法 类变量 实例方法 实例变量三 类方法 xff08 静态方法 xff0c 用static修饰的方法 xff09 四 类

随机推荐