[X]关闭

关于DDR MIG高级篇图像缓存fifo的疑问

文档创建者:卢新硕
浏览次数:10812
最后更新:2023-08-17
 
在CH02_640_480_DDR_HDMI----MIG_BURST_IMAGE()模块中,使用了几个fifo,以写fifo为例,即sensor_data_gen模块生成的RGB数据写入到CH0_FIFO中去,为什么要使用CH0_FIFO的读取计数功能呢?为了保证缓存,不是应该使能写计数吗?书上写的是CH0_REQ<=(CH0_rusedw_o>=PIXEL_H);,我认为有问题,应该是使能CH0_FIFO的写计数器,当写入的数据大于PIXEL_H即缓存一行数据后才有效

发表评论已发布 11

uisrc

发表于 2019-11-9 10:08:14 | 显示全部楼层

今天看了下代码,代码中有这个参数,parameter PIXEL_H =8'd38;//不同的位宽这个值不一样
所以这个值是busrt 到DDR中的数据位宽,如果以这个计算,CH0就得以读计数器计算,CH6就得以写计数器计算,当然可以简单一些直接用640 去计算,那么CH0就的以写计数器计算,CH6就得以读计数器计算
越努力越幸运!加油!

卢新硕

发表于 2019-11-9 21:22:17 | 显示全部楼层

msxbo 发表于 2019-11-9 10:08
今天看了下代码,代码中有这个参数,parameter PIXEL_H =8'd38;//不同的位宽这个值不一样
所以这个值是bus ...

那么以最开始最开始为例,MIG从CH0_FIFO中读取的数据满足 CH0_REQ    <= (CH0_rusdw_o    >=PIXEL_H);时候,可是,这时候还FIFO0没有写入任何数据-------我说的没有写入数据指的是CH0的写数据指令判断方式是: CH0_REQ&&1'd1,//ch0_输入信道,为什么没有因为FIFO0中没有数据导致CH0_rusdw_o 一直为0,使得CH0_REQ&&1'd1==0,使得数据写入失败呢?

卢新硕

发表于 2019-11-9 21:59:03 | 显示全部楼层

msxbo 发表于 2019-11-9 10:08
今天看了下代码,代码中有这个参数,parameter PIXEL_H =8'd38;//不同的位宽这个值不一样
所以这个值是bus ...

我现在理解到,即使fifo空也会有数据写入到DDR,可是,这样的效果应该不如计数写入的效果好,因为按照教程计数读出数据的个数,读出的数据是无效数据,FIFO并没有起到真实数据缓存的作用。就是应该计数写入的数据个数,当写入的数据个数到达一定的阈值时才允许写入。不知道这样理解是否存在问题?

uisrc

发表于 2019-11-10 13:03:05 | 显示全部楼层

读计数器,不是计数读出的数据个数,而是读FIFO 大概还有多少数据可以读
越努力越幸运!加油!

卢新硕

发表于 2019-11-10 13:13:37 | 显示全部楼层

msxbo 发表于 2019-11-10 13:03
读计数器,不是计数读出的数据个数,而是读FIFO 大概还有多少数据可以读

谢谢!一下就理解了!

卢新硕

发表于 2019-11-10 15:24:57 | 显示全部楼层

msxbo 发表于 2019-11-10 13:03
读计数器,不是计数读出的数据个数,而是读FIFO 大概还有多少数据可以读

emmmmmmm实在不好意思,还有有几个问题想要问一下,第一个关于复位时间的问题:  //------------------------读取FIFO的控制信号-------------------------//
    M_S_RST_FIFO0:        
        begin
        M_S             <=(rst_FIFO_cnt>=8'd60)?M_S_IDLE:M_S;
        CH6_FIFO_RST    <=(rst_FIFO_cnt<=8'd20)&&MSG_FIFO_RDDATA[6];
        CH0_FIFO_RST    <=(rst_FIFO_cnt<=8'd20)&&MSG_FIFO_RDDATA[7];
        rst_FIFO_cnt    <=rst_FIFO_cnt+8'd1;
        end
在这个语句中,以5640输入数据寄存FIFO CH0复位为例,CH0的复位信号维持22个100Mhz系统时钟,复位之后CH0_FIFO中数据全部无效,然后再经过40个100Mhz时钟,进入M_S_IDLE,在40个100Mhz时钟中数据从5640模块输入到CH0_FIFO,在40个100Mhz的过程中,CH0_FIFO最多接受40/4=10个32bit数据,也就是320bit,而        CH0_REQ    <= (CH0_rusdw_o    >=PIXEL_H);,这是不是一直使得无法满足CH0_REQ=1?

第二个问题是为什么设置 parameter PIXEL_H =8'd78;//半行像素,这个初衷是不是为了设置成一行像素呢?一行像素就就是80*256/8/4=640个像素点,78是不是考虑到CH_REQ设置成1需要一个100MHZ的时钟,在M_S_IDLE又耗时一个100Mhz时钟,载开始进入写地址状态,可是这两个相差的100Mhz时钟时间只是写入时钟时间的一半,并不能保证可供读取的数据满足一次突发的数据量?

uisrc

发表于 2019-11-10 15:45:02 | 显示全部楼层

1、当CH6或者CH0的一幅图像已经传输完成后,通过FIFO的复位同步,清空FIFO,实际上如果每次传输正确,FIFO在一幅图像传输完成后,本来就已经空的了,但是为什么还要复位呢?比如你插入的是HDMI输入视频,你重新插拔下HDMI输入接口,可能这一幅图像就出现数据错乱了,那么通过复位,就可以清除FIFO中多余的数据,重新完成图像的同步。对于复位的时间,这个对于异步FIFO是由要求的,具体可以看手册
2、PIXEL_H 的值设置,一行也好,半行也好,都是可以的,以前对于FPGA 逻辑资源少的,可以设置缓存半行后就开始burst到DDR中去,对于现在FPGA的规模都很大了,设置缓存1行busrt 也是可以的。
越努力越幸运!加油!

卢新硕

发表于 2019-11-10 16:05:40 | 显示全部楼层

msxbo 发表于 2019-11-10 15:45
1、当CH6或者CH0的一幅图像已经传输完成后,通过FIFO的复位同步,清空FIFO,实际上如果每次传输正确,FIFO ...

fifo的异步复位需要保持三个较慢时钟的时钟宽度,那么复位之后,输入部分的数据不会被复位,只复位输出部分的数据吗?因为我的第一个问题是如果复位之后,留给的5640数据进入FIFO的时间不够,无法满足CH0_REQ=1的条件

SUOJNGER

发表于 2023-1-16 17:33:59 | 显示全部楼层

冒味问下,20年新版的MIG课程中工程综合后时序不满足,这个方面该如何修改呢?
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则