FPGA设计的基本原则、技巧与时序电路设计
时序电路设计
首先是库说明语句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等。