这里记录一个实际的需要使用乒乓操作的例子:读sd卡数据的时,在spi的模式下。发送单数据块的读取命令,在回应之后会有

512字节的数据。使用乒乓操作,可以用两个八位的寄存器,就可以完成连续的512字节读入fifo。但是如果操作不好的话就会出现位置不对的情况。

上图是读入fifo的数据。

上图是实际的数据。(起始地址为1000h)00h 01h,就是位置不对的地方。

上述结果的代码:

assign fifo_data_in = (i == 10'd7) ? data_read_1 : data_read_2;

分析代码可知:00. 01是不要的数据,但是确写入了fifo中。应该说猜了很久,都不知道。这也是我的弱点所在,不能猜,而要实在的仿真分析。在我仿真了fifo的波形后,才知道fifo的写入当前时刻的,上一时刻的值见仿真波形。还有就是我的猜测:fifo写入的值,如果不使能write_req_r信号,值就不会更新到实际的fifo的数据总线上。所以在实际的调试中不管我如何丢弃开始的数据,总是有一个不相关的数据存在。之所以是猜测,是因为我现在还没有证实。在仿真中可以明显的看到,就算没有使能write_req_r, fifo写入的数据也能更新。

从仿真的波形可以看出:在data_in=1才使能write_req_r,在data_in=2,fifo才写入1 。 但是根据我的分析,应该要写入0。想想唯一不同只有这一句了:assign fifo_data_in = (i == 10'd7) ? data_read_1 : data_read_2;因为使用乒乓操作所以要做个选择。好的仿真看看。测试:如果 i 变化了且data_read_1和data_read_2有变化,但是write_req_r没有使能,观察fifo_data_in有没有变化即可。如果有变化证明我的猜测是错的。(没有仿真之前我不能确定,表明着我对verilog和数字电路的不理解,这也是我以后要加强的地方。)好吧下面是仿真的结果。

很显然:即使没有使能write_req_r,fifo_data_in也会变化在实际的仿真中我也使用了:

assign    fifo_data_in = flag_write ? fifo_data_in_r : counter;。可知我的猜测是错误的。还是不能猜的。那它为什么会多些一个当前数据的前一个存在fifo_data_in的中数据。

分析中。。。。。。。。。。。。。。。。。。。。。。。。有知道的,希望能留言。

呵呵,我还是想搞清楚到底是怎么回事。我使用了绝招,signaltap II 来看看在触发写,读的现场数据。

上图是:write_req_r下降沿触发是,但是的数据状态。明显的可以看到下降沿前后都是EB,因此可以确定肯定不是写的问题,这和前面的分析是一致的。(心里暗想,肯定是读的问题了。不然,我真的不知道怎么解决了)

上图是read_req_r下降沿触发时的数据。可以看到在使能的时候,data_out_r的值没有更新。虽然,现在还不知道原因,但是事实证明,问题就是出在这。(终于放心了。。。。)

现在来找找原因:(先使用modelsim仿真看看)

(嗯,和我开始的仿真是一样的)上图是modelsim的仿真图,可见不会读fifo_data[0]前的值,即输出是及时的更新的。奇怪了,怎么仿真和实际的情况不一样?我就去找,仿真和实际的不同点。

实际:data_tr_r <= fifo_data_out;

仿真:wire   fifo_data_out;

于是我就将仿真改成和实际的,加一个非阻塞的赋值。看看会不会,读的时候不会及时的更新。(希望是啊,不然我有不知道要如何解释了。呵呵。。。)

哈哈,,,)可以,真的是,改成和实际的一样时,真的要落后一个时钟。

我想想这是什么问题,就是对于阻塞赋值和非阻塞赋值的不理解造成的。实际却又不是,那是不是不能解决,只能丢掉第一次读的?(不能想当然啊)

仔细分析(还是要靠这个):

在fifo中的输出 :data_out_r <= fifo_data[read_addr];  assign   data_out = data_out_r;

在接收数据的时候:data_tr_r <= fifo_data_out; assign data_tr = data_tr_r;

可知,这可是存在两级的触发器的,所以开始要多打一拍,结束的时候要多打一拍。至此,问题可以说是分析好了。

呵呵,,,,,开心!

总结:

  要学会仿真的分析问题,而不是盲目的测试(耗时间,耗精力,还不会提高!)。

要扎实,认真。不能想当然。

FPGA SD 卡 之 乒乓操作 、同步fifo的更多相关文章

  1. NUC972当检测到sd卡时,在sd卡驱动中操作gpio开启sd卡的电源,解决sd卡因低电压有时识别不正常的问题

    1.根据硬件原理图,找到对应控制sd卡电源的gpio引脚,并在sd卡驱动文件中定义操作改该引脚的宏 2.在sd卡检测函数中,使用glib增加开sd卡电源的操作,如此当sd卡每次被检测到时,驱动中就会自 ...

  2. Android开发之SD卡上文件操作

    1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...

  3. android 64 sd卡读写的操作

    package com.itheima.writesd; import java.io.File; import java.io.FileNotFoundException; import java. ...

  4. 对手机SD卡的一些操作

    首先要导入外包 log4j-1.2.16.jar 代码如下: package com.car273.util; import java.io.BufferedReader; import java.i ...

  5. SD卡两种操作模式在项目中应用的比较

    1.SDIO接口传输速度比SPI接口传输速度快:2.STM32的SDIO口还真的不好用 特别是4BIT的方式 我都纠结了好久了 用1BIT的方式倒是可以 速度大概可以到读2M字节每秒(STM32F20 ...

  6. [笔记]SD卡相关资料

    ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...

  7. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  8. 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  9. SD卡的SPI模式的初始化顺序(转)

    为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用). 为什么在使用C ...

随机推荐

  1. Linux文件夹权限详解

    - 第一个字符代表文件(-).目录(d),链接(l) - 其余字符每3个一组(rwx),读(r).写(w).执行(x) - 第一组rwx:文件所有者的权限是读.写和执行 - 第二组rw-:与文件所有者 ...

  2. 【Demo】CSS3 2D转换

    2D转换transform 2D变换方法: translate() 根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动. div { transform: translate(50px,1 ...

  3. 用shell将时间字符串与时间戳互转

    date的详细用户可以参考下面的 http://www.cnblogs.com/xd502djj/archive/2010/12/29/1919478.html date 的具体用法可以查看另外一篇博 ...

  4. Node.js小白开路(一)-- console篇

    在所有内容的学习之中我们经常首先要接受到的常常很大一部分为命令行或是工具的内容展示,console内容为node.js在命令行中答应数据内容的一个途径. Console是nodejs中的元老级模块了. ...

  5. 26-THREE.JS 虚线绘制线框样式几何图形的材质

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  6. 【Java】对象的创建过程

    一.对象的创建过程 1.首次创建对象时或该类静态方法/静态域首次被访问时,JAVA解释器查找该类的路径,定位该类的class文件 2.载入该类的class文件,有关静态初始化的所有动作执行,但是只执行 ...

  7. 【C#】Socket中的ssl通信

    引言    有个项目中用到了Socket ssl通信,在此记录一下. 证书 Socket ssl需要用到证书用来校验身份,而作为调试,我们只需用测试证书即可. 有个工具可以很方便地制作测试证书,下载地 ...

  8. [Hive]HiveServer2概述

    1. HiveServer1 HiveServer是一种可选服务,允许远程客户端可以使用各种编程语言向Hive提交请求并检索结果.HiveServer是建立在Apache ThriftTM(http: ...

  9. CallKit iOS 教程

    原文:CallKit Tutorial for iOS 作者:József Vesza 译者:kmyhy 对 VoIP App 开发者来说,iOS 的支持并不友好.尤其是它的通知发送这一块,太糙了.你 ...

  10. jdk1.8 HashMap 实现 数组+链表/红黑树

    转载至 http://www.cnblogs.com/leesf456/p/5242233.html 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Ja ...