原创 [ZT]初学fpga的教训

2008-9-14 10:07 2666 7 7 分类: FPGA/CPLD


因为使用hdl做cpld时间很长了,
所以拿到这个新人物的时候并没有去特别比较
fpga和cpld的区别,
吃了大亏,
代码3次推翻重写,
项目推迟了半年.

教训如下:
1,最致命的是我使用了80多兆的与外部通信的总线,
走lvcmos电平.后来朋友告述我说使用这种信号不要超过50M,
否则延时很难控制.高速总线信号应该选用带serdes(就是
lvds电平+串并转换)的fpga,否则布线和内部延时都很难控制.
好彩我在内部凑延时,总算解决了这个问题;

2,仔细阅读一下data sheet,
芯片各个方向的PIO口其实关联的内部资源是有
很大区别的,应该根据内部资源来设计外部管腿分布;

3,必须熟习fpga内部结构和资源
(各LUT/SLICE/PLL/RAM)的特性,使代码能够尽量match
上这些特性.比如LUT一般都是4各输入的查找表来完成
组合逻辑,这样不少于4个输入的组合逻辑导致的延时
都是一样的,超过4个输入后就导致LUT间的走线,延时暴增,
解决多输入(>4)组合逻辑的办法是用流水线(实际上是用
时序逻辑"换"组合逻辑)提前产生部分控制信号,
使最终的"纯"组合逻辑部分的输入尽量少;

4,CPLD设计可以假定延时很小,FPGA设计延时是一定
要考虑的;

5,跨时钟域(哪怕是同一个PLL产生的不同时钟)时,
一定要用高速时钟把低速信号打一下,可以大大提高
系统延时特性;

6,改善系统延时特性的的常用办法有(我用到的):
使用PLL;
流水线;
跨时钟域时强制同步;
使用尽量少的时钟(这样时钟信号就可以走传输特性较好
的"PRIMARY"连接);
使用门控时钟而尽量不要使用派生时钟(会导致时钟过多,
各时钟域间的延时关系变得很复杂,因为派生时钟相对原时钟
也有一个不小的无法预知的延时);
使用配置工具解除低速电路的约束(其实就是告述综合工具
哪些电路要求不高,可以把资源优先分给高速部分);

7,软件下面带的入门教程初学者一定要看,掌握常用的一些工具,
比如配置/约束/定为延时/查看电路实现.对常用的一些语句
会产生什么样的电路心里要有数.

8,CPLD的代码一般比较简单,结果也容易预估,一般都是边想编写,
很多时候连仿真都不要;FPGA的设计方法跟CPLD相反,是先在划分好
模块后,写好仿真代码,功能仿真后后一个模块一个模块实现,然后
在根据实现后的结果(物理仿真结果)调整各模块间的关系,再次
仿真再次实现,如此循环.仿真在fpga设计中占了80%以上的
工作量.事先的布局,模块划分,时钟产生和分配,这些工作对结果
有决定性的影响.  


 


回帖1:


内部凑延时不好吧,
    不同批次的FPGA特性不同,在这批FPGA里工作正常,在下一批次可能就不正常了。你是怎么凑的延时?



 


回帖2【楼主】:


是这样,那个80兆的总线,
从管腿到fpga内部的RAM有5ns的延时,fpga发出去的控制信号(控制dsp打数据出来)也有5个多ns的延时,这样一来回,延时就接近1个时钟周期.我只好把对内部
ram的读写控制信号全部往后延时了一个周期.
如果换个型号,延时超过1.5个周期或者小于0.5个周期,肯定又会出错.


 


回帖3:


带serdes的都很贵呀
下个项目就用FPGA了,谢谢提醒!



 


回帖4:


不太对
除了2、3、5,其他的基本不正确或不准确。和作ASIC设计一样主要是要经过正规的训练。
80MHZ就用serdes有点太夸张了。我们一般超过200MHz才考虑用serdes。我想你是没有把inout的reg放到fpga的io单元的reg里面。2年前我在XILINX的v2的-5的芯片上已经能够实现64bit 166MHz的的ddr(333MHz)控制器了。



 


回帖5:


我认为重要的一点就是一定要---自上而下的设计。
我认为重要的一点就是一定要---自上而下的设计。

希望刚刚入道的和即将入道的养成好的习惯。

搂主的这些问题都是这个原因导致的。

过程决定了结果。



 


回帖6:


不觉得
个人觉得FPGA开发比CPLD简单啊,怪了,lvcmos我跑166什么问题都没有,楼主可能是布线的问题吧?


 


回帖7:


布线
书上说超过50M的信号就要认真分析布线了。要不是电路原理上的问题



 


回帖8:


我觉得楼主的智商已经达到我们部门经理的水平了
恭喜恭喜!总体来说就是--
看起来说得很有道理
简单的东西说的很复杂
大部分结论是错的


文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条