学习笔记3:HDL高级设计技术

一、设计要点:

(1)根据综合工具设计FPGA:很多综合工具都有特殊的算法,取决于不同的目标器件,执行不同的约束和编译选项,在创建FPGA设计之前,设计者应该充分了解所用的综合工具如何处理设计。

(2)根据芯片特性设计FPGA:使用FPGA系统特性,比如DCM,乘法器,移位寄存器,和存储器等创建HDL代码,必须考虑大小(宽度和深度)和功能特性,这都可以通过充分了解FPGA的资源做出正确的系统选择,即使用最合适的目标底层结构来实现。

(3)设计分层:分层为设计带来了极大的灵活性。为了保证模块边界对于优化不是一个障碍,模块应该有寄存的输出。检查综合工具,确认每个模块适合的最大门数,如果可用的话,使用综合器的分组命令,模块的大小和内容影响着综合的结果和设计实现。

(4)为了满足时序要求,在综合布局布线工具中必须设置时序约束。

二、if和case的比较

(1)if描述指定了一个有优先级的编码逻辑,而case描述生成的逻辑是并行的。

(2)if描述可以包含一系列不同的表达式,而case描述比较的是一个公共表达式。

(3)if-else结构速度慢,但占用面积小。case描述速度快,但占用面积大。

(4)避免出现锁存器:a、当if描述中包含所有条件分支时,不会生成锁存器结构。

  b、当case描述包含所有条件分支时,不会产生锁存器。

ps:锁存器是电平触发的存储器,触发器是边沿触发的存储器。锁存器对毛刺敏感,不能异步复位,因此在上电后处于不确定的状态。

三、逻辑复制和复用技术

(1)、逻辑复制是通过增加面积而改善设计时序的优化方法,经常用于调整信号的扇出。

ps:扇出是指某一器件的输出驱动与之相连的后续器件的能力,一个器件的扇出数是有限制的。扇出的越多,所要求的驱动能力就越高,就需要在逻辑单元的输出部分相应的添加输出缓存器来增强输出部分的驱动能力,从而会导致增大输出部分信号的传输延迟。

另外:很多厂商的EDA软件具有自动调节逻辑单元扇出的功能,对于简单的数字系统,由EDA软件自动处理。

例:

 always @(posedge clk ) 
                          begin
                              ce1 = ce ; 
                              ce2 = ce ;     
  end
                     always @(posedge clk )
                        begin
                            if(ce1)                                                   //begin和end之间的两个if是并行的,if-else才存在优先级
                                 res[31:0] <= data[31:0] ;
                            if(ce2)
                                res[63:32] <= data[63:32] ;
                        end

(2)、逻辑复用是通过资源共享减少算术运算符的数量,这样就进一步减少所使用的资源。

ps:XST所支持的资源共享暴扣加法器、减法器、加法/加法器和乘法器。在XST默认使能资源共享,和设计者选择的整个优化策略无关。如果电路性能是优化目标,而不能满足时序目标,则禁止资源共享是有帮助的。

四、并行和流水技术

1、并行设计技术:并行处理就是用多个处理流程同时处理到达的数据流,提高对多数据的处理能力,并行处理要求这些处理任务之间是不相关的,如果数据流之间存在相互依赖,那么用并行处理的方法就很难提高对数据流的处理速率。

2、流水设计技术:设计要求事件所分成的n个处理步骤在处理时间上具有相同的数量级,这样的处理规则是为了保证流水线不会因为处理时间的差异而发生阻塞。

  (1)使用流水线可以增加延迟(更多的时钟周期用于处理数据)为代价,动态的提高目标器件的性能;

  (2)通过重建带有几级逻辑的长数据路径,来增加系统的性能;

  (3)实现更快的时钟周期,结果是,以格外的数据延迟为代价,增加了数据的吞吐量。



五、同步单元处理技术

1、在实际的数字系统中,常存在多时钟源驱动多逻辑单元的情况,因此实际的数字系统应该是一个异步系统,对于这样的系统可以采用先局部同步处理,然后对全局异步单元加入异步单元同步化处理机制来实现。

2、同步系统中包括由组合逻辑部分完成的逻辑运算及由存储单元对于逻辑运算结果的存储:实际的存储过程由时钟信号控制,并发生在信号从逻辑门的输出端稳定后。该模型中的每个时钟周期开始时,输入信号以及存储单元存储的数据输入组合逻辑,经过一定逻辑门以及传输的时延后,组合逻辑产生结果输出并保持稳定,在这个时钟周期的末尾将输出组合逻辑的结果并存入存储单元,并在下一个时钟周期重新参加组合逻辑的操作。

3、数字系统可以看成由一系列同时执行的由组合逻辑构成的计算单元组成的,如图给出了本地数据通路对模型的抽象。可以看出,组合逻辑的时延被限制在一个时钟周期内。在本地数据通路的始端,前段寄存器Rs是存储单元,用于在时钟周期开始的时候给组合逻辑提供部分或者全部的输入信号,同时在本地数据通路的末端,组合逻辑的结果在时钟周期的末尾被正确的锁存于末端寄存器Rd中。


4、为了使同步系统具有良好的可控性,系统时钟提供了一种时间窗的机制保证可有足够的时间让信号在逻辑门以及逻辑门的连线上传播,并最后成功锁存与寄存器,实际上这个时间窗就是数据信息的建立和保持时间。

5、在数字系统中同步电路的设计应遵循以下准则。

(1)尽量在设计中使用单时钟,且走全局时钟网络。在单时钟设计中,很容易就将整个设计同步于驱动时钟,使设计简化。全局时钟网络的时钟是性能最优,便于预测的时钟,具有最强的驱动能力,不仅能保证驱动每个寄存器,且时钟漂移可以忽略。在多时钟应用中,要做到局部时钟同步。在设计中,应将时钟信号通过FPGA芯片的专用时钟引脚接入,以获得低抖动的时钟信号。

(2)尽量避免使用混合时钟沿来采样数据或驱动电路,使用混合时钟沿将会使静态时序分析复杂,并导致电路工作频率降低,

(3)避免使用门控时钟。如果一个时钟节点由组合逻辑驱动,那么就形成了门控时钟。门控时钟常用来减少功耗,但其相关的逻辑电路不是同步电路,即有可能带有毛刺,而任何一点点小毛刺都可以造成D触发器误翻转;此外,门控时钟会降低时钟的质量,产生毛刺,并降低偏移和抖动等性能指标。

(4)尽量不要在模块内部使用计数器分频产生所需时钟。各个模块内部各自分频会导致时钟管理混乱,不仅使时序分析变得复杂,产生较大的时钟漂移,浪费了宝贵的时序裕量,降低了设计可靠性。其功能可以通过时钟使能电路来实现。

六、异步单元处理技术

  (1) 异步时序单元指的是在设计中有两个或两个以上的时钟,且时钟之间是不同频率或同频不同相的关系。而且异步时序设计的关键就是把数据或者控制信号正确的进行跨时钟域传输,也就是在异步单元之间引入局部同步化的处理机制。

  (2) 在异步电路的处理中,主要是数据的建立和保持时间参数的处理,在FPGA内的每一个触发器都有给定的建立和保持时间参数,在这个时间参数内,数据信息不允许变化,如果违反了这个规则,那么数据将出现亚稳态。

  (3)为了避免亚稳态问题,通常采用的方法是双锁存器法,即在一个信号进入另一个时钟之前,将该信号用锁存器连续锁存两次,最后得到的采样结果可以消除亚稳态问题,另一种方法是使用异步fifo对跨越不同时间域的数据信息进行处理。

七、使用时钟使能引脚代替门控时钟

xilinx建议使用CLB时钟使能引脚代替门控时钟,门控时钟可能导致毛刺,增加时钟延迟,时钟抖动,以及其他不希望出现的结果。使用时钟使能能节省时钟资源,改善时序特性和设计分析,如果想用门控时钟以降低功耗,大多数的fpga器件有时钟使能全局缓冲区资源,称为bufgce,然而,时钟使能仍是减少或停止设计中部分时钟的首选方法。

门控时钟的Verilog HDL描述如下:

module gate_clock(
input DATA,IN1,IN2,LOAD,CLOCK,
output reg OUT1 );
wire GATECLK ;
assign GATECLK = (IN1 & IN2 & LOAD & CLOCK);
always @(posedge GATECLK)
  OUT1 <= DATA ;
endmodule
      时钟使能的Verilog HDL描述如下:             
module gate_clock(
input DATA,IN1,IN2,LOAD,CLOCK,
output reg OUT1 );
wire ENABLE ;
assign ENABLE = (IN1 & IN2 & LOAD) ;
always @(posedge CLOCK)
if(ENABLE)
OUT1 <= DATA ;
endmodule

八、有限自动状态机设计

有限自动状态机(finate state machine,FSM)的设计是复杂数字系统中非常重要的一部分,是实现高效率高可靠性逻辑控制的重要途径。大部分数字系统都是由控制单元和数据单元组成的。数据单元负责数据的处理和传输,而控制单元主要是控制数据单元的操作的顺序。而在数字系统中,控制单元往往是通过使用有限状态机实现的,有限状态机接受外部的信号以及数据单元产生的状态信息,产生控制信号序列。

1、一段式状态机(单进程状态机)

整体的过程用一个进程描述,即在一个并行序列中。

2、二段式状态机(双进程状态机)

输出函数用一个进程描述,而状态寄存器和下一状态函数用另一进程描述。

3、三段式状态机(三进程状态机)

输出函数用一个进程描述。而状态寄存器和下一状态函数分别用两个进程描述。

通常情况下,在默认模式,为了达到最好的速度或者最小的面积,综合工具试图寻找用于fsm最好的编码方法。综合工具支持很多编码方法,比如ont-hot,sequencial或gray方法。通常one-hot编码允许设计者创建状态机实现,这种实现对FPGA结构来说是高效率的。

如果对自动解决方案不满意,设计者可以迫使综合工具使用一个指定的编码方法。

九、基于srl的移位寄存器的实现

xst实现基于srl资源类型推断移位寄存器,srl资源类型包括srl16,srl6e,srlc16,srlc16e和srlc32e。

1、基于srl16e的移位寄存器的实现

srl16e是一种不使用触发器资源来创建移位寄存器的有效方式。可以创建长度为1~16位移位寄存器。srl16e是一个移位寄存器查找表,输入决定了移位寄存器的长度,移位寄存器lut的初始内容是通过指定一个4位十六进制到init属性来实现的,如果init属性没有指定,默认值为0,使移位寄存器lut在配置中清零。如下图所示,当时钟由低到高跳变时,数据加载到移位寄存器的下一位。在随后的时钟上升沿,新数据被加载,同时原数据移动到下一位。当达到由输入地址线决定的移位寄存器的长度时,q输出端开始出现最初送入的d端的数据。

2、使用srlc32e创建移位寄存器

virtex-5器件后,FPGA结构的一个特点是有一个较大的移位寄存器srlc32e原语。如下图所示,该32位的移位寄存器充分利用了较大规模的lut并提供相同的专门时钟使能和srl16e的串联功能。这些移位寄存器的推断和16位版本是一样的,但在许多情况下,需要较少的原语。


3、 基于bram的移位寄存器的实现

可以使用ram资源实现延迟线的功能。特别是在延迟线相对较长时,节约功耗方面,这个技术带来相当大的优势。 一个可以利用的bram的关键特性是read-first同步模式。这个技术中另一个重要的元素是计数器,它顺序的扫描地址空间,当计数器的值达到延迟线减2的时候,计数值归0。为了保证最大的性能,使用bram输出锁存和可选的输出寄存器级。比如一个512深度的延迟线,使用ram内510个可寻址的数据字,数据的输出锁存和可选的输出寄存器提供了最后两级。

十、I/O寄存器的实现

所有的xilinx的fpga都包含用于fpga输入和输出上的专用寄存器。通过利用这些寄存器,减少了输入路径上的建立时间和输出通路的clock_to_out时间,这样使得非常容易满足时序要求,用于为外部设备捕获和提供数据。然而,有时候使用专用的寄存器可能会对时序带来负面影响,这是因为使用I/O寄存器增加了到内部逻辑的布线时延。当需要满足I/O时序时,这些寄存器就应该放在I/O,或者是当I/O时序要求允许时,这些寄存器就应该放在FPGA中。

一些综合工具,比如Syntheis工具不支持自动放置,如果希望手工放置I/O寄存器,按照下面的步骤进行手动设置:
 (1)在XST综合工具中禁止全局I/O寄存器放置选项;
 (2)在UCF文件或者HDL代码中,添加IO=TURE,说明寄存器是否应该放在I/O;
 (3)在XST实现工具的map属性中进行手动的设置off,禁止自动将寄存器放到I/O。

控制I/O寄存器的使用平衡了进入和离开FPGA的数据路径时序,需要满足FPGA内的时序规范。另一个值得注意的向导是,在顶层HDL代码中,在所有的输入和输出端口上描述寄存器。在顶层中指明寄存器,可以避免当使用层次的设计方法实现FPGA时,产生布局冲突。这样也避免为描述端口创建层次名字,一些原理图捕获工具不接受。

注意:禁止全局填充寄存器到I/O单元。对于在PCB板上比较苛刻的时序约束,将寄存器填充到FPGA I/O单元。

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

最新文章

最新文章