oceanheart 发表于 2014-1-24 15:47:17

一个困扰很久的问题,关于TFT+SDRAM控制器的

最近一段时间一直研究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,保存相对应的写入地址,这样才能保证每次写入的地址正确,


各位大侠,请谈谈你们的想法吧,

ST_ATMEL_NXP 发表于 2014-1-24 16:08:36

不懂FPGA,帮顶下。是不是乒乓方式可以很好解决。不太懂。不过这种FPGA的优势在哪?现在有MCU带有LCD控制器,并且还有带加速器的。也有MPU带有LCD控制器,并且很多带加速器。还有单独的TFT控制器的,比如SSD1963,RA8875等。

woaidamimi 发表于 2014-1-24 16:12:10

研究技术很可以,做显示模块没意思了

NJ8888 发表于 2014-1-27 10:31:11

你MCU写入FIFO,等SDRAM不读时写,我以前贴过计算贴的

autodo 发表于 2014-1-27 12:14:59

ST_ATMEL_NXP 发表于 2014-1-24 16:08
不懂FPGA,帮顶下。是不是乒乓方式可以很好解决。不太懂。不过这种FPGA的优势在哪?现在有MCU带有LCD控制器 ...

以前似乎讨论过这个问题。

个人理解:

SSD和RA的管脚间距似乎比0.5mm还小,难焊接。
自己用CPLD搭,可以增加一些针对汉字的加快指令,包括自己需要的加速画图指令。
可以将显示部分与系统的CPLD整合到一起,降低成本,增加可靠性。

putty 发表于 2014-1-27 23:29:04

这样的问题,没有很好的办法,唯一的途径是提高ram带宽.
如果fpga支持的话,可以考虑用ddr2,带宽比sdram高好几倍.
fpga内ram要足够缓存一到两行的显示数据.

grantlu 发表于 2014-1-27 23:56:45

mcu写到sdram时使用一个双端口缓冲ram,记录要写的地址和数据,等读空闲时才进行写操作。

oceanheart 发表于 2014-1-28 00:59:10

NJ8888 发表于 2014-1-27 10:31
你MCU写入FIFO,等SDRAM不读时写,我以前贴过计算贴的

原理是没错啊,等到SDRAM不读取的时候写入,但是如我分析,如果采用页模式读取,那么这个写入最差的情况将需要等待那么长时间,这样的话MCU那端就不能用FMSC模式了,而是需要busy信号了

如果不采用页模式读取,那么MCU端口的处理太慢了,至少15T才能完成一次写入,感觉太慢了,所以我在想,是不是要采用页模式的话,只能先缓冲在SDRAM读取页数据的时候的那些MCU的数据和地址

这样的话是不是代价太大了!!!至少需要读数据页的X2大小的缓冲区(一个保存数据,一个保存地址,地址的话SDRAM有20位,,这样的话消耗太大了点)

oceanheart 发表于 2014-1-28 01:38:05

1、采用Microsemi中等容量的A3P125以及SDRAM(IS42S16400F)来实现,功能丰富,性能较高;
  2、接口灵活,根据不同的需要可以定制Intel并行总线接口或SPI接口等;
  3、并行总线接口的速度最高可达50MHz左右,相当于800×600分辨率的TFT在1秒钟内可以更新100副图片;
  4、支持双缓存的操作,两个缓存都可进行读写的操作;
  5、支持双缓存间数据拷贝功能,两缓存间可以进行DMA的数据拷贝;
  6、支持定点和区域更新内容;
  7、支持多图层的操作,可以支持2~4个图层,根据不同的分辨率不同而不同;
  8、支持16位色1024×768以及以下分辨率的TFT显示屏,刷新率在60Hz以上;
  9、显示数据来源于MCU,数据可以存放于外部的串行或并行的Flash,可以存放图片、汉字库等,容量大小由用户自行控制;
  10、配套提供的MCU GUI库可以实现画点、画线、画圆、画矩形等功能。


这个方案怎么可以做到50MMCU接口速率?????????怎么想都不可能啊,不会是 50M/bit吧??

NJ8888 发表于 2014-1-28 09:01:49

上面参数应当是说明能力,你的MCU跟不上那就是你MCU的瓶颈

wenjun484 发表于 2014-9-19 14:04:56

呵呵,我也在研究SDRAM的TFT驱动器,现在刚刚能够把图像显示出来,但是有个问题就是,屏幕整体往右边挪动了两列,想了很久都没有想通这是为什么,究竟是TFT刷屏模块有问题,还是MCU接口模块的问题现在还不知道,实在是没有想通,有没有童鞋知道是怎么回事呀

wenjun484 发表于 2014-9-19 14:12:37

兄弟分析的很正确呀,确实不能够用页读取模式的哦,我使用突发4位读,单独写方式,然后开一个3位深度的FIFO,缓冲数据,这样就能够保证MCU有足够的时间写入数据到SDRAM。就是我的整屏图像右移了两列,搞得我很郁闷

野猪奔月 发表于 2014-9-19 14:20:23

MARK                        

bysea 发表于 2014-9-19 14:29:52

要努力发贴了

wenjun484 发表于 2014-11-14 18:26:06

10月份终于把这个SDRAM+TFT的控制器搞完了,所有的问题都得到了解决。功能和正点原子的7寸TFT是一样的,现在在想如何提高写入速度!现在的写入速度比较慢大概能到10M/s,好慢呀,正点原子说他们的屏幕能够到26M/s的写入速度。这个速度还是很快了,我现在在想这个速度是如何实现的

xlht 发表于 2014-11-28 22:18:43

wenjun484 发表于 2014-11-14 18:26
10月份终于把这个SDRAM+TFT的控制器搞完了,所有的问题都得到了解决。功能和正点原子的7寸TFT是一样的,现 ...

请问一下你是如何实现3位深度的FIFO单独写的,是否可以指导一下
我是页读,单独写,但死活都会出现SDRAM写入丢数据,丢数据没有规律,丢的数据也不多,偶尔几个或十几个,还没有找到原因

wenjun484 发表于 2014-12-8 10:59:03

xlht 发表于 2014-11-28 22:18
请问一下你是如何实现3位深度的FIFO单独写的,是否可以指导一下
我是页读,单独写,但死活都会出现SDRAM ...

3位深度的FIFO,就是8个存储单元,不采用突发页读方式,而是采用突发读4个单元单独写的方式,每次向FIFO一次性存储4个数据,当FIFO的读写地址差值小于3时就启动突发读,向FIFO写4个数据,采用8个存储单元是防止数据溢出,FIFO读控制由TFT刷屏控制,因为采用突发4个数据的读方式,可以给单片机向CPLD写数据留出足够的宽带,如果用页读的方式,那么在突发写FIFO时候,MCU就不能向SDRAM写数据的,如果这个时候MCU向SDRAM写数据当然会丢数据啦。

xlht 发表于 2014-12-8 21:38:10

wenjun484 发表于 2014-12-8 10:59
3位深度的FIFO,就是8个存储单元,不采用突发页读方式,而是采用突发读4个单元单独写的方式,每次向FIFO ...

谢谢wenjun484的讲解!
后来测试发现单写的方式会造成数据丢失有两个原因,一是因为用的是异步FIFO,读写时钟速度不同,没有同步起来,二是写FIFO的速度快(约300ns传一个数)可能导致数据溢出;这两个问题处理后发现FIFO输入输出能正常联动起来。

wenjun484 发表于 2014-12-16 12:41:09

xlht 发表于 2014-12-8 21:38
谢谢wenjun484的讲解!
后来测试发现单写的方式会造成数据丢失有两个原因,一是因为用的是异步FIFO,读写 ...

你现在MCU写入速度是多少呢,我没有STM32F103只用STM32F407,在默认频率下用FSMC接口驱动,速度只能做到400万点每秒左右,要是超频到216MHz主频的话更低,只能到370万点每秒,如果降频到103的72MHz主频,也只能跑1023万点每秒(emWin5.22),现在想如何提高速度,有没有好的方法
页: [1]
查看完整版本: 一个困扰很久的问题,关于TFT+SDRAM控制器的