通信人家园
标题:
FPGA设计的技巧
[查看完整版帖子]
[打印本页]
时间:
2009-10-18 22:08
作者:
chuxian1320
标题:
FPGA设计的技巧
一 . 乒乓操作
下图是乒乓操作流程图。从图中可以看出,数据经过两个缓冲模块,在向缓冲模块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计数器等,这里不再一一介绍,详情可登录http://training.chinaecnet.com查询。
信号与变量
信号仅仅用做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等。
时间:
2010-1-25 16:49
作者:
konggu
提示:
作者被禁止或删除 内容自动屏蔽
通信人家园 (https://www.txrjy.com/)
Powered by C114