MAXUPLD入門 その3 90度位相差のあるクロック 及び PulseDensityModulation


違う方法で90度位相差のあるクロックを作った

 1.元クロックの1/4の周波数のものなら....

    こんな方法も、あります。

    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

    // always @(negedge clk) begin  //これを入れると、compile errorになる。
   //count <= count + 1;               //だから、クロックの立下りを利用できない--->元クロックの1/4の周波数になってしまう
   //end  
 
  assign Q1 = out1[0];
  assign Q2 = out1[1];
   
endmodule





何っ! 304MHzまで動作可能とは......


    まあ、これ(元クロックの1/4の周波数)では、あまり役に立たないですね.....

    クロックが変化する度に、4端子の切り替えスイッチが働く方法ないかにゃー。

2.パルス密度変調 (Pulse Density Modulation) とは?

    webで、凄いホームページを見つけました。 時代錯誤の回路図によるCPLD設計

    MAXUを使って、PDM型D/A変換回路、DDS回路を書いておられます、凄いなあ!

    ここで、パルス密度変調の原理を、解説して下さっているのですが、

    この原理を、verilogHDLのお勉強に、使わせていただきました、tnx 上田様。

module acum(VDA,clk,cy_out);

 input [1:0] VDA ;
 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;

  #1000
   $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