FPGA设计分享

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/shajiayu1/article/details/91970399

FPGA 市场占有率比较高的2大FPGA厂商是altera和xilinx

其中xilinx用的更多些。用的较多的硬件描述语言是VHDL和Verilog。其中verilog用的更多。

FPGA设计需要熟悉芯片的资源(主要是ip核),综合工具仿真工具的使用,理解时序和数字电路,还有就是硬件描述语言。

1 时序约束和分析

时序约束包括IO约束和时钟约束

IO约束在高速设计(时钟周期在10ns以下)时需要添加,一般的设计没有必要。高速设计时还需要PCB设计进行等长布线。目的都是让信号同时到达寄存器,打拍的时候不会错开同一个周期。

时钟约束的目的是进行建立保持时间检查。软件会根据时钟约束给出静态时序分析报告,没有告警就可以了。时钟约束更多的是一种检查而不是完善设计。这就是常说的“好的电路是设计出来的,而不是约束出来的”。

Xilinx只需要对输入时钟进行约束,软件会根据DCM的设置自己添加对输出时钟的约束,这个很方便。

Altera的时钟约束相对复杂些。这块得再看一下文档

静态时序分析可以看到哪块电路的建立保持时间不满足,可以更改设计,更改添加约束或者降低工作频率。这块得再看一下文档

2 跨时钟域处理和同步设计

首先说一下什么是不同的时钟域:

①同一个PLL输出的不同频率或者不同相位的时钟。②不同PLL产生的时钟。

原则上尽量避免跨时钟域设计,或者不同时钟域的电路没有交集,互相独立。整个设计尽可能只有一个时钟。需要别的频率可以分频,把分频当作使能。或者当频率较低时,也可以直接使用分频时钟。

解决跨时钟域问题的方法大体有2种:

① 双口ram②异步fifo

异步fifo是先入先出的结构灵活性不及双口ram。不同频时需要考虑写入读出速度检测empty和full等。

这2种方法是可以做到非常可靠的。

除了上面2种方法,在同频不同相的时候还可以用时钟打2拍,但这样可靠性不是特别高,如果对少量错误不敏感可以这样处理。

再讨论一下上级芯片提供随路时钟的情况。

比如spi的接口包含clk和data两条线。clk是随路时钟,这种情况用本地时钟保持频率优势(4倍以上)采样clk和data可以实现同步设计。

当随路时钟是占空比稳定的时钟时,也可以采用上面的处理方法。当随路时钟是稳定时钟但频率较高无法采样时,可以把时钟接到全局时钟输入引脚,做跨时钟域处理(异步fifo或双口ram),同时对随路时钟做时序约束。

3 modelsim仿真

调用modelsim进行功能仿真在FPGA设计当中是非常重要的一步工作。modelsim可以帮助我们进行非常贴近实际的全面的仿真。如果modelsim仿真通过,进行好时序约束并且综合实现没有时序报警,这时上板子测试会八九不离十。但是“好的电路是设计出来的,而不是仿真出来的”。在进行HDL设计的时候就要清楚设计的时序及综合出的电路。

构建贴近实际的全覆盖仿真平台本身是比较困难的。仿真本身也会带来问题,干扰开发设计。

还有就是搭建实际的板级测试平台,这些都可能带来新的问题,而不是设计本身的问题。木有办法,兵来将挡,水来土掩。

4 chipscope和SignalTap Ⅱ

这2个工具都是虚拟逻辑分析仪,它们可帮助我们看到芯片内部寄存器的值,而不光是IO的电平变化。而且这2个工具反应的是实际的情况(modelsim的功能仿真不考虑布线延迟),在一定程度上可以代替时序仿真。当然一般的设计我们不做时序仿真,只做功能仿真。依靠添加时序约束看静态时序分析报告检查时序问题。这2个工具为我们提供了一个观察FPGA内部寄存器的窗口,对实际的测试和调试有很大的帮助。但是chipscope和SignalTap Ⅱ并不能取代功能仿真,当然也不能完全替代时序仿真,它们进行的测试是不全面的。

5 生成的电路

现在大家都比较关注自己的coding style,但是好的coding style也不能完全保证能综合出理想的电路。关键还是得清楚代码综合出的电路。

这里的电路包含2种:

① 综合出来的门级电路(RTL)。(和FPGA没关系)

②实现之后映射到FPGA的版图。

对于xilinx可以用FPGA editor看实现后的版图,看版图对寻找关键路径和提高设计频率有好处。当不确定代码综合实现出的电路时,应该看看门级电路和版图。LUT级联的个数会直接影响设计频率。这在版图中可以看到。
6 fpga内部的微控制器(微控制器也叫单片机)

这里指的是altera的Nios II和xilinx的Picobalze,microblaze等微控制器。其实这些内嵌的cpu有的已经不是微控制器的水平了,完全可以称之为微处理器(带MMU可以装载linux wince等嵌入式系统)。对这些内部的微控制器,个人见解是能不用就不用。原因有硬件成本高,开发工具不成熟,不专业,资料少,稳定性相对较差等等。FPGA内部嵌入CPU目前只能说是我们关注的一个方向吧。

7 提高FPGA设计的最高频率

更高的频率代表更大的带宽,更大的数据吞吐量,更实时的反应。当然也带来了更大的功耗。

提高设计频率的方法:

① 减少网络扇出

网络扇出多会增加路径延迟。如果进行电路复制降低扇出可以提高设计速度。

比如一个网络的扇出是30,增加一个寄存器驱动那么每个寄存器的扇出降为15,这样就可以有效降低路径延迟。

② 用case代替if else

case综合出的是多路选择器是并行的结构。
在这里插入图片描述
XST的综合结果:
在这里插入图片描述
if else综合出的是比较器,层数越多延迟越大。

在这里插入图片描述
但是上面的代码综合出来和case的一样一样的

综合器优化了?额 确实是给优化了

是12.3的ISE用XST综合的

这种优化不具备普遍性

同样的代码用quartus II的9.1版本综合的RTL电路:
在这里插入图片描述
总之用case代替if else可以提高速度。

casez不要用,不是所有的综合器都支持。

③ 流水线

流水线的目的是把一个周期内做到工作分到多个周期内完成,这样每个周期用的时间就会减少,从而提高最高频率。

④ 努力减少组合逻辑路径上LUT的个数

这里还是用case举例
在这里插入图片描述
上面是16选1 的RTL
对应实现的版图
在这里插入图片描述
用了4个LUT和一个触发器

选择的是xilinx SP6器件 是6输入LUT

32选1的多路选择器会出现LUT的级联

当然也不是有LUT级联就一定会降低最高频率。

还可以用三态电路(BUFT)做多路选择器,这种仅限于xilinx的部分芯片类型,在输入宽度变化时,面积和延时特性几乎不变。这里只提一下

⑤ 模块划分

大型设计最困难的不是设计本身而是模块划分和仿真平台的搭建。

模块划分能影响到速度。把影响速度关键路径放到同一个模块内,会综合出最佳效果。对关键路径所在模块,采取速度优先策略;对非关键路径模块,采用面积优先策略。

补充:

体会一下CPLD和FPGA的区别:

除了FPGA内部资源丰富(PLL,软核,DSP块及硬件控制器等),需要外部配置芯片,有ram资源。

我觉得FPGA最大的特点是时序设计。当然FPGA的时序资源也丰富。时序设计并不是没有组合逻辑,而是用触发器去截断组合逻辑。如果不考虑触发器的相关延迟(这是硬件特性,设计人员无法改变),那么组合逻辑延迟和走线延迟是决定速度的主要因素。从这个方向去改善设计的最高频率,不难想象我们可以尽可能的多放触发器以减少组合逻辑延迟,这其实就是流水线。但是有些时候我们没法在组合逻辑当中插入触发器,比如多层次的比较器和多路选择器等。所以这些往往会成为影响设计速度的关键路径。用多路选择器代替比较器是个好方法,如果多路选择器输入项多造成LUT较多的级联,我们可以考虑把级联的LUT放的尽可能的近一些以减少路径延迟。这实际上就是放松非关键路径的约束,给关键路径腾出地方。还有4输入的LUT和6输入的LUT,显然6输入的LUT更容易设计出较高的频率。

猜你喜欢

转载自blog.csdn.net/shajiayu1/article/details/91970399
今日推荐