-
第
4
节
Xilinx
公司原语的使用方法
1
Xilinx
原语
3.4
Xilinx
公司原语的使用方法
原
语,
其英文名字为
Primitive
,
是
Xilinx
针对其器件特征开发
的一系列常用模块的名字,
用户可以将其看成
Xilinx
p>
公司为用户提供的库函数,类似于
C++
中
的
“cout”
等关键字,
是芯片中的
基本元件,
代表
FPGA
中实际拥有的
硬件逻辑单元,
如
LUT
,
D
触发器,
RAM
等,相
当于软件中的机器语言。在实现过程中的翻译步骤时,要将所有的设计单元都
转译为目标
器件中的基本元件,否则就是不可实现的。原语在设计中可以直接例化使
用,是最直接的
代码输入方式,其和
HDL
语言的关系,类似于汇编语言和
p>
C
语言的关
系。
Xilinx
公司提供的原语,涵盖了
FPGA
开发的常用领域,但只有
相应配置的硬件才能执
行相应的原语,并不是所有的原语都可以在任何一款芯片上运行。
在
Verilog
中使用原
语非常简单
,将其作为模块名直接例化即可。本节以
Virtex-4
平台
介绍各类原语,因
为该系列的原语类型是最全面的。其它系列芯片原语的使用方法是类似
的。
X
ilinx
公司的原语按照功能分为
10
类,包括:
计算组件、
I/O
端口组
件、寄存器和锁存
器、
时钟组件、
处理
器组件、
移位寄存器、
配置和检测组件、
RAM/ROM
组件、
Slice/CLB
< br>组件以及
G
比特收发器组件。下面分别对其进行详细介绍
。
3.4.1
计算组件
计算组件值得就是
DSP48
核,也有人将其称为硬件乘法器,功能描述如表
3-6
所示。
表
3-6
计算组件清单
DSP48
其结构为一个
18*18
比特的有符号乘法器,
且在后面还级联了一个带有可配置
流水线的
3
输入加法器
DSP48
< br>核由一个
18
比特的乘法后面级联一个
< br>48
比特的加法器,乘法器和加法器的应
用位宽分别可以
在
18
、
48
比特内任意调整。其在乘加模块中有广泛应用,特别是各类
滤波器系统中,不仅可以提高
系统稳定性,还能够节省逻辑资源且工作在高速模式下。
其在
V
erilog
中的例化模版为:
module fpga_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;
input BCIN,
CARRYIN,CEA,CEB,
CEC,CECARRYIN,CECINSUB,CECTRL,CEM,
CEP,CLK, RSTA,
RSTB,RSTC,RSTCARRYIN,RSTM,RSTP,SUBTRACT;
//
对
DSP48
原语的功
能进行配置。
DSP48 #(
.AREG(1), // Number of pipeline registers on the A
input, 0, 1 or 2
.BREG(1), // Number of pipeline registers on the B
input, 0, 1 or 2
.B_INPUT(
// B input DIRECT from fabric or
CASCADE from another DSP48
.CARRYINREG(1),
// Number of pipeline registers for the CARRYIN
input, 0 or 1
.CARRYINSELREG(1),
// Number of pipeline registers for the
CARRYINSEL, 0 or 1
.CREG(1), // Number of pipeline
registers on the C input, 0 or 1
.LEGACY_MODE(
// Backward compatibility, NONE,
MULT18X18 or MULT18X18S
.MREG(1), // Number of multiplier pipeline
registers, 0 or 1
.OPMODEREG(1), // Number of pipeline regsiters on
OPMODE input, 0
or 1
.PREG(1), //
Number of pipeline registers on the P output, 0 or
1
.SUBTRACTREG(1)
// Number of pipeline registers on the SUBTRACT
input, 0 or 1
) fpga_v4_dsp48 (
.BCOUT(BCOUT), // 18-bit B cascade output
.P(P), // 48-bit
product output
.PCOUT(PCOUT), // 48-bit cascade
output
.A(A), // 18-bit A data input
.B(B), // 18-bit B data input
.BCIN(BCIN), // 18-bit B cascade input
.C(C), // 48-bit
cascade input
.CARRYIN(CARRYIN), // Carry input signal
.CARRYINSEL(CARRYINSEL), // 2-bit carry input
select
.CEA(CEA),
// A data clock enable input
.CEB(CEB), // B
data clock enable input
.CEC(CEC), // C data clock enable input
.CECARRYIN(CECARRYIN), // CARRYIN clock enable
input
.CECINSUB(CECINSUB), // CINSUB clock enable input
.CECTRL(CECTRL),
// Clock Enable input for CTRL regsiters
.CEM(CEM), // Clock Enable input for multiplier
regsiters
.CEP(CEP), // Clock Enable input for P regsiters
.CLK(CLK), // Clock input
.OPMODE(OPMODE), // 7-bit operation mode input
.PCIN(PCIN), //
48-bit PCIN input
.RSTA(RSTA), // Reset input for A pipeline
registers
.RSTB(RSTB), // Reset input for B pipeline
registers
.RSTC(RSTC), // Reset input for C pipeline
registers
.RSTCARRYIN(RSTCARRYIN), // Reset input for
CARRYIN registers
.RSTCTRL(RSTCTRL), // Reset input for CTRL
registers
.RSTM(RSTM), // Reset input for multiplier
registers
.RSTP(RSTP), // Reset input for P pipeline
registers
.SUBTRACT(SUBTRACT) // SUBTRACT input
);
endmodule
3.4.2
时钟组件
时钟组件包括各种全局时钟缓冲器、全局时钟复用器、普通
I/
O
本地的时钟缓冲器以
及高级数字时钟管理模块,如表
3-7
所示。
表
3-7
时钟组件的清单
下面对几个常用时钟组件进行简单
介绍,其余组件的使用方法是类似的。
1
.
BUFG
BUFG
是具有高扇出的全局时钟缓冲器,
一般由综合器自动推断并使用,
其和同类原语
的
RTL
结构如图
p>
3-28
所示。
全局时钟是具有高扇出驱动
能力的缓冲器,
可以将信号连
到时钟抖动可以忽略不计的全局时
钟网络,
BUFG
组件还可应用于典型的高扇出信号和
网络,如复位信号和时钟使能信号。如果要对全局时钟实现
PLL
或
DCM
等时钟管理,
则需要手动例化该缓冲器。其例化的代码模板如下所示:
// BUFG:
全局时钟缓存(
Global Clock
Buffer
),只能以内部信号驱动
// Xilinx
HDL
库向导版本,
ISE 9.1
BUFG BUFG_inst (
.O(O), //
时钟缓存输出信号
.I(I) //
/
时钟缓存输入信号
);
//
结束
BUFG_ins
模块的例化过程
在综合结果分析中,其和同类
原语的
RTL
结构如图
3-32
所示。
图
3-32
全局时钟原语的
RTL
级结构示意图
2. BUFMUX
BUFMUX
是全局时钟复用器,
选择两个输入时
钟
I0
或
I1
中的一个作为全局时钟,
其和
同类原语
BUFMUX1
的
RTL
级结构如图<
/p>
M
所示。当选择信号
S
< br>为低时,选择
I0
;否则
输出<
/p>
I1
,其真值表如表
M
< br>所示。
BUFMUX
原语和
BU
FMUX1
原语的功能一样,只是选
择逻辑不同,对于
BUFMUX1
,当选择信号
S
为低时,选择
I1
;否则输出
I0
。
BUFMUX
原语的例化代码模板如下所示:
< br>
BUFMUX
原语的例化代码模板如下所示:
// BUFGMUX:
全局时钟的
2
到
1
复用器(
Global Clock Buffer 2-to-1
MUX
)
//
适用芯片:
Virtex-
II/II-Pro/4/5, Spartan-3/3E/3A
// Xilinx
HDL
库向导版本,
ISE 9.1
BUFGMUX BUFGMUX_inst (
.O(O),
//
时钟复用器的输出信号
.I0(I0), //
0
时钟输入信号
.I1(I1),
//1
时钟输入信号
.S(S) //
时钟选择信号
);
//
结束
BUFGMUX_inst
模块的例化过程
需要注意的是:该原语只用用全局时钟处理,不能作为接口使
用。在综合结果分析时,
它和同类原语
BUFMUX1
的
RTL
级结构如图
3
-33
所示。
图
3-33
全局时钟复用器的
RTL
级结构示意图
3. BUFIO
BUFIO
是本地
< br>I/O
时钟缓冲器,其
RTL
结
构如图M所示,只有一个输入与输出,非常
简单。
BUFIO<
/p>
使用独立于全局时钟网络的专用时钟网络来驱动纵向
I/O
管脚,所以非
常适合同步数据采集。
BUFI
O
要求时钟和相应的
I/O
必须在同一
时钟区域,而不同时
钟网络的驱动需要
BUFR
原语来实现。需要注意的是,由于
BUFIO
引出的时
钟只到达
了
I/O
列,所以不能来驱动
逻辑资源,如
CLB
和块
RAM
。
BUFIO
的例化代码模板如下:
// BUFIO:
本地
I/O
时钟缓冲器(
Local Clock
Buffer
)
//
适用芯片:
Virtex-4/5
// Xilinx
HDL
库向导版本,
ISE 9.1
BUFIO BUFIO_inst (
.O(O), //
本地
I/O
时钟缓冲器的输出信号
.I(I) //
本地
I/O
时钟缓冲器的输入信号
);
//
结束
BUFIO
模块的例化过程
在综合结果分析时,其
RTL
级结构如图
3-34
所示。
< br>
图
3-34
本地
I/O
时钟缓冲器的
R
TL
级结构示意图
4. BUFR
BUFR
是本地
I/O
时钟、
逻辑缓冲器,
其
RTL
结构如图M所示。
BUFR
和
BUFIO
都是将
驱动时钟引入某一时钟区域的专用时钟网络,
而独立于全局时钟网络;
不同的是,
B
UFR
不仅可以跨越不同的时钟区域(最多
3
< br>个),还能够驱动
I/O
逻辑以及自身或邻近时
钟区域的逻辑资源。
BUFIO
的输出和本地内
部互联都能驱动
BUFR
组件。此外,
BUFR
能完成输入时钟
1
~
8
的整数分频。因此,
BUFR
是同步设计中实现跨时钟域以及串并
转换的最佳方式。
BUFIO
的例化代码模板如下:
// BUFR:
本地
I/O
时钟、逻辑缓冲器(
Regional Clock Buffer
)
//
适用芯片:
Virtex-4/5
// Xilinx
HDL
库向导版本,
ISE 9.1
BUFR #(
.BUFR_DIVIDE(
//
分频比,可选择
。
.SIM_DEVICE(
//
指定目标芯片
,
或者
) BUFR_inst (
.O(O), //
时钟缓存输出信号
.CE(CE),
//
时钟使能信号,输入信号
.CLR(CLR),
//
时钟缓存清空信号
.I(I) //
时钟缓存输入信号
);
//
结束
BUFR
< br>模块的例化过程
需要注意的是:
BUFIO
和
< br>BUFR
只能在
Virtex-4
系列以及更高系列芯片中使用。在综
合结果分析时,其
RTL
结构如图
3-35
所示。
图
3-35
本地
I/O
时钟、逻辑缓冲器的
RTL
级结构示意图
5.
DCM_BASE
DCM_BA
SE
是基本数字时钟管理模块的缩写,
是相位和频率可配置的数
字锁相环电路,
常用于
FPGA
系统中
复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用
DCM_ADV
原语;
如果需要相位动态偏移,
可使用
DCM_PS
原语。
DCM
系列原语的
RTL
结构如图
3-8
所示。
模块接口信号的说明如表
p>
3-8
所列。
DCM_BASE
组件可以通过
Xil
inx
的
IP Wizard
向导产生
,
也可以直接通过下面的例化代
码直接使用。其
Verilog
的例化代码模板为:
// DCM_BASE:
基本数字时钟管理电路(
Base Digital
Clock Manager Circuit
)
//
适用芯片:
Virtex-4/5
// Xilinx
HDL
库向导版本,
ISE 9.1
DCM_BASE #(
.CLKDV_DIVIDE(2.0),
// CLKDV
分频比可以设置为
:
1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
//
7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or
16.0
.CLKFX_DIVIDE(1), //
Can be any integer from 1 to 32
// CLKFX
信号的分频比,可为
1
到
32
之间的任意整数
.CLKFX_MULTIPLY(4),
// CLKFX
信号的倍频比,可
为
2
到
32
之
间的任意整数
.CLKIN_DIVIDE_BY_2(
//
输入信号
2
分频的使能信号,可设置为
TRUE/FALSE
.CLKIN_PERIOD(10.0),
//
指定输入时钟的周期,单位为
n
s
,数值范围为
1.25~1000.00
。
.CLKOUT_PHASE_SHIFT(
//
指定移相模式,可设置为
NON
E
或
FIXED
.CLK_FEEDBACK(
//
指定反馈时钟的频率,可设置为
NONE
、
1X
或
2X
。相应的频率关系都是针对
CLK0
而言的。
.DCM_PERFORMANCE_MODE(
// DCM
模块性能模式,可设置为
MAX_SPEED
或
MAX_RANGE
.DESKEW_ADJUST(
//
抖动调整,可设置为源同步、系统同步或
0~15
之间的任意整数
.DFS_FREQUENCY_MODE(
//
数字频率合成模式,可设置为
L
OW
或
HIGH
两种频率模式
.DLL_FREQUENCY_MODE(
// DLL
的频率模式,可设置为
L
OW
、
HIGH
或
HIGH_SER
.DUTY_CYCLE_CORRECTION(
//
设置是否采用双周期校正,可设为
TRUE
或
FALSE
.FACTORY_JF(16'hf0f0),
// 16
比特的
JF
因子参数
.PHASE_SHIFT(0),
//
固定相移的数值,可设置为
-255 ~
1023
之间的任意整数
.STARTUP_WAIT(
//
等
DCM
锁相后再延迟配置
DONE
管脚,可设置为
TRUE/FALSE
) DCM_BASE_inst (
.CLK0(CLK0), // 0
度移相的
DCM
时钟输出
.CLK180(CLK180), // 180
度移相的
DCM
时钟输出
.CLK270(CLK270), // 270
p>
度移相的
DCM
时钟输出
< br>
.CLK2X(CLK2X), // DCM
p>
模块的
2
倍频输出
.CLK2X180(CLK2X180), //
经过
180
度相移的
DCM
模块
2
倍频输出
.CLK90(CLK90), // 90
p>
度移相的
DCM
时钟输出
< br>
.CLKDV(CLKDV), //
DCM
模块的分频输出,分频比为
CLKDV_DIVIDE
.CLKFX(CLKFX), //
DCM
合成时钟输出,分频比为
(M/D)
.CLKFX180(CLKFX180), // 180
度移相的
DCM
合成时钟输出
.LOCKED(LOCKED), //
DCM
锁相状态输出信号
.CLKFB(CLKFB), //
DCM
模块的反馈时钟信号
.CLKIN(CLKIN), //
DCM
模块的时钟输入信号
.RST(RST) // DCM
模块的异步复位信号
);
//
结束
DCM_BASE
模块的例化过程
在综合结果分析时,
DCM
系列原语的
RTL
结构如图
3-36
所示。
图
3-36 DCM
模块的
RTL
级结构示意图
3.4.3
配置和检测组件
配置和检测组件提供了
FPGA
内部逻辑和
JTAG
扫描电路之间的数据交换以及控制功
能,只要由
6
个原语组成,如表
3-9
所示。
表
3-9
配置和检测原语列表
下面对
BSCAN_VIRTEX4
组件进行简单介绍,其余组件的使用方法是类似的。
1
.
BSCAN_VIRTEX4
当
JTAG USER1/2/3/4
指令被加载后,
BSCAN_VIRTEX4
允许设计人员来检
测
TCK
、
TMS
以及
TDI
等专用
JTAG
管脚的数据,并且可以将用户数据写入到
TDO
管脚上,这样可
以在
PC
上通过
p>
JTAG
链读取芯片内部的用户数据。
BSCAN_VIRTEX4
p>
的管脚信号说明如下:
CAPTURE
:位宽为
1
的输出信号,用于指示是否加载了用户指令,当
JTAG
接口处于