新手上路
- 积分
- 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的整数倍,读写就出错了
|