2010年8月13日金曜日

FMステレオチューナ: FPGA基板と操作表示部との接続

FPGA FMステレオチューナのその後です。今からみると、コードの選定や配置に不満点がたくさんあります。手を入れたところとしては、まずプリアンプ。特にアンテナケーブルを接続していないときに異常発振気味だったので、とりあえずアンプICの部品面側に銅箔テープを貼り付け、両面基板チックにしてみました。また、電源基板の放熱板が触れないほどに熱くなるので、苦肉の策として薄い銅板で放熱板とケース本体を接続しました。これでも62度(周囲30度)まで上昇します。


 基板全景


 プリアンプ基板


 電源基板

 
そういえば、操作表示部とFPGA基板との接続について紹介していないことに気がつきました。2つの基板の間は4本の信号線(とアース線)で接続しています。
操作表示部 SCLK端子 → FPGA 10ピン(SCLKIN)
操作表示部 SD端子 → FPGA 17ピン(SDATAIN)
操作表示部 EN端子 → FPGA 28ピン(SENIN)
操作表示部 RD端子 → FPGA 30ピン(SDATAOUT)

次にFPGAのVHDLソースです。もともと受信周波数の設定値(定数)が書かれていた const.vhdを次のように書き換えています。ここでは操作表示部から渡されたシリアルデータをシリパラ変換し、const_out として上位のモジュールに渡します。あと、FPGAからIQ信号を操作表示部に渡そうとしているんですが、これは動作確認していません。ちなみに、このVHDLソースは、Verilogで書いたものをVrilog-VHDL translatorを利用して作成しました。私のVerilogソースがいい加減だったらしく、変換後のソースに手を入れる必要がありました。
・・・半年以上たつと、改めてソースを見ても何を書いていたんだか忘れてしまっていますね。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity const is

port(

        SCLKIN    : in  std_logic;    -- Serial Clock
        SDATAIN    : in  std_logic;    -- Serial Data
        SENIN    : in  std_logic;    -- Serial Data Enable
        IFIN    : in  std_logic_vector(17 downto 0);    -- IF(I)
        IFIN2    : in  std_logic_vector(17 downto 0);    -- IF(Q)
        OTR_LED    : in  std_logic;   
        ST_LED    : in  std_logic;  
        CLK        : in  std_logic;
        RST        : in  std_logic;
        SDATAOUT    : out std_logic;   
        const_out    : out std_logic_vector(27 downto 0));     -- Frequency Set

end;

architecture Behavioral of const is
    signal qr    : std_logic_vector(15 downto 0);
    signal spc_stat    : std_logic_vector(1 downto 0);
    signal SCLKIN2    : std_logic;
    signal SDATAIN2    : std_logic;
    signal SENIN2    : std_logic;
    signal qs    : std_logic_vector(31 downto 0);
    signal psc_stat    : std_logic_vector(1 downto 0);
    signal const_out_int: std_logic_vector(27 downto 0);

begin


    v2v_pr_0:process (CLK)
    begin
        if (CLK'event and CLK = '1') then
            if (RST = '1') then
                SCLKIN2 <= '0';
                SDATAIN2 <= '0';
                SENIN2  <= '0';
            else
                SCLKIN2  <= SCLKIN;
                SDATAIN2 <= SDATAIN;
                SENIN2 <= SENIN;
            end if;
        end if;
    end process;



    v2v_pr_1:process (CLK)
    begin
        if (CLK'event and CLK = '1') then

            if (RST = '1') then
                qr  <= "0000000000000000";
                spc_stat <= "00";
                const_out_int  <= X"119C71C";

            elsif (SENIN2 = '1') then

                if (spc_stat = "10") then
                    spc_stat  <= "00";
                end if;

                if (SCLKIN2 = '1') then
                    if (spc_stat = "00") then
                        qr <= qr(14 downto 0) & SDATAIN2;
                        spc_stat  <= "01";
                    end if;
                else
                    spc_stat <= "00";
                end if;

            else

                if (spc_stat = "00") then
                    if (qr = X"0000") then
                        const_out_int  <= X"119C71C";                        -- 82.5MHz
                    else
                        const_out_int  <= (qr & X"000");
                    end if;

                    spc_stat  <= "10";
                    qr <= "0000000000000000";

                end if;

            end if;

        end if;
    end process;

    const_out <= const_out_int;

    v2v_pr_2:process (CLK)
    begin
        if (CLK'event and CLK = '1') then
            if (RST = '1') then
                qs <= X"00000000";
                psc_stat <= "00";

            elsif (SENIN2 = '1') then

                if (SCLKIN2 = '1') then

                    if (psc_stat = "00") then
                        psc_stat   <= "10";
                    end if;

                    if (psc_stat = "01") then
                        qs   <= (qs(30 downto 0) & '0');
                        psc_stat  <= "10";

                    end if;

                else
                    if (psc_stat = "10") then
                        psc_stat  <= "01";
                    end if;

                end if;

            else

                if (psc_stat = "01") then
                    qs    <= (OTR_LED & ST_LED & IFIN(17 downto 3) & IFIN2(17 downto 3));
                    psc_stat <= "00";

                end if;

            end if;
        end if;
    end process;

    SDATAOUT <= qs(31);

end Behavioral;




const と上位モジュールとの接続(ispLEVERの例)



追加した入出力端子をユーザ制約に追加(ispLEVERの例)


次回は、AVRのソースを紹介します

0 件のコメント:

コメントを投稿