FPGA设计的基本原则
面积与速度折衷原则
面积和速度是ASIC芯片设计中一对相互制约、影响成本和性能的指标,贯穿FPGA设计的始终。在FPGA设计中,面积是指一个设计消耗的FPGA内 部逻辑资源的数量,可以用消耗的触发器和查找表的个数或者是等效逻辑门数来衡量;速度是指一个设计在FPGA上稳定运行时所能 达到的最高频率,由设计时序状态决定。
关于面积和速度的折衷,应在满足设计时序和工作频率要求的前提下,占用最小的芯片面积;或者在所规定 的面积下,使得设计的时序余量最大,能够在更高的频率上稳定运行。通常,在资源足够的情况下,更多是选择速度的最优,这也是FPGA的 特点。在具体设计中,应根据具体性能指标要求,在保证系统功能和性能的同时,降低资源消耗从而降低功耗和成本。
硬件原则
第二个原则是硬件原则。
首先,要注意FPGA的逻辑设计所采用的硬件描述语言VHDL或Verilog与 软件语言C和C++有本质区别,在使用硬件描述语言进行设计时,不应片面追求代码的简洁。
其次,要采用正确的编码方法。要对所需实现的硬件电路的结构和相互连接有清晰的理解和构想,然后再用 适当的VHDL语言表达出来。实际上综合软件对所写的代码在进行推论的时候,得到的硬件结果会因编码方式的不会而不同,直接影 响硬件的实现。
系统原则
第三个原则是系统原则。FPGA作为硬件系统设计,应该对设计全局进行宏 观上的合理安排,包括逻辑功能模块划分、时钟域信号的产生和驱动、模块复用、时序或引脚约束、面积速度折衷等。这些系统上的考虑不仅关系到是否能够最大程 度地发挥项目成员的协同设计能力,而且直接决定着设计的综合、实现效果和相关的操作时间。
模块化设计是系统原则的一个很好体现,它是自顶向下、模块划分、分工协作设计思路的集中体现,是大型 复杂系统的推荐设计方法。图1是模块化设计的简单流程。
同步原则
在设计电路时,可以有异步电路和同步电路两种实现方法。异步电路使用组合逻辑电路实现,没有统一的时 钟信号,容易产生毛刺和竞争冒险;同步时序电路使用组合逻辑和触发器实现电路功能,主要信号和输出信号都由时钟驱动触发器产生,能够避免毛刺,信号稳定。
·从资源使用方面考虑,推荐使用同步设计。虽然在ASIC设计中同步电路 比异步电路占用的面积大,但是在FPGA中,是以逻辑单元衡量电路面积的,所以同步设计并不比异步设计浪费资源。
·从延迟设计方面考虑,异步电路的延时靠门延时来实现,比较难预测;同步电路使用计数器或触发器实现 延时。
·同步设计时钟信号的质量和稳定性决定了同步时序电路的性能,FPGA的 内部有专用的时钟资源,如全局时钟布线资源、专用的时钟管理模块DUL、PLL等。
·目前商用的FPGA都是面向同步的电路设计而优化的,同步时序电路可以 很好地避免毛刺,提倡在设计中全部使用同步逻辑电路。特别注意,不同的时钟域的接口需要进行同步。
FPGA设计的技巧
乒乓操作
图2是乒乓操作流程图。从图中可以看出,数据经过两个缓冲模块,在向缓冲 模块1输入数据的时候,缓冲模块2的数据会送到下一级进行处理,从外部看数据流没有停顿。所以乒乓 操作能够提高处理速度。
实际上,乒乓操作是用一种低速模块来处理高速数据流,即用两个缓冲模块实现了串并转换,用两个预处理 模块并行,利用面积换速度。
串并转换
串并转换是FPGA设计的一个重要技巧,是数据流处理的常用手段,也是面 积与速度互换思想的直接体现。串并转换的实现方法多种多样,根据数据的排序和数量要求,可以选用以下方式:小的设计用寄存器、数据量比较大的用ROM、 复杂的串并转换用状态机,或者直接利用功能模块来实现。
流水线操作
流水线操作是高速设计中一个经常用到的设计手段。如果某个数据的处理流程分为若干步骤,而且整个数据 处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法提高系统的工作频率。
·流水线设计时,要对时序进行合理安排,每个操作步骤的划分要合理,仔细考虑各个步骤间的数据流量。
·如果前级操作时间恰好等于后级操作时间,设计最为简单,前级直接输出到后级输入就行了。
·如果前级操作时间大于后级操作时间,后级会经常空闲,可以对前级的数据进行适当缓存,再输出到后级 的输入端。
·如果前级操作时间小于后级操作时间,必须通过复制逻辑,将数据流分流和并行预处理,或者在前级对数 据采用存储、后处理方式、否则会造成后级数据溢出。所以怎样平衡各个模块的处理时间,在设计中要给予适当的考虑。
数据接口的同步
·如果输入数据的节拍和本系统处理时钟同频,可以直接用本系统的主时钟对输入数据寄存器进行采样,完 成输入数据的同步化。
·如果输入数据和本系统的处理时钟是异步的,要用处理时钟对输入的数据做两次(或多次)寄存器采样, 完成输入数据的同步化。两次(或多次)采样的作用是抑制亚稳态的传播,适用于对少量对错误不敏感的功能单元。
·为了避免异步的时钟域产生错误的采样电平,一般使用RAM、FIFO存 储的方法完成异步时钟域的数据转换,在输入端口使用上一级时钟写数据,在输出端口使用本级时钟来读数据,能够非常方便地完成异步时钟域之间的数据交换。
时序电路设计
图3给出了时序电路的一般结构。
首先是库说明语句Library declarations。接着是实体 结构,给出实体模块的名称Entity,由Port引出的输入输出的清单。再后面是结构体,然后是 内部信号说明。接着设置了一个状态进程,定义存储元件,进程名称为State process,敏感的清单一般是存储元件,reset、next state、Input等信号,是存储元件的输入信号,在这些信号下,进程会激活。然后是状态进程的Begin, 开始以后对状态的元件进行VHDL描述,顺序描述完以后,结束状态进程。下面的设置是组合进程,这个进程的敏感清单通常包括所 有的输入。接下来是进程的Begin,在Begin里头给出了规定组合逻辑的VHDL描 述,最后是进程结束与结构体结束。
前面已经讲过,FPGA设计尽量采用同步设计。这里要考虑同步硬件的RTL描 述。描述设计的寄存器到寄存器的功能,即描述寄存器之间组合逻辑的功能。
有效编码方式和If-Then-Else比较
在组合进程和状态进程中,都可能会用到If-Then-Else和case语 句,综合出来的结果和组合逻辑情况一样,都会有不同,case语句用一个模块来实现,If-Then-Else用 带有特权编码的译码器实现。
在组合进程和状态进程中,用If-Then-Else和case语 句带来的问题
对Case语句的要求
一般情况下,如果不需要特权编码,建议用Case语句。组合逻辑上,要求Case语 句对所有分支进行定义,如果有几don't care输出也可以利用,能够节省描述方式。Case语 句能节省资源,减少延时。
Case语句在组合进程和时序进程中带来的问题
·Case 语句在组合的进程(VHDL)或 在always语句(Verilog)中:
要求在case语句中,对所有分支中的所有输出必须定义,才能防止出现锁 存;如果不是所有的分支都定义了,可以在case语句之前利用一个缺省语句来防止锁存的产生。
·C语句在时序进程(VHDL)或在always语 句(Verilog)中:
如果在Case语句的分支中有的输出没有定义,就会产生一个时钟的使能信 号,这个信号并不出现错误,但是可能会产生一个很长的时钟使能方程式,使设计不能实现。那么在case语句之前利用一个缺省语 句防止不必要的时钟使能产生。
FPGA设计常用的一些模块有:存储单元、全局时钟资源和锁相环、全局复位/置位信号、高速串行收发器等,下 面做简要介绍。
锁存器与寄存器
锁存是电平有效,在电平有效的情况下,输入送到输出;寄存器是时钟沿有效,当时钟到的时候才输出。在 逻辑单元里头除了查找表外都有寄存器,所以建议大家使用沿有效的寄存器,不要用增加组合逻辑来实现的锁存器。
时钟使能
VHDL程序的编码方式将决定是不是利用时钟使能信号,时钟使能使得时序约束更容易控制。
锁存与变量
推荐分配一个初始值或者信号给变量,就不会有反馈出现,如果一个变量没有分配初始值,获得一个信号锁 存就要产生,可能引起设计功能不正确。锁存的产生和变量的情况一样,不要有不确定的条件产生。
DFF利用rising_edge
触发器利用语句rising_edge(clk) 时钟的上升沿,如果时钟的上升沿来了,则数据给定,这是寄存。rising_edge是IEEE的 函数,是在1164的软件包里定义的一个函数,规定了信号值必须是0和1,X、Z到1转 换是不允许的,三态到1的转换是不允许,必须是0到1。
DFF利用clk'event and clk=1
如果用clk'event and clk=十,clk就 是信号名称,event是VHDL的一个属性,规定了信号值的变化,那么CLK等 于1意味着正沿触发。clk'event and clk=1,信号的名称是clk,event表 示信号的数值需要有一个变化,等于1表示正沿触发,是沿触发的语句,综合出来是触发器、寄存器的推论。
移位寄存器
这里的描述是IF的异步清除CLK等于1的 时候,Q全置0,然后上升沿到达以后,如果使能等于1,Q等 于Q的低七位挪到高七位,补充一个入信号,是一个左移,移位寄存器是并行出,串行入,异步的清除和使能左移,如果增加和移去同 步控制,在这个方式出现移动,这个语句里头信号只是表示高七位和进来的信号组合成一个八位的信号。
基本的计数器
基本的计数器主要有带时钟使能的计数器、带同步清零的计数器、上/下计数器、带同步加载的计数器、带 同步加载和计数使能的计数器、带同步加载和计数使能的计数器、带同步加载的上/下计数器、模块200计数器、使用整数的模块200计 数器等,这里不再一一介绍,详情可登录查询。
信号与变量
信号仅仅用做VHDL实体的连接口。信号仅可以在结构体内说明,它们可以 作为参数通过函数和过程。变量在进程块、过程和函数内进行说明。信号赋值通过“<=”实现,变量的赋值通过“:=”实现,见图4和 图5。
三态Tri-states
IEEE的标准在STD_LOGIC软件包中定义了三态的Z值, 仿真就是高阻态,综合的时候转换成三态缓冲器。
Altera器件只有I/0单元有三态缓冲器,其好处是消除了可能的总线连接,解决了 内部逻辑的位置问题。因为无需三态缓冲区,减少了器件的测试,节省了成本。其内部的三态必须转换成组合逻辑,复杂的输出使能容易引起错误和低效率逻辑,但 是在I/0单元里有三态缓冲器。
双向管脚
当管脚被说明作为方向INOUT的时候,利用INOUT的 脚作为输入或者是三态输出,在程序中,设置了一个bi direction,作用双向的INOUT信 号。当CE使能信号等于1的时候,来自核的from core信号送到 双向脚,否则的话三态,这个时候双向作为一个三态输出,还有一个输入赋给,来自信号送到三态,输入送到内核。
存储器
综合工具有不同的能力来识别各种存储器。为了识别各种存储器,综合工具对特定的译码类型非常敏感,通 常在综合工具文件中有说明。综合工具可能在结构实现上有一些限制,如只有同步写、时钟配置的限制、存储器尺寸的限制等,必须说明一个阵列数据类型来保存存 储器的值。存储器有单端口Memory,单端口双时钟Memory,双时钟Memcry、ROM等。
评论
查看更多