一、前言
很多FPGA的板載時鍾(板載晶振提供)不是普通的單端時鍾信號,而是差分時鍾信號,比如我正在使用的genesys2開發板。
此時我們就不能像使用普通時鍾信號一樣直接使用差分時鍾信號,而是需要使用IBUFGDS
(xilinx 原語)或者PLL
將差分信號轉換成單端信號。
PLL
之所以也可以用來將差分時鍾轉換成單端時鍾,是因為我們可以設置其輸入時鍾的source為Differential clock capable pin
,也即告訴PLL
輸入時鍾差分時鍾。其實PLL
也是在自己內部調用IBUFGDS
來實現信號轉換的。如果你只是想單純的轉換成單端時鍾,那么直接設置輸出頻率等於輸入頻率即可,否則你也可以直接實現分頻操作。
下面就以一個對差分時鍾進行分頻的例子來驗證上面所說的話。
二、差分時鍾分頻方法
由以上敘述我們不難發現,對差分時鍾進行分頻有兩種方式,分別是:
- 第一種方式是先使用
IBUFGDS
將差分時鍾轉換成單端時鍾,然后送入PLL
進行分頻。此時PLL
的輸入時鍾的source選擇單端時鍾即可。 - 第二種方式是直接使用
PLL
同時完成差分信號到單端時鍾的轉換和分頻。
三、程序設計
1、方式一
module test(
input clk_p,
input clk_n,
output led
);
wire clk;
wire locked;
IBUFGDS clk_inst (
.O(clk),
.I(clk_p),
.IB(clk_n)
);
clk_wiz_0 diff_2_single
(
.clk_out1(clk_out1),
.reset(1'b0),
.locked(locked),
.clk_in1(clk)
);
reg [3:0] count = 0;
assign led = count[3];
always @ (posedge(clk_out1))
begin
if(locked)
count <= count + 1;
end
endmodule
2、方式二
module test(
input clk_p,
input clk_n,
output led
);
wire locked;
clk_wiz_0 diff_2_single
(
.clk_out1(clk_out1),
.reset(1'b0),
.locked(locked),
.clk_in1_p(clk_p),
.clk_in1_n(clk_n)
);
reg [3:0] count = 0;
assign led = count[3];
always @ (posedge(clk_out1))
begin
if(locked)
count <= count + 1;
end
endmodule