打印
[FPGA]

关于FPGA连续写入FIFO后NiosII读取数据错误的问题

[复制链接]
2485|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、功能描述
1、FPGA连续向FIFO写入数据流;
2、数据流长度为720,数据为16位数据,从1~720;
3、每次复位信号有效后,依次写入1~720;
4、复位信号由FPGA产生,两个复位信号之间间隔1000个时钟周期;
复位信号也可由外部按键提供;
5、NiosII判断FIFO的写入个数wrfull>0时,读取FIFO数据并存储到SDRAM;
6、每读取一个FIFO数据就通过UART输出当前读取的FIFO个数及数据值;
二、模块介绍
1、line_sim       :模拟产生4次复位信号,周期为1000个clk
输入信号:  clr_line_n            输出信号: rst_sim
                      sw0_ena                                   fifo_aclr(没有用到)
                      clk=50MHz
l  当clr_line_n为‘0’时,复位line_sim模块
l  否则当sw0_ena为‘1’且当前行数cnt_line<5时,复位计数器cnt_rst累加;
l  当cnt_rst>=10 && cnt_rst<20时,rst_sim输出‘0’,其他情况输出‘1’
l  fifo_aclr为rst_sim取反
2、data_sim:模拟产生一行16位数据1~720写入fifo
       输入信号: rst_n(接line_sim模块的rst_sim输出或由按键产生)   
                            fifo_wrclk=50MHz            
                            fifo_wrfull(接fifo模块的wrfull输出)                       
       输出信号: fifo_data
fifo_wrreq
l  当rst_n为‘0’时,fifo_data和fifo_wrreq为‘0’
l  否则当fifo_data<720且fifo_wrfull非‘1’时,fifo_data累加,fifo_wrreq输出‘1’;
l  否则fifo_wrreq输出‘0’
3、fifo_pic:调用QuartusII的FIFO核定制
l  双口FIFO,数据宽度:16位,   数据深度:4096
l  输入信号:
fifo_data[15:0],wrreq接data_sim模块输出
fifo_rdreq接Nios,fifo_rdclk=100MHz(同Nios时钟)
l  输出信号:
fifo_wrusedw[11:0],fifo_rdempty,fifo_q[15:0]接Nios
4NiosII
l  选择Nios II/f类型,时钟频率100MHz,关闭Data cache
l  Avalon总线上挂sdram,16位x4M=64MBits
l  Avalon总线上挂uart,固定波特率115200
l  构造fifo读模块的Avalon接口,详见fifo_read_avalon.v和fifo_read_top.v,其中read wait:2个时钟周期
三、硬件整体框架(详见top.pdf)

file:///C:/DOCUME~1/dell/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.jpg
四、软件部分

file:///C:/DOCUME~1/dell/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.jpg
五、问题描述
1、当写入的fifo的数据个数小于fifo的深度,如line_sim模块连续产生4次rst_sim时(4x720=2880 < 4096),Nios读取fifo并打印输出正确;
2、如果修改line_sim模块连续输出6次rst_sim时(6x720=4320 > 4096),
Nios读取fifo并打印出错,仅能输出一个数据,如下所示:
Wruse=x ,i=0, data=1              x值不确定
3、如果line_sim先产生4次rst_sim,随后对line_sim复位再产生4次rst_sim,
则数据输出又是正确的,即最后显示:
wrusedw=1,i=8*720-1=5759,data=5760
4、同第3点所述,如果每次line_sim由外部按键产生,无论多少次,数据
都是正确的;
5、第3点和第4点的组合方式,即自动产生一次的fifo写入数据不超过fifo
深度,无论是第N次自动产生或按键触发,数据都是正确的;
六、问题疑问
1、每次对fifo进行读写操作,是否仅由wrreq/rdreq决定,而与wrclk/rdclk
无关。不进行fifo读写操作时是否要关闭读写时钟?
2、判断fifo写的条件光用wrfull,fifo读的条件wrusedw>0是否正确?
3、fifo写入时钟为50M,读出时钟为100M。但在读fifo时,需要对fifo的avalon总线发起两次读操作,第一次读wrusew,第二次读data,同时软件还需进行判断后再对sdram进行写入,会不会因此降低整个总线速度?
4、关于第3点,也通过降低wrclk的速率,如进行2048分频后进行测试,产生的问题同第五条所述。
5、最后一点是否是构造的fifo读模块avalon接口有问题?
七、验证
1、硬件平台 Altera DE1
       2FPGA型号:EP2C20F484C7
       3、软件版本:QuartusII 13.0/ EDS 13.0
       4、项目压缩包请解压在E盘根目录


11.png (176.33 KB )

原理图

原理图

22.png (167.66 KB )

c源码

c源码

top.pdf

91.5 KB

清晰版

MyNios.zip

3.85 MB

工程

相关帖子

沙发
zhaojingzb| | 2015-12-14 16:05 | 只看该作者
通过你上面的描述,我觉得问题可能出现你的代码中。
一方面怀疑你的line_sim产生,一方面是FIFO的读写控制不合理。

使用特权

评论回复
板凳
z894811350| | 2015-12-16 13:40 | 只看该作者
看到你的问题,又看了你的描述,我相信你设置为7次也会出错;
1、不知道你一次写入一个数据是否会出现问题。
2、如果你判断完一次不满就写6*720个数据,不丢才怪,检查一下你一次写了多少数据
3、你的问题可能出在了带宽的问题上,读的小于写的带宽,结果把数据挤丢了
4、你用按键来计数,你按一下肯定没有计数快啊。
5、你打印出来的数据我认为应该是错误的,不应该没有数据,也有可能你是哪里判断了吧。
我的建议是你可以把fifo再引出来一个半满的信号,例如fifo里面有一半的数据就是满,没有一半数据的时候你就写数据。根据这个信号来判断是否写数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

14

帖子

0

粉丝