DSP

xilinx fpga学习笔记4

2019-07-13 10:59发布

十一、算术运算的实现
 1、Verilog对符号和无符号运算的支持
   没有明确的表示规范,Verilog定义了下面的规则:
 (1)Port、wire和reg向量类型被当做无符号类型,否则明确声明的是有符号的;
 (2)整数变量被当做是有符号的,除非明确声明;
 (3)十进制数是有符号的;
 (4)基数是无符号的,除非明确声明。
   使用unsigned和signed关键字来明确强迫数据类型的表示。下面给出描述方法:
 input signed[31:0] example1;
 reg unsigned[15:0] example2;
   wire signed[31:0] example3;
   可以强迫基数是有符号的,在基数说明时,使用s符号:
 4'sd87
  此外,设计者能保证正确的类型,通过$signed和$unsigned转换函数:
  wire[7:0] udata;
  wire[7:0] sdata;
  assign sdata = $signed(udata);


  在Verilog中,一个表达式的类型只通过它的操作数来定义。它不取决于分配左边部分的类型。一个表达式的类型通过下面的规则解析:
(1)bit选择的结果是无符号的,不考虑操作数;
(2)part选择的结果是无符号的,不考虑操作数即使part选择指明了整个向量;
(3)串联的结果是无符号的,不考虑操作数;
(4)比较的结果是无符号的,不考虑操作数;
(5)任何自定操作数的符号和比特位的宽度是由操作数本身所决定的,独立于表达式的剩余部分。如果使用上下文决定操作数,在verilog LRM查看额外的向导。


2、 FPGA内算术运算实现的方法
  xilinx FPGA包含一些传统的硬件资源,例如,LUT和进位链。这些资源高效的实现各种算术操作,比如加法器、减法器、计数器、累加器和比较器。
  随着virtex高端FPGA芯片的出现,Xlinx引入了新的原语,称为DSP48。这个模块在未来的virtex-5、virtex-6和spartan6上进行功能的扩充。DSP48 slice允许创建大量的功能,包括乘法器、加法器计数器、桶型移位寄存器、比较器、累加器、乘累加、复数乘法器等。
  目前,XST综合工具支持最重要的和经常使用的DSP48模式,用于数字信号处理,综合工具也利用DSP48内的寄存器,比如动态的OPMODE端口。
  DSP48的快速连接允许高效地建立快速的DSP48链,用作滤波器。综合工具支持这些快速连接。
  由于在目标器件上有很多方式实现相同的算术操作,综合工具根据操作的类型,大小,上下文的使用或者时序要求自动进行选择。在一些条件下,自动选择并不满足设计者的要求。因此,综合工具提供了一些约束来控制实现的过程,比如在XST中的use_dsp48或者在Synplicity中的syn_dsptyle。
   如果设计者将以前的设计从使用先前的FPGA系列芯片,移植到新的带有DSP48模块的新的FPGA时,对于设计者来说,如果想利用可用的DSP48模块,必须知道下面这些规则,这些规则可以使设计达到最高性能。
(1)当充分流水线时,DSP48模块给出最好的性能。因此,为了达到最小的性能,设计者应该添加一些额外的流水级。
(2)内部的DSP48寄存器支持同步置位和复位信号。不支持异步复位信号。因此,必须将异步初始化的信号使用同步初始化替换,一些综合工具可以自动进行替换。这种操作所给出的生成网表并不等于初始的RTL描述。
(3)对于DSP应用来讲,在RTL描述中,使用链结构替换树状结构,可以充分利用DSP48的能力。


   XST尽可能多利用资源,为了高性能、高功能地实现算术逻辑。下面讨论在XST控制实现算术逻辑的方法:
(1)实现算术的宏,可以在切片逻辑上,可以在DSP模块上,通过综合工具的Use DSP Block属性控制,默认值是auto。
(2)在自动模式下,XST考虑真正可用的DSP资源,为了避免过度地映射目标器件。XST可以使用目标器件上可用的所有DSP资源。XST综合工具的DSP利用率属性(DSP_UTILIZATION_RATIO)强迫XST留出一些资源未被分配。
(3)一些算术宏,比如独立的加法器,累加器和计数器,默认时不使用DSP资源。为了在DSP资源实现,将XST综合属性USE_DSP48设置为yes。
(4)利用在DSP模块上实现算术功能的流水线寄存器,用一个可选择的时钟使能描述寄存器,寄存器也是可选的和可同步复位的。
(5)异步复位逻辑阻止其实现,应该避免。
(6)当描述无符号算术时,记住DSP模块资源假设是有符号的操作数。设计者不能映射无符号的数到单个DSP模块的全部数据宽度。例如,XST能在virtex-6的DSP48E1上实现25*18的有符号乘法。在同样的单独的模块上它能实现最多24*17的无符号的积,DSP输入的最好有效位设置为0.

十二、 扩展的DSP推断
    除了作为延迟级(寄存器)、乘、乘加/减、积累、乘法累加和ROM等这些基本功能的粒度更细的推理能力外,XST使用可移植行为的源代码,提供描述滤波器的扩展推理能力等基本功能。
    XST试图了解基本功能的元素之间的任何基本的上下文关系的存在,比利用xilinx器件上可用的DSP块资源的强大功能(流水线阶段、级联路径、预加法器级、时间复用),用于高性能实现并降低功耗。
    要优化充分利用DSP模块的功能,使用一个加法器链,而不是一个加法器树为骨干对滤波器进行描述,有些HDL语言功能,如在VHDL的for generate,便于描述这些一个滤波器,确保代码最大的可读性和可扩展性。
    Xlinx FPGA内的DSP模块中可选的预加法器用于对称滤波器。如果设计者没描述对称滤波器,利用预加法器。可以将所要求的DSP模块数量减少一半。
    由于XST不能自动识别和分解对称系数,Xilinx不推荐设计者使用通用的方式描述滤波器和假设XST能确认滤波器的对称性。设计者必须手工编写代码分解因式,为了XST能看到使用预加法器的机会,相应的诶之DSP模块。
    注意:对于利用预加法器的能力,XST必须能识别一个描述,即使设计的数据的宽度较小,这个描述能准确的匹配加法器的大小特征。这个要求是指定预加法器。使用signed和unsigned扩展,用于明确的填充预加法器的操作数,来保证在DSP资源上正确的推断和实现。
十三、属性/约束及传递
1、属性及传递
    属性是附加到xilinx原始例化中的特性,用以说明它们的行为。属性与器件结构原语原件正确的关联,直接想到例化元件的功能或实现,属性通过下面的方式传递:
  (1)在VHDL中,通过generic映射。
  (2)在Verilog中,通过defparams或者内联参数传递。
  例如下面的属性:
   (1)lut4组件上的INIT属性;
   (2)DCM上的CLKFX_DIVIDE属性。
  下面的Verilog代码给出了一个例化的IBUFDS符号,在这里DIFF_TERM和IOSTANDARD被分别制定为FALSE和DEFAULT。下面给出Verilog的描述:
  IBUFDS #(
.CAPACITANCE("DONT_CARE"),
.DIFF_TERM("FALSE"),
.IBUF_DELAY_VALUE("0"),
.IFD_DELAY_VALUE("AUTO"),
.IOSTANDARD("DEFAULT")
      )IBUFDS_inst(
.o(o),
.i(i),
.ib(ib)
);
2、综合约束传递
   综合约束指导综合工具对特定设计和HDL代码进行优化。它们可以嵌入到HDL代码中或者以单独的约束文件形式存在,综合约束的例子有:
  (1)USE_DSP48(XST)
  (2)RAM_STYLE(XST)
   综合约束传递包括:传递综合约束,传递HDL综合属性。
   在设计中,约束可以附加到HDL对象中,或由一个独立的约束文件指定。可以通过两种传递约束到HDL对象:
  (1)描述对象的预定义数据;
  (2)直接将属性连接到HDL对象。
   预定义属性可以通过一个COMMAND文件或综合工具中的约束文件进行传递,或者可以直接在HDL编码中定义属性,下面只讨论在HDL代码中传递属性。
   传递Verilog综合属性
   在VHDL中,很多厂商采用了一致的语法用于传递属性,但是并没有在Verilog中采用一致的语法传递属性。Verilog中历史属性的传递通过称为元件注释的方式实现。每个综合工具都有自己的元注释语法。
  Verilog2001提供了统一的用于传递属性的语法,在声明对象以前,立即声明属性,所有在属性声明的过程中并不出现对象的名字。
  下面给出Verilog综合属性传递的例子,注意不是所有的工具都支持这种写法。
 (* RLOC = "R1C0.S0" *) FDCE #(
  .INIT(1'b0)  
 )U2(
    .Q(Q1),
.C(CLK),
.CE(CE),
.CLR(RST),
.D(Q0)
   );
3、实现约束
   在处理FPGA设计时,实现约束是一系列传递给FPGA实现工具的命令,指示其映射、布局、时序或者其他向导。实现约束通常放在用户约束文件中(UCF),也可能存在于HDL代码中或综合约束文件中,实现约束的例子有
  (1)"LOC"(布局);
  (2)"PERIOD"(时序);
十四 例化原件和FPGA原语
1、 例化FPGA原语
   xilinx提供了一组库,包含结构特定的和定制的元件,这些元件能在设计中明确的例化作为一个元件使用。
   结构特定的元件,这些原件被建立到实现工具的库中,不需要指定一个定义就可以用于例化。在库向导中,这些原件标记为原语。在库向导中标记为宏的元件没有建立到实现工具的库中,因此不能被例化。库向导中的宏元件被定义为原理图符号。当使用宏的时候,原理图工具将宏解析成基本的元素。FPGA原语能使用HDL语言进行例化。所有的FPGA原语都在UNISIM库中。
   下面给出元件声明和端口映射的Verilog描述
  module flops(input d1,ce,clk,rst,output,q1);
   FDCE u1(
.D(d1),
.CE(ce),
.C(clk),
.CLR(rst),
.Q(q1));
  endmodule


   xilinx的原语有一组相关的属性,这些属性可以通过下面的方式添加到原语中:
 (1)VHDL属性传递;
 (2)Verilog属性传递;
 (3)VHDL类属性传递;
 (4)Verilog参数传递;
 (5)用户约束文件。


2、 例化核生成器模块
   核生成器生成:
 (1)电子数据交换格式(EDIF)或(NGC)网表,或两者都有,用来进行功能描述;
 (2)HDL例化中元件例化模板。