新手上路 
 
	- 积分
 - 32
 
        - 金钱
 - 32 
 
       - 注册时间
 - 2017-7-5
 
      - 在线时间
 - 10 小时
 
 
 
 | 
 
5金钱 
例程上面的配置是可以的,配置如下:写SDRAM起始地址:0,结束地址:VGA分辨率。读SDRAM起始地址:0,结束地址:VGA分辨率。读写SDRAM突发长度512字节。页突发,突发读、突发写。 
在这种配置下,例如我将VGA屏幕填充为白色等颜色,是可以的。因为分辨率和突发长度是匹配的。例如:1024 * 768 / 512 = 1536。 
 
现在我想实现这样的效果:在X,Y坐标写入1字节数据,然后再向X1,Y1坐标再写入1字节数据。类似与这种效果。具体就是实现手动绘图的效果。 
我的配置是:写SDRAM起始地址:手动设置,结束地址:在起始地址的基础上+1。读SDRAM起始地址:0,结束地址:VGA分辨率。读突发长度:512字节。写突发长度:1字节。 
实验的效果是:无法驱动VGA显示。将写突发长度改为512字节,则有显示,但是显示不对。 
 
我的分析是:写配置是页突发,如果设置的突发长度是512字节,写入的数据量没有达到512字节,会出错。但是SDRAM有:页突发读写中止命令。 
按照我认为,页突发,突发长度设置为1字节,我每次指定X,Y地址,写入1字节,写完后发送读写中止命令。然后再指定地址,再写入1字节,再发读写中止命令。这样操作的流程有问题嘛? 
因为如果不设置页突发,采用单字节写方式,如果需要大量写入数据的时候,就会很占用资源。使用页突发模式,根据所需要写入的数据量,发送读写中止命令,这样灵活操作会更好。 
 
现在设置突发长度为1字节,VGA显示屏不显示。原因是啥呢?例程里面,我看到了:读写中止命令: 
                        `W_WRITE: begin //写操作指令 
                                sdram_cmd_r <= `CMD_WRITE; 
                                sdram_ba    <= sys_addr[21:20]; 
                                sdram_addr  <= {4'b0000,sys_addr[7:0]}; 
                            end      
                        `W_WD: begin    //突发传输终止指令 
                                if(`end_wrburst)  
                                    sdram_cmd_r <= `CMD_B_STOP; 
                                else begin 
                                    sdram_cmd_r <= `CMD_NOP; 
                                    sdram_ba    <= 2'b11; 
                                    sdram_addr  <= 12'hfff; 
                                end 
                            end 
 
其中`define     end_wrburst     cnt_clk == sdram_wr_burst-1     //写突发终止 
其中sdram_wr_burst是写突发长度,可以设置1-512。我设置的是1。 
 
程序流程是:判断cnt_clk计数器的值,突发写传输完成,则发送:突发传输中止命令。但是我觉得这个end_wrburst值设置的是不是有点问题。当sdram_wr_burst为1,则cnt_clk等于0的时候,条件成立。进入W_WD命令的时候会将cnt_clk清0。 
 
有小伙伴驱动过VGA嘛,能否给予一点思路,谢谢了! 
 
 
 
 
 |   
 
 
最佳答案
查看完整内容[请看2#楼] 
例程是按照整页512的突发长度的时序,不能改突发长度的,另外最大地址也必须是512的整数倍。我试过最大地址改了514等等不是512的整数倍,读写就出错了 
 
 
 
 
 
 
 |