技術のハードウェアアーキテクチャ(4つ)のクロック分周器

クロック分周器:
(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)で生成されます
ここに画像を挿入説明

公開された54元の記事 ウォンの賞賛4 ビュー1071

おすすめ

転載: blog.csdn.net/buzhiquxiang/article/details/103424145