|
最近一段时间一直研究SDRAM控制器,自己做了个板子,带 7寸 TFT 分辨率为800*480 ,规格为:800+HBP=16+HFP=8, 480+VBP=8+VFP=5;
所以一行 为 800+16+8=824 整屏为 480+8+5=493行 时钟为25M,计算一下 刷一屏的时间为 824*493*40ns=16.25ms 刷新率为61Hz,
想做一个类似ILI9325的控制器, 外部有mcu接口 16b
所以是这样的一个整体 MCU--FPGA----TFT
|
SDRAM
现在的疑问是怎么在保证61Hz刷新率的情况下,把外部MCU发送到FPGA的数据及时写入到SDRAM(也就是更新显存),因为假如我用页burst方式读取数据,sdram一页为256words,tft采用16bit,刚好一页对应256像素
那么一行有800个像素点,如果我在fpga开一个256字节的fifo,很容易实现刷新,每次读取一页数据,这样需要时间为 256+6(第一次有rcd,最后一字节有pre动作),大概为 263t,如果100M时钟,就是2.62us,粗略估算一下800个字节大概为2.62*3+(800-3*256+6)*10ns=8.24us 而刷新一行的时间为824*40ns(25M时钟)=32.96us,这样每行留给写入sdram的时间就为 32.96-8.24us=24.72us
这里要注意了,我打算做的是类似9325的控制器,所以必须可以随机写入任意位置的功能,,所以这里没有采用页模式写入,而是采用随机写入功能,一次随机写入为7t, 0.07us,这样一行可以更新的显存为 24.72/0.07=353个像素,所以帧频为
353/800*61Hz=26.9Hz,所以,其实这样已经可以做动画了,
但是问题来了,如何保证外部MCU可靠地写入,因为如果我用页burst模式读取的话,在读取256字节的时候,外部MCU锁存到FPGA的数据是无法写入SDRAM的,这样如果在极端的情况下,即刚好256字节开始读取的时候,锁存到了外部MCU数据,那么这个数据必须等到8.24us才能写入到SDRAM中,最好的情况就是读取完毕的时候,无须等待,只需要7个写入周期就可以,这样做出来的MCU总线无法适应类似STM32的 FSMC,因为FSMC要求外部数据锁存时间稳定
继续分析,要想保证这个时间稳定的话,我只能想到的一个方法就是不采用也读取,而采用每次读取4字节或者8字节,其实应该是读取越少越能保证这个锁存时间越小
在分析下去 要保证tft刷新率,也就是40ns时钟需要一个数据,除了每行第一个数据需要7个周期(CL=2)以外,剩下的255个都可以一个周期读取完毕,这样平均下来,没怎么细算,就算最差的情况,每次读取2个数据都要重新pre的话 读取2个字节需要7+1=8t,也就是0.08us,刚刚好tft需要的数据在两个时钟周期也是0.08 也就是说,只要保证每次读取>2个字节,就可以保证刷新率,而且每次读取越少,这样月可以保证外部MCU数据可以最少的延时写入SDRAM(因为sdram再在读取的时候是无法写入的),这样一来,假如我每次读取4字节,需要7+3=10=0.01us,这样每次可以保证外部数据及时写入sdram的间隔为100ns,也就是说外部MCU数据输入最快不能超过10M/s
不知道做过类似的大侠,有没有其他好的方案, 我这里讨论的是随机写,就是假设最坏的情况,每次写入显存的数据地址都不在同一个行上面,如果是整页更新,那就完全没有这个烦恼,直接开一个写入fifo就行了
虽然我想到在sdram忙着读取的时候,先开一个fifo,吧mcu输入的数据先进入fifo,灯mcu空了,在写入sdram,但是这里的数据需要写入的位置都是随机的,所以不能页burst模式写入,如果一定需要这样做,那么必须再开一个fifo,保存相对应的写入地址,这样才能保证每次写入的地址正确,
各位大侠,请谈谈你们的想法吧,
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|