MyFPGA Forum

 找回密码
 注册
搜索
查看: 15822|回复: 7
打印 上一主题 下一主题

DE2_70_TV里面的SDRAM读写地址的问题—求高手指点江山啊!!

[复制链接]
跳转到指定楼层
1#
发表于 2011-10-25 09:17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
always@(posedge CLK or negedge RESET_N)
begin
        if(!RESET_N)
        begin
                rWR1_ADDR                <=        0;
                rWR1_MAX_ADDR        <=        640*576;
                rWR1_MAX_ADDR_MAX        <=        2*640*576;
                rWR2_ADDR                <=        22'h100000;
                rWR2_MAX_ADDR        <=        22'h100000+640*576;
               
                rRD1_ADDR                <=        640*0;
                rRD1_ADDR1                <=        0;
                rRD1_MAX_ADDR        <=        640*240;
                rRD1_MAX_ADDR_MAX        <=        640*240+640*576;
               
                rRD2_ADDR                <=        640*288;
                rRD2_ADDR2                <=        640*288;
                rRD2_MAX_ADDR        <=        640*528;
                rRD2_MAX_ADDR_MAX        <=        640*528+640*576;
               
                rWR1_LENGTH                <=        128;
                rRD1_LENGTH                <=        128;
                rWR2_LENGTH                <=        128;
                rRD2_LENGTH                <=        128;
        end
        else
        begin
                //        Write Side 1
                if(WR1_LOAD)
                begin
                        rWR1_ADDR        <=        WR1_ADDR;
                        rWR1_LENGTH        <=        WR1_LENGTH;
                end
                else if(mWR_DONE&WR_MASK[0])
                begin
                    if(rWR1_ADDR<rWR1_MAX_ADDR_MAX-rWR1_LENGTH)
                        rWR1_ADDR        <=        rWR1_ADDR+rWR1_LENGTH;
                        else
                          rWR1_ADDR <=        WR1_ADDR;
                end
                //        Write Side 2
                if(WR2_LOAD)
                begin
                        rWR2_ADDR        <=        WR2_ADDR;
                        rWR2_LENGTH        <=        WR2_LENGTH;
                end
                else if(mWR_DONE&WR_MASK[1])
                begin
                        if(rWR2_ADDR<rWR2_MAX_ADDR-rWR2_LENGTH)
                        rWR2_ADDR        <=        rWR2_ADDR+rWR2_LENGTH;
                        else
                        rWR2_ADDR        <=        WR2_ADDR;
                end

                //        Read Side 1
                if(RD1_LOAD)
                begin
                        rRD1_ADDR1        <=        RD1_ADDR;   
                        rRD1_LENGTH        <=        RD1_LENGTH;
                end
                else if(mRD_DONE&RD_MASK[0])
                begin
                        if(rRD1_ADDR1<rRD1_MAX_ADDR-rRD1_LENGTH)     
                           rRD1_ADDR1        <=        rRD1_ADDR1+rRD1_LENGTH;
                 else if(rRD1_ADDR1==rRD1_MAX_ADDR-rRD1_LENGTH)
                           rRD1_ADDR1        <=        640*576;               
                 else if((640*576<=rRD1_ADDR1)&&(rRD1_ADDR1<rRD1_MAX_ADDR_MAX-rRD1_LENGTH))  
                        rRD1_ADDR1        <=        rRD1_ADDR1+rRD1_LENGTH;
                else if(rRD1_ADDR1==rRD1_MAX_ADDR_MAX-rRD1_LENGTH)
                                        rRD1_ADDR1        <=        RD1_ADDR;
                end

                //        Read Side 2
                if(RD2_LOAD)
                begin
                        rRD2_ADDR2        <=        RD2_ADDR;
                        rRD2_LENGTH        <=        RD2_LENGTH;
                end
                else if(mRD_DONE&RD_MASK[1])
                begin
        if(rRD2_ADDR2<rRD2_MAX_ADDR-rRD2_LENGTH)                               rRD2_ADDR2        <=        rRD2_ADDR2+rRD2_LENGTH;
                        else if(rRD2_ADDR2==rRD2_MAX_ADDR-rRD2_LENGTH)
                           rRD2_ADDR2        <=        640*576+640*288;
else if(((640*576+640*288)<=rRD2_ADDR2)&&(rRD2_ADDR2<rRD2_MAX_ADDR_MAX
-rRD2_LENGTH))
                 rRD2_ADDR2        <=        rRD2_ADDR2+rRD2_LENGTH;
                else if(rRD2_ADDR2==rRD2_MAX_ADDR_MAX-rRD2_LENGTH)
                  rRD2_ADDR2        <=        640*288;
                end
end       
end
上面程序是在范例上修改过的,其他部分未做改变,修改的主要目是想把范例中写一帧的缓存数据改成写两帧的缓存数据,即写的最大地址增加到2*640*576(两帧图像的容量),读地址就变成先读rRD1_ADDR1=0~640*240,rRD2_ADDR2=640*240~640*528,然后读取rRD1_ADDR1=640*576~640*576+640*240,rRD2_ADDR2=640*576+640*240~640*528+
576*528,读完后读地址回归到初始值,以此循环重复,未修改钱的视频图像是连续变化的,不存在拖影,修改之后仍有视频图像,但是存在很强的拖影,不连续,只有在摄像头静止时,效果和未修改时的一样,一直没搞懂,希望高手指点下,是什么原因,在能写两帧的缓存数据的前提下怎么修改,谢谢!!!!!!!!
2#
 楼主| 发表于 2011-10-25 22:44:34 | 只看该作者
求求高手啊!!
3#
 楼主| 发表于 2011-10-25 22:45:23 | 只看该作者
急急!!
4#
 楼主| 发表于 2011-10-25 22:50:51 | 只看该作者
也没做什么修改,就是使得地址可以写到2*640*576,然后再归0,读的时候就可以先读0~640*240,640*288~640*528,后读640*576~640*576+640*240,再重复640*576+640*288~640*576+640*528,其他都没修改,但是显示为什么会这么大的变化呢
5#
 楼主| 发表于 2011-10-25 23:01:22 | 只看该作者
用在DE2也是一样的问题
6#
 楼主| 发表于 2011-10-25 23:13:23 | 只看该作者
希望研究过这个程序的大侠不吝赐教啊
7#
发表于 2012-5-30 15:26:53 | 只看该作者
支持~~顶顶~~~
8#
发表于 2012-9-18 12:30:09 | 只看该作者
同学,你有没有弄清楚这个问题,如果弄清楚了,能给个解答吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-8 01:18 , Processed in 0.039836 second(s), 14 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表