FPGA设计的五大高级进阶点

FPGA设计的五大高级进阶点

博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢!

引言

随着FPGA在大规模系统级的开发设计应用里,FPGA设计里面往往经常会涉及到五大技术点,乒乓操作设计,流水线设计,跨时域处理设计,亚稳态的产生跟毛刺的消除设计以及状态机的设计。本文将介绍这五大技术点的设计应用优势,介绍FPGA设计的基本思想跟技巧原则。具体的电路设计示范在后续的博客中再做介绍。

乒乓设计

在大数据交互的工程里,常常需要用到乒乓操作设计来达到在保证数据交互稳定性的同时,也可以节约FPGA工程缓存内存。 乒乓操作是一个主要用于数据流控制的处理技巧,典型的乒乓操作如下图所示,外部输入数据流通过“输入数据流选择单元”的选择模块,将输入数据送入两个数据缓冲模块中,再通过“输出数据选择单元”的选择模块,输出缓存模块的数据给数据流运算处理模块进行数据处理。
数据缓存模块一般采用:双口RAM(Dual RAM),SRAM,SDRAM,FIFO等。
输入/输出数据流选择单元一般通过状态机来加以实现。
在这里插入图片描述

乒乓操作的设计原理

在第1个缓冲周期中,将输入的数据流缓存到“数据缓冲模块1”;在第2个缓冲周期里,“输入数据流选择单元”模块将输入的数据流缓存到“数据缓冲模块2”模块的同时,“输出数据流选择控制单元”模块将“数据缓冲模块1”第一个周期缓存的数据流送到后续的运算处理。在第三个缓冲周期,“输入数据流选择单元模块”再次切换,将输入的数据流缓存到“数据缓冲模块1”,与此同时,“输出数据流选择单元”模块也做出切换,将“数据缓冲模块2”缓存的第二个周期的数据送到后续的运算处理,如此循环。
  这里通过利用了乒乓操作完成数据的无缝缓冲与处理,乒乓操作可以通过“输入数据流选择单元”和“输出数据流选择单元”按节拍,相互配合地进行来回切换,将经过缓冲的数据流没有停顿的送到“后续的运算处理模块”。

多级RAM的乒乓结构

根据上面乒乓操作的设计原理,可以敲定多级RAM的乒乓结构数据通道如下图所示,通过乒乓操作将ram1跟ram2的依次缓存数据进行并行处理,以此提高系统的运行速度。而通过FIFO由此可以实现跨时域的数据流稳定交互,最后经过运算处理存储到PC Memory。
下图的多级RAM的乒乓结构有四个优点:
1:以定长的数据流为单位进行大数据处理;
2:提高FPGA系统数据流的并行处理速度;
3:大大提高FPGA系统的数据处理运输速度;
4:可以保证跨时域数据交互的稳定性;
在这里插入图片描述

流水线设计

流水线(Pipeline)设计可以说是FPGA系统提高速度最常用最强有力的手段,也是一种典型的“面积换速度”的设计思想。
假设在电路中,每个时钟周期执行N个操作,而且时钟的工作频率为F;那么电路的吞吐量=NF ops/sec。而Pipeline的设计原则主要有提高时钟周期F或者增加执行操作N(增加了面积)。
流水线设计原则1:通过增加时钟频率F来提高吞吐量,达到时序延迟(latency)和电路面积(area)的折中平衡(tradeoff)。
流水线设计原则2:通过增加执行操作N(增加了面积),从而增加电路的吞吐量=N
F,提高电路数据处理速度。

流水线设计原则1

流水线设计原则1:通过增加时钟频率F来提高吞吐量,达到时序延迟(latency)和电路面积(area)的折中平衡(tradeoff)。
回顾一下之前博文里介绍的静态时序分析设计,什么决定了电路的最高工作频率呢?
对于电路来说,时钟周期1/F=T>Tsu - Tun + Tco + Tdata;Tsu,Tun,Tco一般来说都是工艺器件决定的,所以要想提高时钟频率F(时钟周期减小),那么为了保持电路时序正常电路余量为正,必须使Tdata减小,也就是说要减小组合逻辑的工作延迟。
总而言之,组合电路之间的延时决定了电路的最大工作频率,故不能过于复杂。
在这里插入图片描述
通过上面的介绍,例如下图所示,在基于流水线设计原则1下,可以将较大的组合逻辑Algorithm combinatory logic进行拆分为两个部分或者多个部分的Algorithm combinatory logic。通过插进寄存器来实现对电路时钟频率的提高。注意的是每增加寄存器电路的面积相应也就会增加,也就是常说的“面积换取速度”的说话。如下图所示,假设原路径延时为t,加入1级流水线并且假设路径切割均匀,则路径延时可以减少到约t/2,从而系统速率可以提高到原来的2倍左右。注意的是输出同时会往后推迟2个时钟周期。所以采用流水线技术时,要记得在后面进行时序调整。
在这里插入图片描述

流水线设计原则2

流水线设计原则2:通过增加执行操作N(增加了面积),从而增加电路的吞吐量=N*F,提高电路数据处理速度。
例如下图所示,在本来的设计里面输入信号通过每个时钟周期的节拍1,节拍2,节拍3再输出信号。也就是三个时钟周期只能输出一个信号,但是如果将输入信号通过下图的三条数据通路,再由输出选择器来选择输出信号。这样子三个时钟周期就可以输出三个信号。输出信号的速度比原本的设计快了三倍。注意的是这里增加了两条数据通路就会增加了电路寄存器,从而也增加了电路的面积,也就是前面所说的“面积换速度”设计原则。
在这里插入图片描述

跨时域设计

在许多的FPGA系统电路里面常常会采用多时钟设计,最常见的例子是两个异步微处理器之间的接口,或微处理器和异步通信通道的接口。 由于两个时钟信号之间要求一定的建立和保持时间, 所以在进行跨时域电路设计的时候,一定要对异步信号进行同步化,在做SDC时序约束的时候,对一些无关的异时钟进行set_flase等。
在这里插入图片描述

亚稳态产生跟消除

如果在一个FPGA系统电路里面存在多个独立(异步)时钟,并且存在多时钟跨时域(clock domain)之间的信号传输,那么电路会出现亚稳态。出现亚稳态的平均时间间隔常用“平均无故障时间” (MTBF, Mean Time Between Failure)来表示。单个触发器的MTBF为温度、电压、辐射等因素都对MTBF有影响。
在这里插入图片描述
对于跨时域的数据交流,如果只做一个寄存器就直接输出去运算处理,此时的输出数据是带有亚稳态的,对电路设计有危险,所以对跨时域的电路设计在传输数据给外面去运算处理的时候,要再“多打一拍寄存器”再输出去给外面运算处理。这样子的优点可以消除电路因为跨时域而产生的亚稳态,实现成本也低,不过并不能完全消灭亚稳态,并对电路造成了延迟,所以在后面的电路设计,要考虑电路数据的延迟进行时序调整。
在这里插入图片描述

多时钟系统设计

在许多的FPGA应用设计中只将异步信号同步化还是不够的,当系统中有多个非同源时钟的时候,数据的建立和保持时间很难得到保证,设计人员将面临复杂的时间分析问题。最好的方法是将所有非同源时钟同步化,不过工作量与寄存器随着增加。对于多时钟系统的设计有以下几个建议:
建议1:对于多时钟系统的设计,信号命名和模块划分要有科学合理的区分;
如下图所示的划分有以下好处:
• 有利于检查信号所通过的时钟域;
• 有利于各模块进行单独的静态时序分析;
• 有利于在静态时序分析中快速地设定falsepath;
在这里插入图片描述
建议2:异步信号穿越时钟域时,这些信号与异步时钟之间的相位关系数是无穷的,所以在整个系统静态时序分析时必须set_flase_path忽略这些信号路径;
建议3:对于常用的缓存单元是DPRAM和FIFO,在输入端口使用上级时钟写数据,在输出端口使用本级时钟读数据。
建议4:时钟的产生要纯净,时钟最好不要通过任何组合电路,或者不要用组合电路产生时钟;
建议5:注意使用同步化电路来对异步信号进行同步;
建议6:采用FIFO方式是解决问题的最好的方法,但需要注意FIFO的深度的设定以及FIFO门限的控制;
建议7:尽量减少握手控制信号的数目,以避免同步化造成的信号拉伸而破坏控制信号之间的相位关系;
建议8:快时钟域信号进入慢时钟域时,要注意信号丢失的避免和检测。

毛刺消除设计

信号在FPGA器件内部通过连线和逻辑单元时, 都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间, 组合逻辑的输出状态不确定, 往往会出现一些不正确的尖峰信号, 这些尖峰信号称为“毛刺”。

组合逻辑的毛刺消除

如下图所示,由于受到单元连线的长短和逻辑单元的数目的影响而导致延迟的不一样,从而在信号变化的瞬间, 组合逻辑的输出状态不确定, 往往会出现一些不正确的尖峰信号–“毛刺”。
在这里插入图片描述
实际上我们在做FPGA电路设计的时候可以认为,不管是否出现竞争冒险,只要是纯组合译码输出的电路,就可能会产生毛刺。 采用格雷码计数器、 同步电路等, 可以大大减少毛刺,但它并不能完全消除毛刺。因此我们最常用的毛刺消除方法是“寄存器消除法”
• 因为寄存器的数据输入端D和时钟使能端EN对毛刺不敏感,因此可以利用D和EN来吸收毛刺信号。
在这里插入图片描述

输入端的毛刺消除

时序电路中,异步复位、时钟等输入端出现毛刺时,都会引起系统的误动作。
我们常常的复位端设计都是异步复位,这样子往往会产生毛刺,让系统存在冒险的可能。
always@(posedge clk or negedge rst_n)
begin
if(rst_n)
*******
end
改进后的设计–‘异步复位,同步释放’。
reg rst_n_reg;
always@(posedge clk)
begin
rst_n_reg <= rst_n;
end
always@(posedge clk or negedge rst_n_reg)
begin
if(rst_n_reg)
*******
end

状态机设计

有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关可分为Moore型状态机和Mealy型状态机。Moore型状态机:输出仅与当前状态有关;
Mealy型状态机:输出与当前状态和输入信号都有关;
不过因为Mealy状态机的输出与当前状态和输入信号都有关,所以会受到输入的干扰,可能会产生毛刺(Glith)的现象,所以我们通常使用的是Moore型状态机。
在FPGA的应用设计中用Verilog实现状态机:
• 一般用case语句来建立状态机模型,可方便地实现状态转换;
• 一般在case语句最后,要有最后一个分支default项;
• 设计的状态机应该有一个异步或同步复位端,以便在通电时,将其复位到有效状态;
• 状态机的状态赋值在状态机前面可通过parameter或`define来进行。
如下图所示,Moore型状态机由两个block组成,输出out只有当前状态决定,不与输入信号有关:
(1)always block:下一状态的组合逻辑;
(2)always block:更新状态的时序逻辑。
在这里插入图片描述
如下图所示,Mealy型状态机由两个block组成,输出output不仅与当前状态state_present还与输入信号input_signal有关:
(1)always block:下一状态的组合逻辑跟输出;
在这里插入图片描述
(2)always block:更新状态的时序逻辑。
在这里插入图片描述
通过上面的对比设计,我们可以发现Mealy状态机的输出与当前状态和输入信号都有关,所以会受到输入的干扰,可能会产生毛刺(Glith)的现象,所以我们通常在做FPGA系统电路设计的时候使用Moore型状态机。

参考推荐

参考推荐书籍《FPGA设计高级进阶》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章