微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 可提高设计性能的HDL编程风格与技巧

可提高设计性能的HDL编程风格与技巧

时间:09-25 来源:互联网 点击:
    • 用加法器链代替加法器树  

      许多信号处理算法都是对输入的采样数据流进行某种算术运算,然后将这种算术运算的所有输出进行累加。加法树结构一般是用来实现并行结构(如FPGA)中的这种累加运算。  

      加法器树概念的一个难点在于其数量会经常变化。加法器的数量取决于加法器树的输入信号数量。加法器树中的输入越多,需要的加法器数量也越多,需要的逻辑资源和功耗也就越多。树越大意味着树的最后一级加法器也越大,因而会进一步降低系统性能。  

      为了减少功耗,保持较高的系统性能,加法器树应作为专门的硅资源加以实现。但在硅片中放置大量固定尺寸的加法器树元件并不很有效,因为当加法超过一定数量时必须使用逻辑资源,甚至采用更大的FPGA,因而会增加器件的成本。  

      采用DSP48系列专用硅片组的Virtex-4系列器件则采用不同的方法实现累加。它采用链状加法器代替加法器树进行增量式累加运算。这种方法有别于任何现有的FPGA,是提升器件性能、降低DSP算法所需功耗的关键,因为逻辑与互连功能被完全集成进专用硅片中。  

      采用管线形式的DSP48模块频率可达500MHz,而与加法器数量无关。如图5所示,级联端口以及48位分辨率的加法器/累加器完全能够胜任目前的采样值计算,并完成迄今为止所有计算采样值的累加。  



      图5:链状加法器能提供可预测的性能。

      为了充分利用RTL中的Virtex-4加法器链结构,只需简单地用加法器链描述替代加法器树描述。这种将将直接型滤波器转换成转置型或脉动型滤波器的过程在XtremeDSP设计用户指南中有详细介绍。  

      一旦转换完成后,你会发现算法的运行速度要比应用所需的快得多。在这种情况下,可以使用合并或多信道技术进一步减少器件使用率和功耗。这两种技术都可以采用更小的器件实现设计,或者使用空余资源增加设计功能。  

      多信道技术可以将非常快的运算单元作用于多个采样速率很慢的输入流(信道)上。这种技术对硅片效率的提高幅度几乎等于信道数量。多信道滤波器可以看作是时间复接的单信道滤波器。例如,在一个典型的多信道滤波环境中,对多个输入信道中的每个信道都使用独立的数字滤波器进行滤波。为了充分发挥Virtex-4 DSP48模块的性能优势,只需为单滤波器提供8倍的时钟,设计人员即可使用一个单数字滤波器完成对所有8个输入信道的滤波,而所需的FPGA资源数量几乎可以减少8倍。  

      提高块RAM性能  

      在选用存储器单元时,影响性能的因素有:使用专用模块还是分布式模块;RAM;使用输出管线寄存器;不使用异步复位。此外,还有两个不大为人所知的因素,即HDL编程风格和综合工具设置,这些也会极大地影响存储器性能。  

      HDL编程风格  

      当选用双端口模块存储器时,很可能两个端口同时访问同一存储器单元。当两个端口同时向相同存储器单元写入不同的值时就会产生冲突,此时存储器单元的内容是无法得到保证的。不过,当一个端口在读,同时另一个端口在写相同地址时又会发生什么情况呢?这要取决于目标器件。最新的Virtex和Spartan系列器件有三种可编程操作模式可以控制写操作进行时存储器的输出。有关这三种操作模式的详细信息请参阅器件的用户指南。  

      需要注意的是,不同模式会影响存储器的输出行为,也会影响存储器的性能。如同下面所举的例子,编程风格决定了存储器工作在何种工作模式下:  

      //先写或透明模式(transparent mode)  

      always @(posedge clk) begin  

      if(we) begin  

      do <= data;  

      mem[address] <= data;  

      end else  

      do <= mem[address];  

      end  

      //先读或写前读模式  

      always @(posedge clk) begin  

      if (we)  

      mem[address] <= data;  

      do <= mem[address];  

      end  

      //不变模式  

      always @(posedge clk)  

      if (we)  

      mem[address] <= data;  

      else  

      do <= mem[address];  

      end  

      增加管线级数  

      另外一种提高性能的方法是重新构建由多级逻辑组成的长数据路径,将它们分解成多个时钟周期进行处理。这种方法允许使用更快的时钟周期,并可提高数据吞吐量,其代价是时延和管线管理开销逻辑。因为FPGA中的寄存器非常多,因此额外的寄存器和开销逻辑一般不成问题。  

      由于数据目前处于多周期路径上,因此设计人员必须采用特殊方法才能解决额外的时延问题。下面的例子采用在32x32乘法器输出端增加5级寄存器的编程风格。综合工具将把这些寄存器以管线形式关联到Virtex-4 DSP48模块中可用的寄存器,从而极大地提高了数据吞吐量。  

      // 带有4个DSP48模块的32x32乘法器  

      always @(posedge clk) begin  

      prod[0] <= a * b;  

      for (i=1; i<=PIPE-1; i="i"+1)  

      prod[ i] <= prod[i-1];  

      end  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top