cicnx 发表于 2009-5-6 23:59:52

CPLD与单片通讯用外总总线接口速度可达到多少?

CPLD: Max EPM570
时钟 50MHZ

单片机: AVR32 UC3A051212MHZ PLL 66MHZ

CPLD与单片机通过EBI总线相连.

现在要把大量的数据从单片机送到CPLD(CPLD另接了一片RAM,把单片机送过来的数据存入,RAM的读写时钟25MHZ).
CPLD驱动一片800*480的TFT屏, 所以数据量很大. TFT驱动是60HZ扫描, 从RAM中读出数据送LCD.
扫描时钟为25MHZ,由50MHZ分频得到. 数据在时钟上升沿读出送LCD. 所以外部写RAM时只能在25MHZ时钟的下降沿写入.这样才可以不打断LCD的刷新.

与MCU的接口写入算法为:

always @(posedge clk)
begin
        wr_q1 <= wr_n; //wr_n 为CPU的写信号 WR
end
always @(negedge clk)
begin
         wr_q2 <= wr_q1;//对wr_n打两拍(在下降沿打了一拍,应该算一拍半了)
end

数据在wr_n下降沿数据存入CPLD.
always @(posedge clkor negedge rst_n)
begin
        if(!rst_n)
        begin
                cmd <= 0;
        end
        else if( wr_q2 && !wr_q1) //下降沿
        begin
                cmd <= Data;//从总线读入数据
        end
end

现在发现这样写的效率也不是很高.
现在是CPU速度比CPLD时钟快.那主要问题应该是CPLD的处理算法.
有什么好算法速度可以提升,且稳定呢? 需要FIFO吗? 有必要吗?

cicnx 发表于 2009-5-7 00:01:38

现在在UC3A0512上跑了FreeRTOS + UCGUI系统, 点这个自己的TFT驱动. 运行是OK了, 但刷新不理想,主要是MCU写CPLD部份影响了速度.

Oliver 发表于 2009-5-7 00:21:28

你做了就知道了,不是好玩的东东.

LCD的时钟为23.04MHZ,RAM才25MHZ的读写速度?

16位色都驱动不起来,8位还可以.但必须用FIFO.

如果你等得了,就用我的现成的吧.

可以到65MHZ的RAM访问率(130B/S).点时钟最大32.5MHZ.

Oliver 发表于 2009-5-7 00:23:04

错了,130MB/S,总线可以到20MHZ,更快没试,

cicnx 发表于 2009-5-7 08:36:26

【3楼】 Oliver
期待你的算法!

我现在点LCD是25MHZ时钟,晶振用的是50MHZ的.

因为我是用AVR32驱动的, 所以16位色没问题. 数据总线就是16位的.
RAM用的是-10T的, 是不是就是10ns?

现在点是可以点起来了,但就因为与MCU的IO速度跟不上,写一屏的数据量太大了. 显示个图片有点拉窗帘了....

FIFO我还没用过.. verilog也不是很熟,边用边学的..

Oliver 发表于 2009-5-7 08:58:53

你现在的问题是RAM的访问太慢了,让CPLD跑快点吧,75MHZ或者100MHZ.
没有空闲的时间给MPU接口操作.

我是把RAM的访问速度控制到108MB/S(最高150MB/S),当640*480*3*60=55.296MB/S,所以我的显存还有90多MB的空闲可供读取,16位的话也就是可以到48MHZ,而异步时钟域同步后不可能到48MHZ的,所以我的显存带宽还有很大余量

而你的...几乎相等了

还有大数据量交换不一定是CPLD或者接口的问题,我分析下来FOR循环占用了太多时间,等STM32回来后用DMA来处理

不然总线数据压力过大

cicnx 发表于 2009-5-7 10:25:57

但是RAM的速度跟得上吗? 你刷新LCD用多少时钟? 我800*480 16bit 色 60HZ扫描

Oliver 发表于 2009-5-7 11:03:19

RAM可以到200MB/秒(10ns,16bits).

LCD点时钟可以设置分频因子.最高32MHZ,这时还可以驱动成24位色,还有空闲带宽留给总线读写.

你800*480:
点时钟大概:800*480*68=26MHZ
16位色RAM带宽:800*480*2*60=46MB/S

cicnx 发表于 2009-5-7 11:39:22

主要是点时钟与写入顺序逻辑设计部份,可能我的算法还不够优化. 感觉写数据很慢.
CPLD内部直接清零倒是很快. 一瞬间就可以清完了. 也是25M的时钟写入RAM清的.

但外部写进来就变慢了. 如果要一点点的清,那非常的慢..50MHZ的异步时钟读入外部的数据的. 没理由那么慢的.
现在将就用着,先把程序的功能做出来了才来优化这部份.

cicnx 发表于 2009-5-7 11:40:35

UCGUI运行效果
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_442758.jpg
(原文件名:img275.jpg)

Oliver 发表于 2009-5-7 15:25:48

分析了一下,AVR32我不清楚,用同等ARM7级别速度比较快的STM32的FSMC驱动这么大屏(800 480,16位色)

图片放FLASH最快12fps.如果处理不好或者模拟总线还要打折扣...

ST的AN显示STM32在72MHZ时,FSMC刷320*240最多67fps.

----------------------
之前错误的以为STM32的DMA可以把内存数据后台传递给FSMC的,原来不可以,不要被我误导啊

gzhuli 发表于 2009-5-7 16:55:05

【7楼】 Oliver

请教一下,你的RAM读写时序是怎样的?
10ns的ASRAM,写入时WE占了8ns,剩下2ns置高?还是WE长低直接跳地址?
如果直接跳地址,寻址方式是线性还是格雷码?线性寻址WE长低会不会引起寻址错误?

Oliver 发表于 2009-5-7 20:59:11

一直拉低就可以

规格书上很清晰的写着对于SRAM的写是对若干控制信号,地址信号的逻辑组合(里面应该有延时电路来处理),非边沿触发.

线性地址

cicnx 发表于 2009-5-8 00:10:00

【12楼】 Oliver

你的时序分配是怎么样的呢?

EPM570 跑100M稳不稳定?


http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_442972.JPG
(原文件名:tft.JPG)


        系统在A步检测是否有数据写入到CPLD(来自MCU的数据),同时在A步送出点屏的地址到RAM准备读数据
        在B步输出地址到一临时寄存器,在C步送到RAM地址.并拉低RAM的写(WR)信号
        在C步把RAM的数据读出送到LCD上(在A步已经送出了屏地址),同时在C步也把准备写入RAM的外部数据的地址锁存到RAM上
        如此循环... 即读写各需时间均为20ns...

RAM是10ns的,这样花了20ns浪费了一半的资源..
你们都是怎么处理的呢?

gzhuli 发表于 2009-5-8 01:24:02

【12楼】 Oliver

之前没弄过高速异步SRAM,对接近存取极限速度时的时序不太了解。

ISSI的datasheet没说地址变化具体在什么时间点生效,担心线性寻址时多位地址变化会出错,所以布线的时候在想要不要像DDR那样布等长线。我看你的板没有什么特殊处理,如果时序也没什么特别,那我就放心了。

感觉异步SRAM的工作方式还是比较怪异,假如WE长低,地址100ns才变一次,那它的写周期是从最先变化的地址位边缘算起,还是从所有地址线稳定后算起呢?如果1ns变一个地址位,会发生什么事情呢?同样地,如果WE长低,地址不变,数据位这样变化,又会怎样呢?感觉没有了同步时钟,一切都变得不是很可靠……

Oliver 发表于 2009-5-8 01:30:12

我用的是流水线结构

全部模块化操作.感觉你这样A啊B的把很多模块绞合在一起了(MPU接口,LCD显示,SRAM访问....)
不利于时序分析,自己也搞不懂代码,还带来很多仿真排障困难.

按优先级,谁优先谁操作,都是并行运行的

另外你异步时钟域转换就这么检测一下肯定不行的,必须同步2-3拍,你想一拍搞定很容易因为冒险引起恶性循环甚至系统崩溃.

也许等你吃亏后你就能明白了

cicnx 发表于 2009-5-8 08:38:28

异步时钟域已经在A前打了两拍了...

如果不分步时序会不会打乱?总需要一个同步点吧?
还有LCD的扫描算是固定的吧, 如60HZ扫描周期.

Oliver 发表于 2009-5-8 10:35:43

那就好,只要打了1-2拍(最好是2拍以后)那就基本不会有冒险恶化的问题了

只要你的逻辑是清楚的不会乱,它是一个系统性的东西,乱不了

我做的不是固定的,
DCLK可设置分频
THB,THP,THD,THF,TVB,TVP,TVD,TFV可设置
所有输出脚极性可设置


LCD按规格书搞,一般都是60HZ

cicnx 发表于 2009-5-8 11:17:52

我现在处理的时序应该是对的了, 因为已经可以正常点屏. 也可以由MCU送数据刷新等操作.

现在问题是怎么优化算法来提高读写速度的了.

cicnx 发表于 2009-5-8 11:24:12

为得提高速度, 我在CPLD里做了一些命令, 如: 清屏, 一字节(8/16bit)变8点或16点一次性写入, 多点写地址自动+1,水平线, 垂直线等加速算法. 方面绘制GUI界面显示点阵汉字等

这些算法只对单色有效. 如要送真彩色图像就要一个点一个点的送数据了.
以AVR32全速的写进去会丢数据.证明处理不过来了! 现在最笨的作法就是 加了一个BUSY口检测是否准备好才写入数据. 这也是导致数据跟不上的原因了

cicnx 发表于 2009-5-8 11:29:13

如能实现如下写入方式就好了
memset,memcpy
unsigned char *screen_ptr; //指向显存的地址

memcpy(screen_ptr,buf,xxxx);    //转移数据

memset(screen_ptr,0x00,800*480); //清屏

直接寻址,不需要额外等待

就算不需要DMA,能达到这样应该也可以接受了

Oliver 发表于 2009-5-8 11:58:13

前面我不是给你算过了吗?最快只有几fps.

如果你不能忍受就赶紧的换方案,努力努力呢可以到几fps的.

你现在写一屏图片需要多少时间

cicnx 发表于 2009-5-8 21:16:33

没实测过有几fps. 不过已经可以感觉到慢...

Oliver 发表于 2009-5-8 22:40:57

数一下嘛,很简单,10秒刷了几次,或者30分刷了几次,一除就有了.

我那个35fps就是数出来的.

太快了程序上来个刷10次扭一个IO,数LED变化次数,还太快就刷100屏扭一次IO

cicnx 发表于 2009-5-8 23:02:57

我弄个测试程序试一下...
你的能达到35fps已经很不错了.. 主时钟是多少?

Oliver 发表于 2009-5-8 23:09:56

35是个测试程序,刷固定颜色.
我的FLASH存不了一张图片,现在是SD卡中读BMP.

cicnx 发表于 2009-5-11 10:48:59

经过测试结果, 我现在刷新速度都不好意思说出来了...
倒是测试也一个问题, AVR32 跑66MHZ上,SMC的速度也快不了多少. 10几M的速度.
就算CPLD的处理速度上来了, CPU送数据也是跟不上的.

【25楼】 Oliver

CPLD的算法上可给个指点? 谢谢了... 看你发过的贴,你在这方面有很多研究了..我也才是刚开始弄,
虽然可以显示了,但这速度实在跟不上. 还得多花点时间研究研究了...

Oliver 发表于 2009-5-11 11:39:39

【26楼】 cicnx:你这么大的屏,速度肯定上不来的.

一般总线速度为3周期以上
(WR:地址/数据/控制线建立1周期;WR释放1周期;地址/数据/控制线保持1周期)
(RD:地址/控制线建立1周期;延迟1周期后读数据;地址/控制线保持1周期)

如此看来通常总线最快为3分频,STM32可以2分频,我还没理解过它的原理;

我当前试过LPC2214 @11.0592*5MHZ,WST1=0;WST2=1,也就是写需要延迟1周期.读不要延迟.

dr2001 发表于 2009-5-11 11:48:38

To 27# Oliver
一般来说,内部使用同步时序的异步总线接口,能达到这样的分频
读:不分频,因为异步数据读不需要任何信号跳变,CS/RD都是低,地址稳定足够长时间就能在DB获得稳定的数据输出。周期合适,上升沿打出来地址,下个上升沿锁数据就行了。
写:二分频,主要是WR信号必须有跳变,如果不是双边沿同步,这个就没办法了。

Oliver 发表于 2009-5-11 11:59:39

你所谓的SMC速度10多MHZ?算他10MHZ吧.如果总线发挥到极致可以26fps左右(10MHZ/800/600).

当然这只是假设,实际上更多的时间全部浪费在运算和循环上了.

关于CPLD方面的指点我是选择性的,很抱歉
(如果你善于收集整理资料信息会收获很大)

当然我还是希望你用成熟的方案,把精力放到自己最具优势的地方,学习另当别论.

Oliver 发表于 2009-5-11 12:05:25

【28楼】 dr2001:
你说的这个是访问异步存储器,和CPLD就不能.

原因很简单,任何信号跳变都有产生"冒险"的风险,除非你CPLD时钟比你总线速度快几倍,那你总线分不分频都无所谓也可以.

cicnx 发表于 2009-5-11 17:52:05

to 【30楼】 Oliver
你已经帮了不少了! 在论坛上看了你发过的回过的贴,帮助很大!

做这个1是为了学习,2也是为了以后开发产品有个可选方案..

其实现在我要求也不是很高, 驱动这么大的屏单片机想达到60fps是不太可能的了.
有个24fps,至少清屏不能看到拉窗帘吧?

现在呢AVR32送出的数据速度是12.5M左右了(实测),并把WR信号宽度故障调到40ns,以方便CPLD中检测.
如果能让这12.5M写入CPLD中不需要等待就OK了.

点屏(读RAM)是25M ,还有25M的带宽可以写RAM的. 速度比输入的速度快,理论上可以处理过来的..

算法还有很大空间优化...

Oliver 发表于 2009-5-11 18:11:54

12.5MHZ啊?是慢了点.

不过就算CPLD能提高3倍也未必能满足你的要求(你现在都不好意思说fps,那肯定是<1fps的,提高3倍又能如何??)

但对于CPLD要提高3倍却难于登天,不要在这个位置纠缠了.

1.加大GRAM位宽
2.双图层切换

我觉得以上比较靠谱,希望对你有用

cicnx 发表于 2009-5-11 21:03:43

是考虑过双图层, 但这么大的屏占用的内存还挺大的.
其实现在的fps大概可刷2fps左右 :(

用来显示一下GUI还是可以接受的.GUI本身有剪切,并不需要全清屏, 且单色清屏我有专门的指令硬件清. 不需要送整屏数据.

只是全部程序功能都写得差不多了, 自己也对这个刷新效果不太理想. 不甘心才一直想搞好一点的.

不过还是非常感谢 Oliver的帮助!

Oliver 发表于 2009-5-11 21:47:57

那也不错了,72MHZ的STM32(36MHZ总线速度)用FSMC刷800*480
图片放内部只有5fps.

cicnx 发表于 2009-5-12 11:33:15

优化了一下有点进步...
读入一800*480的图片,在内存中(SDRAM)中. 不断显示到屏幕上.
大概有8pfs左右... (用逻辑分析仪监测WR信号线计算出来的,3-4Mbit * 16的写入速度)

Oliver 发表于 2009-5-12 12:41:14

【35楼】 cicnx:
AVR32你挂的是SDRAM啊?程序在哪里运行?如果也是外部的话会影响数据存取(指令数据共用总线),这个也很好资源.

况且你的主时钟只有66MHZ

cicnx 发表于 2009-5-12 14:17:39

程序还是在flash中运行, SDRAM只是用来存数据用的.
现在没法往下测试了,因为AVR32 SMC的速度没法提高了. 不过还没试DMA方式

cicnx 发表于 2009-5-12 20:37:13

我的堆分配是在SDRAM中的. 跑了FreeRTOS,他的堆是动态分配的, 也就是堆栈是在SDRAM中了

flyingcys 发表于 2010-6-24 04:14:34

学习

flyingcys 发表于 2011-1-20 15:11:08

MARK

alexmayer 发表于 2011-2-24 16:09:52

学习一下这个帖子。

pafvell 发表于 2011-5-10 11:25:04

MARK
页: [1]
查看完整版本: CPLD与单片通讯用外总总线接口速度可达到多少?