chenyianhfut 发表于 2011-10-25 09:20:01

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

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)
                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)
                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)
                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)
                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,读完后读地址回归到初始值,以此循环重复,未修改钱的视频图像是连续变化的,不存在拖影,修改之后仍有视频图像,但是存在很强的拖影,不连续,只有在摄像头静止时,效果和未修改时的一样,一直没搞懂,希望高手指点下,是什么原因,在能写两帧的缓存数据的前提下怎么修改,谢谢!!!!!!!!
页: [1]
查看完整版本: DE2_70_TV里面的SDRAM读写地址的问题—求高手指点江山啊!!