1. Xilinx 時鐘資源
xilinx 時鐘資源分為兩種:全局時鐘和第二全局時鐘。
1. 全局時鐘資源
Xilinx 全局時鐘采用全銅工藝實現,并設計了專用時鐘緩沖與驅動結構,可以到達芯片內部任何一個邏輯單元,包括CLB、I/O引腳、內嵌RAM、硬核乘法器等,而且時延和抖動都很小。對FPGA設計而言,全局時鐘是最簡單最可預測的時鐘,最好的時鐘方案是:由專用的全局時鐘輸入引腳驅動單個全局時鐘,并用后者去控制設計中的每個觸發器。全局時鐘資源是專用布線資源,存在與全銅布線層上,使用全局時鐘資源不影響芯片的其他布線資源,因此在可以使用全局時鐘的時候盡可能使用。
目前,主流芯片都集成了專用時鐘資源、時鐘管理模塊(DCM)。以Virtex 5 為例,含有6個CMTs(Clock Management Tiles),每個CMTs包含2個DCM和一個PLL,1個DCM內包含2個DLL和一個PLL。
全局時鐘資源需要通過原語(Primitives)調用,常見的時鐘原語有:
IBUFG: Single-ended Input Global Clock Buffer
IBUFGDS: Differential Input Global Clock Buffer
BUFG: Global Clock Buffer
BUFGCE: Global Clock Buffer w/ Enable
DCM: DCM_ADV DCM_BASE
這些原語的使用在Language Templates都有示例,在user guide(v5對應為UG190)里也有詳細說明。常用組合:
IBUFG / IBUFGDS + BUFG
最基本的時鐘使用方法。當信號從全局時鐘引腳輸入時,無論是否為時鐘信號,都必須使用IBUFG/IBUFGDS;反之,如果使用了IBUFG/IBUFGDS,則信號必須從全局時鐘引腳輸入,否則布局布線會報錯。IBUFG/IBUFGDS的輸入只與芯片的專用全局時鐘輸入引腳有物理連接,與普通的I/O和其他內部CLB沒有物理連接,所以后面要加BUFG。
LOGIC + BUFG
BUFG不僅可以驅動IBUFG的輸出,還可以驅動普通信號(非時鐘信號)的輸出。當某個信號(時鐘、使能、快速路徑)的扇出非常大,要求抖動延遲最小時,可以使用BUFG驅動該信號,使該信號利用全局時鐘資源。注意:普通I/O信號或片內信號進入BUFG到從BUFG輸出,有大約10ns的固定時延,但是BUFG到片內所有單元的延時可以忽略為0ns。
IBUFG / IBUFGDS + DCM + BUFG
更加靈活的控制時鐘信號。通過DCM可以對時鐘進行同步、移相、分頻和倍頻,而且可以使全局時鐘的輸出沒有抖動延遲。
使用全局時鐘資源可以直接用原語例化,也可以使用IP核。仔細觀察了一下IP核產生的源文件,發現 IP核生成的就是這3個原語的組合:
module DCM_100M(CLKIN_IN,
RST_IN,
CLKIN_IBUFG_OUT,
CLK0_OUT,
CLK2X_OUT,
LOCKED_OUT);
input CLKIN_IN;
input RST_IN;
output CLKIN_IBUFG_OUT;
output CLK0_OUT;
output CLK2X_OUT;
output LOCKED_OUT;
wire CLKFB_IN;
wire CLKIN_IBUFG;
wire CLK0_BUF;
wire CLK2X_BUF;
wire GND_BIT;
wire [6:0] GND_BUS_7;
wire [15:0] GND_BUS_16;
assign GND_BIT = 0;
assign GND_BUS_7 = 7'b0000000;
assign GND_BUS_16 = 16'b0000000000000000;
assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;
assign CLK0_OUT = CLKFB_IN;
IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
.O(CLKIN_IBUFG));
BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
.O(CLKFB_IN));
BUFG CLK2X_BUFG_INST (.I(CLK2X_BUF),
.O(CLK2X_OUT));
DCM_ADV #( .CLK_FEEDBACK("1X"), .CLKDV_DIVIDE(2.0), .CLKFX_DIVIDE(1),
.CLKFX_MULTIPLY(4), .CLKIN_DIVIDE_BY_2("FALSE"),
.CLKIN_PERIOD(10.000), .CLKOUT_PHASE_SHIFT("NONE"),
.DCM_AUTOCALIBRATION("TRUE"), .DCM_PERFORMANCE_MODE("MAX_SPEED"),
.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), .DFS_FREQUENCY_MODE("LOW"),
.DLL_FREQUENCY_MODE("LOW"), .DUTY_CYCLE_CORRECTION("TRUE"),
.FACTORY_JF(16'hF0F0), .PHASE_SHIFT(0), .STARTUP_WAIT("FALSE"),
.SIM_DEVICE("VIRTEX5") ) DCM_ADV_INST (.CLKFB(CLKFB_IN),
.CLKIN(CLKIN_IBUFG),
.DADDR(GND_BUS_7[6:0]),
.DCLK(GND_BIT),
.DEN(GND_BIT),
.DI(GND_BUS_16[15:0]),
.DWE(GND_BIT),
.PSCLK(GND_BIT),
.PSEN(GND_BIT),
.PSINCDEC(GND_BIT),
.RST(RST_IN),
.CLKDV(),
.CLKFX(),
.CLKFX180(),
.CLK0(CLK0_BUF),
.CLK2X(CLK2X_BUF),
.CLK2X180(),
.CLK90(),
.CLK180(),
.CLK270(),
.DO(),
.DRDY(),
.LOCKED(LOCKED_OUT),
.PSDONE());
endmodule
時鐘從CLKIN_IN輸入,經過IBUFG,輸出為CLKIN_IBUFG,然后輸入到DCM_ADV,輸出為CLK0_BUF和CLK2X_BUF,CLK0_BUF經過BUFG得到CLKFB_IN,一方面反饋到DCM的,另一方面也從CLK0_OUT輸出;CLK2X_BUF則經過BUFG后直接輸出為CLK2X_OUT。
LOGIC + DCM + BUFG
和前一種的區別在于DCM的輸入是從內部輸入還是外部輸入。從外部輸入則用IBUFG,保證時鐘信號由芯片引腳輸入;從內部輸入則可以選擇內部邏輯的任意信號,在FPGA內部是沒有差分信號的,所有內部時鐘信號都是單端信號。
Google到一篇不錯的博客:如何正確使用FPGA的時鐘資源
評論
查看更多