基于FPGA具有容错能理的异步串口程序设计
首先,问题源于一个项目。本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题。
经过分析原因如下:
我的串口收模块是基于特权同学的开发板程序修改而来的,也就是信号线一旦拉低,就认为数据开始传输,便闷头数数,那么数满10个bit(1起始位+8位数据+1停止位),就算接完一个字节,回头接着检测信号线是否被拉低。当发数端发出了错码的情况下,这套程序是不能检测出来的。要想能识别错码,就必须起始位与停止位都检测,才能确定该字节是否完整。
经过一个周末的编写,新模块出炉了。模块入口有rs232_rx信号,出口有rx_data[7:0]以及一个FLAG信号线,FLAG是一个字节接满结束的标志。
新模块主要思想就是在原有模块的基础上,加入判断帧尾的步骤。办法是:
1、准备做处10路冗余,每一路都检测rs232_rx的下降沿。(实际应该用不到那么多)10路冗余是有优先级的,当第一次检测到下降沿之后,第一路启动计数,开始10位bit的数据采集。当第一路计数启动之后,再遇到下降沿便启动第二路计数,以此类推。也就是说,在接收模块第一次启动计数之后,每遇到一次下降沿,就启动一路计数。
2、当第一路数到第10个bit,也就是停止位的时候,如果采集到了1,那么也就证明采集的是停止位,则将之后的所有冗余计数一并停下。如果第一路的停止位没有采集到1,则证明传输出错,第一路没有接到完整的一帧数据,则不输出数据,等待第二路的停止位采集结果。以此类推,知道某一路数据的停止位为1,则将剩下的冗余路置位,输出数据。
3、这10路冗余只是为一帧数据服务,也就是1个字节,确保单个字节能够采集正确。
经过以上修改,程序可以正确的采集数据了。但是以上修改还不算完美,原因是,接收bit的采集是在波特率的中心位置采集,假如某帧率 1bit 的时长为 100ms ,那么我在第50ms的时候采集一次数据,记录。这么做不能保证数据是正确的,有可能在采集之前出的错,或者刚刚采集完之后又出的错。如果是这种情况,并且在本该出现在停止位的位置有了一个高的数据,那么就误认为该帧数据没错。
所以最稳妥的做法是每个bit的数据采集三次,大概在 1/6 3/6 5/6 ,这三个位置采集,如果都相同,才判断本bit采集正确。这样会极大的提高数据采集的准确率。
经过更改后模块还有一个优点,就是每次接收一个完整的字节之后,就会有一个高信号产生(FLAG),对于实时性要求较强的任务,有所帮助。每接到一个数据都可以马上进行判断和操作,不必开辟一个较大的缓冲类寄存器。
基于FPGA具有容错能理的异步串口程序设计的更多相关文章
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- 基于FPGA的数字识别的实现
欢迎大家关注我的微信公众号:FPGA开源工作室 基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...
- 基于FPGA的线阵CCD实时图像采集系统
基于FPGA的线阵CCD实时图像采集系统 2015年微型机与应用第13期 作者:章金敏,张 菁,陈梦苇2016/2/8 20:52:00 关键词: 实时采集 电荷耦合器件 现场可编程逻辑器件 信号处理 ...
- 基于FPGA的XPT2046触摸控制器设计
基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com 发 ...
- 基于FPGA的HDMI显示设计(三)
上一篇:基于FPGA的VGA显示设计(二) 10月10日 ~ 20日期间实习,令我万万没想到的是实习题目是 “便携式高清电视显示屏测试系统原型设计” 也就是 “基于FPGA的视频显示”. 实习要求用 ...
- 基于FPGA的VGA显示设计(二)
上一篇:基于FPGA的VGA显示设计(一) 参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码 的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...
- 基于FPGA的简易数字时钟
基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块.led显示模块.所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块.把时钟模 ...
- 基于FPGA的以太网开发
基于FPGA的以太网开发,在调试过的FPGA玩家开来,其实算不上很难的技术!但是如果只是菜鸟级别的选手,没有调试过的话,就有些头疼了!早在自己在实习的时候,就接触到XAUI(万兆以太网口)接口,但是由 ...
- 基于FPGA的RGB图像转灰度图像算法实现
一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...
随机推荐
- Vue 5小时学习小教程
Vue Vue Vue 起步 指令 v-bind v-if v-for v-on v-model v-bind和v-on缩写 搭建Vue开发环境 vue项目结构 Vue开始 数据绑定, 绑定属性 循环 ...
- Oracle数据库设计规范建议
Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好的保证 ...
- developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章
developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章 深入理解 Session 与 Cookie Session 与 Cookie 不管是对 Java Web ...
- BZOJ 2527 [Poi2011]Meteors:整体二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...
- vue2.0+wechat
首先遇到的问题就是使用npm下载JSSDK 下载正确的JSSDK 正确的名称是:'weixin-js-sdk' 其实有好几个相似的名称都可以下载,只有这一个能用 支付问题使用Vue的路由跳转到支付页面 ...
- 【海量之道】海量之道之SET模型
本文介绍了set模型. 一 提供海量服务时面对的场景 场景1:如何令黄村机房的TWS机器访问黄村机房的APP服务,避免TWS跨机房调用永丰机房的APP机器? 场景2:DB和Redis如何实现快慢分离, ...
- NULL 与空字符串
空字符串 '' 不占内存空间; NULL占一个字节的空间; 空字符串 的判断用 == <> NULL值用 is null ifnull();
- double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较
double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较 例如杭电1408 盐水的故事 ac #include<iostream> ...
- long long 与 __int64
1.long long VC中不能用,codeblocks中 可以 #include<iostream> #include<stdio.h> using namespace s ...
- C#操作计划任务
昨天有一个任务,就是要下载相关文件,然后保存在相关路径下,这个没什么难度,所以就略过不谈,主要谈谈定时下载,即每天某个固定时间执行下载,这个功能我是用C#代码来操作windows自带的任务计划来实现的 ...