PFGA PLL(鎖相環)

不想禿髮發表於2020-10-14

PFGA PLL(鎖相環)

將較低頻率的片外晶片倍頻得到較高的頻率時鐘訊號。
鎖相環的一大作用就是對輸入時鐘進行分頻和倍頻,以得到更高或更低頻率的時鐘訊號,以供邏輯電路使用。還可以對同一PLL生成的多個時鐘的相位進行控制,以保證兩個時鐘域的邏輯工作時有確定的時間差。(兩個或多個時鐘的上升沿有時間差)

PLL內部電路

在這裡插入圖片描述
N:預分頻單元,產生FREF參考時鐘傳輸到頻率檢測電路PFD,PFD產生的訊號傳輸到ChargePump產生電壓訊號,控制VCO壓控振盪器產生時鐘訊號FVCO經過M倍頻傳回到PFD中。環路不斷調整達到動態平衡。

PLL模擬

使用IP核生成PLL,生成25M、75M、100MHZ時鐘訊號

`timescale 1ns/1ns
`define Clk_period 20
module pll_tb;
	reg	  areset;
	reg	  Clk;
	wire	  c0;
	wire	  c1;
	wire	  c2;
	wire	  locked;
 pll pll0(
 .areset(areset),  //復位訊號 高電平處於復位狀態 
	.inclk0(Clk),  //時鐘訊號
	
	.c0(c0),
	.c1(c1),
	.c2(c2),
	.locked(locked)  //穩定訊號 若為1則動態平衡完成可以輸出穩定時鐘
	);

initial Clk =1;
always #(`Clk_period/2) Clk =~Clk;
initial begin
areset = 1;
#(`Clk_period*100+1);
areset = 0;
#(`Clk_period*200+1);
$stop;
end
endmodule

在這裡插入圖片描述

PLL控制4路LED

PLL控制4路LED以不同頻率亮滅
在這裡插入圖片描述

count模組
module count(
  Clk,
  Rst_n,
  high
   );
input Clk;
input Rst_n;
output reg high;

reg [24:0]count;
parameter count_max = 25'd24_999_999;  //50MHZ計算為500ms

always @(posedge Clk or negedge Rst_n)  //計數
if(!Rst_n)
count <= 25'b0;
else if(count == count_max)
count <= 25'b0;
else count <= count + 1'b1;


always @(posedge Clk or negedge Rst_n)  //計數滿輸出反轉
if(!Rst_n)
high <= 1'b0;
else if(count == count_max)
high <= ~high;
else high <= high;

endmodule 
count模組模擬
`timescale 1ns/1ns
`define Clk_period 20

module count_tb;

reg  Clk;
reg Rst_n;
wire back_high;

count #(
       .count_max (25'd24_999)
        ) 
count0(
  .Clk(Clk),
  .Rst_n(Rst_n),
  .high(back_high)
   );

initial Clk = 1;
always #(`Clk_period/2) Clk = ~Clk;

initial  begin
  Rst_n = 0;
#(`Clk_period*5);
  Rst_n = 1 ;
 #(`Clk_period*10000);
 $stop;
end

endmodule 

在這裡插入圖片描述
0.5ms反轉一次

pll_control模組

將不同頻率的時鐘傳送到count模組中。


module pll_control(
 Clk,
 Rst_n,
 Led
 );
 input Clk;
 input Rst_n;
 output [3:0]Led;

 reg	  areset;
 wire	  c0;
 wire	  c1;
 wire	  c2;
 wire	  locked;
 
 pll pll0(
   .areset(~Rst_n),   //復位訊號 高電平處於復位狀態 
	.inclk0(Clk),
	
	.c0(c0),
	.c1(c1),
	.c2(c2),
	.locked(locked)  //穩定訊號 若為1則動態平衡完成可以輸出穩定時鐘
	);
 
 count #( .count_max(25'd24_999_99)
         )
	count0(
  .Clk(Clk),
  .Rst_n(Rst_n),
  .high(Led[0])
   );

  count #( .count_max(25'd24_999_99)
         )
   count1(
  .Clk(c0),
  .Rst_n(Rst_n),
  .high(Led[1])
   );
	
 count #( .count_max(25'd24_999_99)
         )
 count2(
  .Clk(c1),
  .Rst_n(Rst_n),
  .high(Led[2])
   );
 
  count #( .count_max(25'd24_999_99)
         ) 
  count3(
  .Clk(c2),
  .Rst_n(Rst_n),
  .high(Led[3])
   );
endmodule 
pll_control模擬
`timescale 1ns/1ns
`define Clk_period 20
module pll_control_tb;

 reg Clk;
 reg Rst_n;
 wire [3:0]Led;
pll_control pll_control0(
 .Clk(Clk),
 .Rst_n(Rst_n),
 .Led(Led)
 );

 defparam pll_control0.count0.count_max = 249;
 defparam pll_control0.count1.count_max = 249;
 defparam pll_control0.count2.count_max = 249;
 defparam pll_control0.count3.count_max = 249;

initial Clk =1;
always #(`Clk_period/2) Clk =~Clk;

initial  begin
Rst_n=0;
#(`Clk_period*5);
Rst_n=1;
#(`Clk_period*1000);
$stop;
end

endmodule

在這裡插入圖片描述
4路led以不同時間反轉。驅動時脈頻率越高,閃爍速度越快。

相關文章