MAXUPLD入門 その3 90度位相差のあるクロック 及び PulseDensityModulation 1.元クロックの1/4の周波数のものなら.... // always @(negedge clk)
begin //これを入れると、compile errorになる。 2.パルス密度変調 (Pulse Density
Modulation) とは? input [1:0] VDA
; #1000
違う方法で90度位相差のあるクロックを作った
こんな方法も、あります。
90度位相差のあるクロックを作るには、
要は、出力Q1,Q2を、
Q1 0
1 1
0
Q2 1 1
0
0
の、順番に出力してやればよい事に、気付きました。
そんで、以下のプログラムを考えました。(functionと言う機能を使う、勉強の意味も、込めとります)
module
my_2phase(clk,Q1,Q2);
input
clk;
output Q1,Q2;
reg [1:0]
count;
reg [1:0]
out1;
//multiplexer
function
function [1:0]
mux;
input [1:0]
sel;
begin
case(sel)
0 :mux
=2'b01;
1 :mux
=2'b11;
2 :mux
=2'b10;
3 :mux
=2'b00;
default: mux
=2'b00;
endcase
end
endfunction
//--------------------------------------
always
@(posedge clk) begin
count <= count +
1;
out1 <= mux(count);
end
//count <=
count +
1;
//だから、クロックの立下りを利用できない--->元クロックの1/4の周波数になってしまう
//end
assign Q1 =
out1[0];
assign Q2 =
out1[1];
endmodule
何っ! 304MHzまで動作可能とは......
まあ、これ(元クロックの1/4の周波数)では、あまり役に立たないですね.....
クロックが変化する度に、4端子の切り替えスイッチが働く方法ないかにゃー。
webで、凄いホームページを見つけました。 時代錯誤の回路図によるCPLD設計
MAXUを使って、PDM型D/A変換回路、DDS回路を書いておられます、凄いなあ!
ここで、パルス密度変調の原理を、解説して下さっているのですが、
この原理を、verilogHDLのお勉強に、使わせていただきました、tnx
上田様。
module acum(VDA,clk,cy_out);
input clk;
output
cy_out;
reg [1:0]
R;
reg cy_out;
initial
begin
R <=0;
end
always @(posedge clk)
begin
{ cy_out, R } <= VDA
+R;
end
endmodule
2bitカウンターの桁あふれ cyを、出力するものです。
で、テストベンチは、以下です。(テストベンチを書かないと、VDAを変えた時の比較ができないのです。)
module
test_acum();
reg clock;
wire cy;
reg [1:0]
VDA;
acum acum2(VDA,clock,cy);
initial begin
$monitor($time,"clock = %b,
cy=%b",clock,cy);
end
initial begin
clock <=1;
$finish;
end
always
#10 begin
clock <=
~clock;
end
initial begin
VDA<=0;
#200
VDA<=1;
#200
VDA<=2;
#200
VDA<=3;
end
endmodule
simulateの結果のように、
VDAと言う値(2bit)の変化と共に、パルスの密度が変化しています。
VeritakWin basic 使わせていただいております、tks。
これなら、上田様が書かれておられるように、電子ボリュームにもなりますね。
90度位相差のあるクロックの2逓倍を、探っている内に、上田様のHPに巡りあいましたが、
ロジックで、2逓倍は、難しい....
遅延回路を挿入して、元クロックに無いタイミングを、作る方法もあるようですが
正確では、ないですよね.....
ディジタルPLL .....わからん。.
H.21.2.3