クロック分周器:
(1)であっても、周波数分割(デューティ比50%)
(2)奇数分割(デューティ比50%)、
(3)非整数分周(50%以外のデューティ比)
(1)であっても分周(N = 6と仮定分割)が
あっても分周カウンタの作成に使用される
次のようにRTLファイル:
module pll6 #(parameter N=6)(
input clk,
input rst_n,
output clk_6);
reg [3:0] countl;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
countl<=0;
else if (countl<=N-2)
countl<=countl+1'b1;
else
countl<=0;
end
assign clk_6=(countl<=N/2-1'b1)?1:0;
endmodule
次のようにTBファイルは、次のとおりです。
module tb();
reg clk;
reg rst_n;
wire clk_6;
parameter period=20;//50Mhz
pll6 u1(
.clk(clk),
.rst_n(rst_n),
.clk_6(clk_6));
initial
begin
clk=0;
rst(32'd60);
forever #(period/2) clk=~clk;
end
task rst(
input[31:0] rst_time);
begin
rst_n=0;
#rst_time rst_n=1;
end
endtask
endmodule
(2)奇数の分割
1、方法は同じであっても、周波数分割で使用することができるが、50%のデューティサイクル出力(周波数分割7)を生成することができない
2は、最も簡単な50%のデューティサイクルクロックの奇数分周を生成します(2つのクロック間に90度の位相差で)出力周波数の半分は、2つの直交クロックと、2つの排他的論理和を生成するために、または出力クロック波形得るための方法である(例えば、N = 3)は
(1)発生6と90度(6分周信号の立ち下がりエッジ6を使用して、分周信号の立ち上がりエッジを生成する)によって分周クロック位相2
2つのクロックの(2)は、3ウェイを生成するXOR演算目標クロック
キー:
(1)カウント値の立ち上がりエッジは0、反転される
(N + 1)/ 2フリップカウント値の立ち下がりエッジで(2)
XORをしたがって、2つの直角位相クロックを生成することができ、次いで。
次のようにRTLコードは次のとおりです。
module pll_3#(parameter N=3)(
input clk,
input rst_n,
output pll_3);
reg [3:0] cnt1;
reg pll6_1;
reg pll6_2;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1<=4'h0;
else if(cnt1==N-1)
cnt1<=4'h0;
else
cnt1<=cnt1+1'b1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
pll6_1<=1'b0;
else if(cnt1==0)
pll6_1<=~pll6_1;
end
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
pll6_2<=1'b0;
else if(cnt1==N-1)
pll6_2<=~pll6_2;
end
assign pll_3=pll6_1^pll6_2;
endmodule
次のようにTBファイルは、次のとおりです。
module tb();
reg clk;
reg rst_n;
wire pll_3;
parameter period=20;//50Mhz
pll_3 u1(
.clk(clk),
.rst_n(rst_n),
.pll_3(pll_3));
initial
begin
clk=0;
rst(32'd60);
forever #(period/2) clk=~clk;
end
task rst(
input[31:0] rst_time);
begin
rst_n=0;
#rst_time rst_n=1;
end
endtask
endmodule
(3)非整数除算(非50%のデューティサイクル)
分周クロックの1(N = 1.5)
注3同一の立ち上がりエッジで。
ドローの前に3ウェイコード:
module pll_3#(parameter N=3)(
input clk,
input rst_n,
output reg pll_1);
reg [3:0] cnt1;
wire pll_3;
wire clk1;
reg pll6_1;
reg pll6_2;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1<=4'h0;
else if(cnt1==N-1)
cnt1<=4'h0;
else
cnt1<=cnt1+1'b1;
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
pll6_1<=1'b0;
else if(cnt1==0)
pll6_1<=~pll6_1;
end
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
pll6_2<=1'b0;
else if(cnt1==N-1)
pll6_2<=~pll6_2;
end
assign pll_3=pll6_1^pll6_2;
assign clk1=pll_3?clk:~clk;
always@(posedge clk1)
begin
if(!rst_n)
pll_1<=1'b0;
else
pll_1<=pll_1^1'b1;
end
endmodule
次のようにTBファイルは、次のとおりです。
module tb();
reg clk;
reg rst_n;
wire pll_1;
parameter period=20;//50Mhz
pll_3 u1(
.clk(clk),
.rst_n(rst_n),
.pll_1(pll_1));
initial
begin
clk=0;
rst(32'd60);
forever #(period/2) clk=~clk;
end
task rst(
input[31:0] rst_time);
begin
rst_n=0;
#rst_time rst_n=1;
end
endtask
endmodule
明らかに、この方法は、マルチプレクサの出力が原因である可能性があり、出力クロック(即ち、バリ3)にスパイクが生じる、直ちに変更することができない、基準クロックの周波数の増加に伴って、このような状況はより高くてもよいです。
図2に示すように、4.5倍の部分(非50%のデューティサイクル)の周波数を生成するためにシフトレジスタを使用して実装、非整数分周器回路を最適化するために、グリッチのない出力クロック
(1)000000001の9ビットシフト値を使用してリセットレジスタ、左1へのシフト・レジスタのクロック・サイクルの立ち上がりエッジ。
(2)4.5倍最初のパルスは、分周であり、第1ビットのシフトおよび2つの操作(デューティ比40%)の最初の半サイクルの第2ビット
(3)は、4.5倍を生じ第二のパルスを分割し、5番目のビット位置6は、半サイクル動作で移動し、6またはビットで
RTLコード:
module pll_4_5(
input clk,
input rst_n,
output pll_4_5);
reg [9:1] shift_reg;
wire cnt1;
wire cnt2;
reg cnt1_180;
reg cnt5_180;
reg cnt6_180;
wire cnt6;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_reg<=9'b0000_00001;
else
shift_reg<={shift_reg[8:1],shift_reg[9]};
end
assign cnt1=shift_reg[1];
assign cnt2=shift_reg[2];
assign cnt6=shift_reg[6];
always@(negedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt1_180<=1'b0;
cnt5_180<=1'b0;
cnt6_180<=1'b0;
end
else
begin
cnt1_180<=shift_reg[1];
cnt5_180<=shift_reg[5];
cnt6_180<=shift_reg[6];
end
end
assign pll_4_5=(cnt1|cnt1_180|cnt2)|(cnt5_180|cnt6_180|cnt6);
endmodule
次のようにTBファイルは、次のとおりです。
module tb();
reg clk;
reg rst_n;
wire pll_4_5;
parameter period=20;//50Mhz
pll_4_5 u1(
.clk(clk),
.rst_n(rst_n),
.pll_4_5(pll_4_5));
initial
begin
clk=0;
rst(32'd60);
forever #(period/2) clk=~clk;
end
task rst(
input[31:0] rst_time);
begin
rst_n=0;
#rst_time rst_n=1;
end
endtask
endmodule
図3に示すように、フィードバック回路は、LUTの組み合わせに基づいて、クロックバリを含まない生成
正確レジスタサイクルの出力との差としてA、Bを用いて、(ルックアップテーブルに基づいて、例えば、N = 1.5)(クロックサイクルを生成するNANDゲートを使用して正のパルスは、2つのクロックサイクル0)で生成されます