cnblogs.com Yeats叶子 原创,转载请注明原始地址 - http://www.cnblogs.com/xiedidan/p/ft232h-poc.html

Abstract

FT232H出来有些年了,使用类似FIFO的接口,经过测试,同步模式下器件向PC发送数据可以跑到38-40MByte/s。

但是我发现网上(OpenCores、Amobbs、博客等)找到的FT232H同步模式IP或者示例,每隔512字节就会丢一次数据。

本文就是解决丢数据问题并给出一个正确实现的POC(Proof Of Concept)。

Introduction

硬件:

FPGA开发板:Arrow BeMicro CV

FT232H验证板:FTDI UM232H

软件环境:

Win10

D2XX Driver

Quartus II 15.1

VS2015

参考链接:

Problem

先重现一下问题,根据FT232H Datasheet上的时序图和Altera DCFIFO的用户手册,参考网上的实现,设计时序如下:

data总线上深色的部分表示被FT232H锁存的数据,注意在传输开始的时候第一个字节是高阻态输出,也就是说开始会有一个字节的错误,这在流式应用中问题不大,也很好解决。

把FIFO的q与FT232H的data信号直接相连,FIFO的读时钟使用FT232H的clock时钟(60MHz)。逻辑实际上是用txe_n来控制wr_n和rdreq,图上没有考虑rdempty信号。

首先考虑wr_n,由于FT232H Datasheet上说txe_n和wr_n同时有效的时候,数据被锁存,所以为了保证速度,利用组合逻辑在txe_n有效的同一拍内使得wr_n有效。

其次是rdreq,这个信号也可以在txe_n有效的同时立即有效,DCFIFO的数据是在rdreq之后一拍有效,所以每次txe_n有效之后,FT232H都会先锁存上一次无效时FIFO打出(但未锁存)的数据。具体参看上图第9拍。

实现以上两个信号的逻辑:

1 assign wr_n = (~rst_n) | txe_n |rdempty;2 assign rdreq = rst_n & (~txe_n) & (~rdempty);

编写测试程序发现,每输出512字节就会少一个数据(接收端只收到511个字节),问题得到重现。

Solution

其实看FT232H时序图的时候,就发觉图上有很多问题没说清楚,比如图上txe_n有效之后,wr_n是过了一两个周期才有效的,但是Datasheet并没有硬性标出具体延迟的要求。

检索国外讨论区的时候也有老外指出需要一些额外的延迟来保证数据正确传送(没有说具体要多少个周期)。

那么思路基本明确了,就是让FIFO延迟一些输出数据,也就是rdreq延迟一些(wr_n依然保持与txe_n同步,一次变动一个信号更容易定位问题)。设计新的时序图如下:

这个时序实际上是认为txe_n有效之后的下下拍才会锁存数据。具体实现:

1 always @(negedge rst_n or posedgeclock)2 if (~rst_n)3 last_txe_n <= 1'b1;

4 else

5 last_txe_n <=txe_n;6

7 assign wr_n = (~rst_n) | txe_n |rdempty;8 assign rdreq = rst_n & (~last_txe_n) & (~txe_n) & (~rdempty);

这里引入了一个last_txe_n信号,就是简单的把txe_n同步一拍。

经过测试,这个实现可以稳定在38MByte/s,同时没有数据丢失。

问题解决。

Conclusion

FT232H Datasheet上说txe_n和wr_n同时有效时,锁存数据,这没错。但是前提是txe_n有效之后下下拍这个逻辑才成立——这一点Datasheet上表达的比较含糊。

其次,网上爬文的时候也有网友指出txe_n有可能在时钟下降沿打出来的,这一点在Datasheet的时序图上有反映,但是也没有明确的说明。(不过这个问题不影响逻辑实现。)

但是我不太明白为什么网上的实现都不对,也许是芯片版本或者FIFO IP版本不同?

这个问题在FPGA上需要专门处理。对于MCU等比较慢的场合,应该不用特别考虑延时,跳进中断处理都需要N多个时钟周期了。

最后是我的POC工程:

https://github.com/xiedidan/ft232h-core

其中,ft232h-speed-test是用VC2015编写的测试程序,ft232h_simple是一个简单的写时序示例,ft232h_fifo是结合了Altera DCFIFO的写示例。

蒂特ft232_[经验分享] 最近调试FT232H遇到的坑相关推荐

  1. 【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题

    调试时使用的程序:https://blog.csdn.net/ZLK1214/article/details/105457370 [杜邦线(或普通电线)影响时钟信号的完整性] 笔者调试STM32F10 ...

  2. CMOS Sensor的调试经验分享(转)

    源:CMOS Sensor的调试经验分享 转载于:https://www.cnblogs.com/LittleTiger/p/8251670.html

  3. camera调试基础经验分享

    http://www.ccm99.com/thread-1953-1-2.html CMOS Sensor的调试经验分享/ e# \. A3 Z5 P 我这里要介绍的就是CMOS摄像头的一些调试经验. ...

  4. STM32的CAN总线调试经验分享

    相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 文章目录 相关文章 背景 CAN总线 CAN控制器 CAN收发器 调试过程 硬件排查 CAN分析 ...

  5. linux修改ip配置文件_协助调试Linux服务器经验分享

    achair教程网,原创教程,经验分享.有个微信群,与WordPress爱好者交流,加群方法:添加微信号368537,回复WordPress群. 大家好,我是achair,周末整个下午都在搞Linux ...

  6. 秋招在即,你准备好了吗?BAT算法工程师面试经验分享。

    本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善. 一 ...

  7. usb转ttl小板pl2303hx_TTL刷机经验分享,刷机后实现软件随便安装,电视直播免费看...

    前言 之前已经介绍过很多方法,把闲置运营商盒子刷出全网通盒子,实现软件任意装,电视免费看,网络视频任意点播.刷机方法针对不同盒子,方法各异,但适应性最强的就是TTL刷机了.这些分享一点刷机经验和注意事 ...

  8. 工作三年的Android程序员 跳槽到“阿里“的面试经验分享

    前言 工作三年,你可能会迷茫,要么觉得自己怀才不遇,要么觉得自己迷失方向,也可能觉得自己意气风发,不管怎么样,自己已经开始思考自己的人生了,事实上,很多工作三年的人就第一次做出了自己的选择,也就是换一 ...

  9. 想学python编程-【经验分享】新手如何快速学好Python?

    原标题:[经验分享]新手如何快速学好Python? 什么样的人适合学习编程?到底Python作为编程入门语言合适吗?学习Python编程,我们应该如何学?大概的学习内容包括哪些? 今天我们就用一篇文章 ...

最新文章

  1. c语言class运行错误,win32 C RegisterClass失败,该如何处理
  2. 《Create Your Successful Agile Project》书评与作者访谈
  3. 是什么在吞食我们的科研时间2019-11-24
  4. JanusGraph 安装
  5. 5s的app显示无法连接服务器,苹果iphone5s手机无法连接App Store问题解决方法汇总...
  6. SQL注入自动扫描工具中的语句
  7. java 复杂表达式计算_我的计算器. 用java实现的. 可以支持复杂表达式
  8. 从零实现深度学习框架——自动求导神器计算图
  9. poj3254 状态压缩dp
  10. Map先排序value小->大再排序key小->大,ArrayList与Stream分别实现
  11. JVM内存管理及垃圾回收机制
  12. leetcode-53-maxium subarray
  13. 有量子计算机的山西高能小说,高能小说推荐-好看的高能类小说-高能小说排行榜-七零文学...
  14. 微信小程序:WeUI一个专为微信小程序设计的UI框架
  15. 从零写一个操作系统之booting
  16. 图机器学习——5.9 图神经网络:图的增广
  17. React Native的Navigator详解
  18. java程序设计基础知识点_Java编程语言基础知识的要点
  19. 【区块链基础】4——ETH区块结构
  20. 中断上下文以及下文延后执行

热门文章

  1. 爬虫系列之豆瓣图书排行
  2. Quick--组件与基本元素
  3. 【跨平台编程工具】XERO CODER 4.2.8.0 For x86 Cracked By PiaoYun/P.Y.G 优雅破解
  4. 麒麟操作系统基于linux哪个版本_如今的国产操作系统deepin和优麒麟哪个更好?...
  5. 2016秋季找工作纪实
  6. Leetcode——153. Find Minimum in Rotated Sorted Array
  7. 用Proxifier只代理PC端部分软件
  8. 机器学习:KNN完成英文手语分类
  9. c语言中执行cl exe时出错,VC6.0执行cl.exe时出错
  10. 跨行/跨城转账免费的银行卡 【持续更新,欢迎爆料】