FPGA SD 卡 之 乒乓操作 、同步fifo
这里记录一个实际的需要使用乒乓操作的例子:读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的更多相关文章
- NUC972当检测到sd卡时,在sd卡驱动中操作gpio开启sd卡的电源,解决sd卡因低电压有时识别不正常的问题
1.根据硬件原理图,找到对应控制sd卡电源的gpio引脚,并在sd卡驱动文件中定义操作改该引脚的宏 2.在sd卡检测函数中,使用glib增加开sd卡电源的操作,如此当sd卡每次被检测到时,驱动中就会自 ...
- Android开发之SD卡上文件操作
1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...
- android 64 sd卡读写的操作
package com.itheima.writesd; import java.io.File; import java.io.FileNotFoundException; import java. ...
- 对手机SD卡的一些操作
首先要导入外包 log4j-1.2.16.jar 代码如下: package com.car273.util; import java.io.BufferedReader; import java.i ...
- SD卡两种操作模式在项目中应用的比较
1.SDIO接口传输速度比SPI接口传输速度快:2.STM32的SDIO口还真的不好用 特别是4BIT的方式 我都纠结了好久了 用1BIT的方式倒是可以 速度大概可以到读2M字节每秒(STM32F20 ...
- [笔记]SD卡相关资料
ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...
- 第36章 SDIO—SD卡读写测试
第36章 SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...
- 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列
第36章 SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...
- SD卡的SPI模式的初始化顺序(转)
为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用). 为什么在使用C ...
随机推荐
- LCS 的 NlogN作法
这个算法其实是因为LIS有NlogN的作法,把LCS转化为了LIS来做. 对于序列A{},B{},我们可以记录下来B中的每个元素在A中出现的位置,按顺序保存在一个新序列当中, 如果有多个位置按倒序写, ...
- IOS-Alcatraz(插件管理工具)
一.简单说明 Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件.模版以及颜色配置的工具. 二.如何安装 1.github地址:https://github.com/a ...
- 003——VUE操作元素属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 记录下httpclient 发送请求 服务端用@RequestBody 自动接收参数 报415
注解是post方式,那么检查以下内容:1. 你是否用了post请求2. 请求是否发送了数据3. 请求内容格式需要是 application/json .jquery 设置 contentType,-- ...
- 【git】不同协议的路径
https https://github.com/yesuuu/ganLearn.git ssh git@github.com:yesuuu/ganLearn.git git@idc:ganLearn ...
- iphone5s越狱之后必装
一.iphone5s完美越狱之后必装插件一览表 由于iPhone5s配置了强大的64位的A7处理器,所以在iOS7完美越狱后,不少iPhone5s用户发现之前安装的大部分人们插件在越狱后难以兼容.但是 ...
- 再读《Java编程思想 》
前段时间在豆瓣上无意间看到一个帖子"我为什么把thinking in java 读了10遍",是11年的帖子,下面评论至今,各种声音都有,不过大多数还是佩服和支持的.我个人来讲也是 ...
- I.MX6 View长宽大于屏的分辨率
/******************************************************************************** * I.MX6 View长宽大于屏的 ...
- 【解题报告】2014ACM/ICPC上海赛区现场赛B
唉 谷歌出的神题,差点爆零了...三小时终于A掉 B题 题目大概是说从左上角的点出发,经过某路线最后回到原点,求每个格子被路线包含的圈数的平方和. 首先可以知道,对于某个格子来说,从该格子的任意一个 ...
- 【eclipse新增系列】eclipse新安装设计编码统一