第4节Xilinx公司原语的使用方法1Xilinx原语3.4Xilinx公司原语的使用方法原语,其英文名字为Primitive,是Xilinx针对其器件特征开发的一系列常用模块的名字,用户可以将其看成Xilinx公司为用户提供的库函数,类似于C++中的“cout”等关键字,是芯片中的基本元件,代表FPGA中实际拥有的硬件逻辑单元,如LUT,D触发器,RAM等,相当于软件中的机器语言。在实现过程中的翻译步骤时,要将所有的设计单元都转译为目标器件中的基本元件,否则就是不可实现的。原语在设计中可以直接例化使用,是最直接的代码输入方式,其和HDL语言的关系,类似于汇编语言和C语言的关系。Xilinx公司提供的原语,涵盖了FPGA开发的常用领域,但只有相应配置的硬件才能执行相应的原语,并不是所有的原语都可以在任何一款芯片上运行。在Verilog中使用原语非常简单,将其作为模块名直接例化即可。本节以Virtex-4平台介绍各类原语,因为该系列的原语类型是最全面的。其它系列芯片原语的使用方法是类似的。Xilinx公司的原语按照功能分为10类,包括:计算组件、I/O端口组件、寄存器和锁存器、时钟组件、处理器组件、移位寄存器、配置和检测组件、RAM/ROM组件、Slice/CLB组件以及G比特收发器组件。下面分别对其进行详细介绍。3.4.1计算组件计算组件值得就是DSP48核,也有人将其称为硬件乘法器,功能描述如表3-6所示。表3-6计算组件清单DSP48其结构为一个18*18比特的有符号乘法器,且在后面还级联了一个带有可配置流水线的3输入加法器DSP48核由一个18比特的乘法后面级联一个48比特的加法器,乘法器和加法器的应用位宽分别可以在18、48比特内任意调整。其在乘加模块中有广泛应用,特别是各类滤波器系统中,不仅可以提高系统稳定性,还能够节省逻辑资源且工作在高速模式下。其在Verilog中的例化模版为:modulefpga_v4_dsp48(BCOUT,P,PCOUT,A,B,BCIN,C,CARRYIN,CARRYINSEL,CEA,CEB,CEC,CECARRYIN,CECINSUB,CECTRL,CEM,CEP,CLK,OPMODE,PCIN,RSTA,RSTB,RSTC,RSTCARRYIN,RSTM,RSTP,SUBTRACT);output[17:0]BCOUT;output[47:0]P,PCOUT;//input[17:0]A,B;//input[47:0]C,PCIN;input[1:0]CARRYINSEL;input[6:0]OPMODE;inputBCIN,CARRYIN,CEA,CEB,CEC,CECARRYIN,CECINSUB,CECTRL,CEM,CEP,CLK,RSTA,RSTB,RSTC,RSTCARRYIN,RSTM,RSTP,SUBTRACT;//对DSP48原语的功能进行配置。DSP48#(.AREG(1),//NumberofpipelineregistersontheAinput,0,1or2.BREG(1),//NumberofpipelineregistersontheBinput,0,1or2.B_INPUT(DIRECT),//BinputDIRECTfromfabricorCASCADEfromanotherDSP48.CARRYINREG(1),//NumberofpipelineregistersfortheCARRYINinput,0or1.CARRYINSELREG(1),//NumberofpipelineregistersfortheCARRYINSEL,0or1.CREG(1),//NumberofpipelineregistersontheCinput,0or1.LEGACY_MODE(MULT18X18S),//Backwardcompatibility,NONE,MULT18X18orMULT18X18S.MREG(1),//Numberofmultiplierpipelineregisters,0or1.OPMODEREG(1),//NumberofpipelineregsitersonOPMODEinput,0or1.PREG(1),//NumberofpipelineregistersonthePoutput,0or1.SUBTRACTREG(1)//NumberofpipelineregistersontheSUBTRACTinput,0or1)fpga_v4_dsp48(.BCOUT(BCOUT),//18-bitBcascadeoutput.P(P),//48-bitproductoutput.PCOUT(PCOUT),//48-bitcascadeoutput.A(A),//18-bitAdatainput.B(B),//18-bitBdatainput.BCIN(BCIN),//18-bitBcascadeinput.C(C),//48-bitcascadeinput.CARRYIN(CARRYIN),//Carryinputsignal.CARRYINSEL(CARRYINSEL),//2-bitcarryinputselect.CEA(CEA),//Adataclockenableinput.CEB(CEB),//Bdataclockenableinput.CEC(CEC),//Cdataclockenableinput.CECARRYIN(CECARRYIN),//CARRYINclockenableinput.CECINSUB(CECINSUB),//CINSUBclockenableinput.CECTRL(CECTRL),//ClockEnableinputforCTRLregsiters.CEM(CEM),//ClockEnableinputformultiplierregsiters.CEP(CEP),//ClockEnableinputforPregsiters.CLK(CLK),//Clockinput.OPMODE(OPMODE),//7-bitoperationmodeinput.PCIN(PCIN),//48-bitPCINinput.RSTA(RSTA),//ResetinputforApipelineregisters.RSTB(RSTB),//ResetinputforBpipelineregisters.RSTC(RSTC),//ResetinputforCpipelineregisters.RSTCARRYIN(RSTCARRYIN),//ResetinputforCARRYINregisters.RSTCTRL(RSTCTRL),//ResetinputforCTRLregisters.RSTM(RSTM),//Resetinputformultiplierregisters.RSTP(RSTP),//ResetinputforPpipelineregisters.SUBTRACT(SUBTRACT)//SUBTRACTinput);endmodule3.4.2时钟组件时钟组件包括各种全局时钟缓冲器、全局时钟复用器、普通I/O本地的时钟缓冲器以及高级数字时钟管理模块,如表3-7所示。表3-7时钟组件的清单下面对几个常用时钟组件进行简单介绍,其余组件的使用方法是类似的。1.BUFGBUFG是具有高扇出的全局时钟缓冲器,一般由综合器自动推断并使用,其和同类原语的RTL结构如图3-28所示。全局时钟是具有高扇出驱动能力的缓冲器,可以将信号连到时钟抖动可以忽略不计的全局时钟网络,BUFG组件还可应用于典型的高扇出信号和网络,如复位信号和时钟使能信号。如果要对全局时钟实现PLL或DCM等时钟管理,则需要手动例化该缓冲器。其例化的代码模板如下所示://BUFG:全局时钟缓存(GlobalClockBuffer),只能以内部信号驱动//XilinxHDL库向导版本,ISE9.1BUFGBUFG_inst(.O(O),//时钟缓存输出信号.I(I)///时钟缓存输入信号);//结束BUFG_ins模块的例化过程在综合结果分析中,其和同类原语的RTL结构如图3-32所示。图3-32全局时钟原语的RTL级结构示意图2.BUFMUXBUFMUX是全局时钟复用器,选择两个输入时钟I0或I1中的一个作为全局时钟,其和同类原语BUFMUX1的RTL级结构如图M所示。当选择信号S为低时,选择I0;否则输出I1,其真值表如表M所示。BUFMUX原语和BUFMUX1原语的功能一样,只是选择逻辑不同,对于BUFMUX1,当选择信号S为低时,选择I1;否则输出I0。BUFMUX原语的例化代码模板如下所示:BUFMUX原语的例化代码模板如下所示://BUFGMUX:全局时钟的2到1复用器(GlobalClockBuffer2-to-1MUX)//适用芯片:Virtex-II/II-Pro/4/5,Spartan-3/3E/3A//XilinxHDL库向导版本,ISE9.1BUFGMUXBUFGMUX_inst(.O(O),//时钟复用器的输出信号.I0(I0),//0时钟输入信号.I1(I1),//1时钟输入信号.S(S)//时钟选择信号);//结束BUFGMUX_inst模块的例化过程需要注意的是:该原语只用用全局时钟处理,不能作为接口使用。在综合结果分析时,它和同类原语BUFMUX1的RTL级结构如图3-33所示。图3-33全局时钟复用器的RTL级结构示意图3.BUFIOBUFIO是本地I/O时钟缓冲器,其RTL结构如图M所示,只有一个输入与输出,非常简单。BUFIO使用独立于全局时钟网络的专用时钟网络来驱动纵向I/O管脚,所以非常适合同步数据采集。BUFIO要求时钟和相应的I/O必须在同一时钟区域,而不同时钟网络的驱动需要BUFR原语来实现。需要注意的是,由于BUFIO引出的时钟只到达了I/O列,所以不能来驱动逻辑资源,如CLB和块RAM。BUFIO的例化代码模板如下://BUFIO:本地I/O时钟缓冲器(LocalClockBuffer)//适用芯片:Virtex-4/5//XilinxHDL库向导版本,ISE9.1BUFIOBUFIO_inst(.O(O),//本地I/O时钟缓冲器的输出信号.I(I)//本地I/O时钟缓冲器的输入信号);//结束BUFIO模块的例化过程在综合结果分析时,其RTL级结构如图3-34所示。图3-34本地I/O时钟缓冲器的RTL级结构示意图4.BUFRBUFR是本地I/O时钟、逻辑缓冲器,其RTL结构如图M所示。BUFR和BUFIO都是将驱动时钟引入某一时钟区域的专用时钟网络,而独立于全局时钟网络;不同的是,BUFR不仅可以跨越不同的时钟区域(最多3个),还能够驱动I/O逻辑以及自身或邻近时钟区域的逻辑资源。BUFIO的输出和本地内部互联都能驱动BUFR组件。此外,BUFR能完成输入时钟1~8的整数分频。因此,BUFR是同步设计中实现跨时钟域以及串并转换的最佳方式。BUFIO的例化代码模板如下://BUFR:本地I/O时钟、逻辑缓冲器(RegionalClockBuffer)//适用芯片:Virtex-4/5//XilinxHDL库向导版本,ISE9.1BUFR#(.BUFR_DIVIDE(BYPASS),//分频比,可选择BYPASS,1,2,3,4,5,6,7,8。.SIM_DEVICE(VIRTEX4)//指定目标芯片,VIRTEX4或者VIRTEX5)BUFR_inst(.O(O),//时钟缓存输出信号.CE(CE),//时钟使能信号,输入信号.CLR(CLR),//时钟缓存清空信号.I(I)//时钟缓存输入信号);//结束BUFR模块的例化过程需要注意的是:BUFIO和BUFR只能在Virtex-4系列以及更高系列芯片中使用。在综合结果分析时,其RTL结构如图3-35所示。图3-35本