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のソースを紹介します