32fs 16LJ 備忘録

 




CPLD基盤は6年前に作ったTDA1515A 差動基板のCPLDの部分を使いました。2つのTDA1545AにそれぞれBCK,LRCK,DATAが出力されていましたので、そのうちの4つを使って変換した32fs BCK LRCK WCLK 16bit DATAを出力するようにしました。そしてチップを取り外して、それらの出力をDACシグナルの+、ー出力にジャンパーして端子で出力するようにしました。
CPLDはMAXII EPM240Y100C5。プログラムソフトはIntel Quartus Prime Light Edition 20.1.1。Newプロジェクトを作成してチップを選択して初期画面となります。そこでProjectにVerilog-HDLのシートを追加してそこにプログラムを書き込み。コンパイルするプログラム名を右クリックしてSettingメニューを表示してTop-level-entryを設定してコンパイル。
コンパイルするとピンのアサインができるようになります。

〇プログラマー

〇タイミングチャート(Pulse View)


〇Verlog-HDLプログラム
~I2S→左詰め16bit(BCK 32fs)への変換をFPGAでやる~

module I2S_to_16LJ(bck,data,lrck,bck_out,data_out,lrck_out,WCK);


    input bck;

    input data;

    input lrck;

    output bck_out;

    output data_out;

    output lrck_out;

    output WCK;

 

    reg data_out = 0;           

    reg[4:0] data_counter = 0;  

    reg[31:0] data_fifo = 0;   


    wire lrck_32LJ;

    delay_1BCK I2S_to_32LJ (lrck, bck, lrck_32LJ);

    delay_1BCK delay (lrck_32LJ, bck, lrck_out);    


    reg lrck_changed;

    half_freq half_freq_ins (bck, lrck_changed, bck_out);


    reg lrck_before = 0;

 

    always @(posedge bck)

 

 

    begin

   

        if(lrck_before != lrck_32LJ)

        begin

            data_counter <= 0;

            data_fifo[0] <= data;

            lrck_changed <= 1;

        end

        else

        begin

            data_counter <= data_counter + 1;

            data_fifo[data_counter + 1] <= data;

            lrck_changed <= 0;

        end

        lrck_before <= lrck_32LJ;

    end


    always @(negedge bck_out)

    begin

        data_out <= data_fifo [data_counter / 2];

    end


     reg delayed_lrck = 0;

    reg[7:0] lrck_fifo;


    assign WCK = lrck_out ~^ delayed_lrck;

 

    always @ (posedge bck_out)

    begin

        lrck_fifo <= {lrck_fifo[6:0],lrck_out};

    end


    always @ (negedge bck)

    begin

        delayed_lrck <= lrck_fifo[7];

    end

 

endmodule


コメント

人気の投稿