FPGA FM受信機設計資料をGitHubに上げました

2年ほど前に実験していた、FPGAを使用したFM受信機の設計資料をGitHubに上げました。 SDR受信機とはどのように設計されるものなのか。実際のアナログ/デジタル回路含めて全体を理解したい、 という好奇心を満たすために始めたプロジェクトで、当初の目的はそれなりに達成できたと思います。

あまり詳しくドキュメントを書いていないので、実際に使用するのは難しいかと思いますが、 FM用のバンドパスフィルタ基板、ADC基板の回路図、ガーバー、BOMも含まれています。

XilinxのFPGAをKiCadのコンポーネントライブラリにするPerlスクリプト

XilinxのFPGAをKiCadで使用するために必要なコンポーネントライブラリ(のたたき台)を作成するためのやっつけPerlスクリプトを作成しました。

以下にソースを張っておきます。無保証です。使用方法は、Usageにも簡単に書きましたが、 まず、XilinxのページからPackage Device Pinout Filesを持ってきます。 例えば、Artix-7ではこちらのページからデバイス一覧のリンクをたどれます。次に、標準入力からスクリプトに流し込み、標準出力を*.libにリダイレクトします。 このlibファイルをKiCadのコンポーネントエディタで開くと、次のような感じになります。

"バンク0のピン"

すいません、矩形の描画はさぼっています。適宜矩形を追加したり、リファレンスを移動したり、 ピンの入れ替えなどを行ってください。 矩形の描画等は複数ユニットのコンポーネントだと、ちょっと注意しないといけません。実際の作業方法については、 KiCadで複数ユニット部品を作るが参考になります。

ピンはバンク毎に別々のユニットに分かれています。 こうするとVCCOも各バンクに属してしまうようです。必要であればlibを直接編集するなりしてください。

#!/bin/perl

# Usage:
# $ wget https://japan.xilinx.com/support/packagefiles/a7packages/xc7a50tfgg484pkg.txt
# $ cat xc7a50tfgg484pkg.txt | perl xilinx_kicad.pl > xc7a50tfgg484.lib

use strict;

my %banks;

# skip header
while (<>){
    last if $_ =~ /Pin\s+Pin Name/;
}

while (my $line = <STDIN>){
    chomp($line);
    last if $line =~ /^\s+$/;       # skip footer
    my @lst = split(/\s+/, $line);
##    foreach my $val (@lst){
##        print "$val ";
##    }
##    print "\n";
    push @{$banks{$lst[3]}}, "$lst[0] $lst[1]";
}

my $number_of_banks = keys %banks;

print "EESchema-LIBRARY Version 2.3\n";
print "DEF FPGA IC 0 40 Y Y $number_of_banks F N\n";
print "F0 \"IC\" 0 -100 60 H V C CNN";
print "F1 \"FPGA\" 0 -200 60 H V C CNN";
print <<'END';
F2 "" 0 0 60 H I C CNN
F3 "" 0 0 60 H I C CNN
DRAW
END

my $bank_count = 1;
foreach my $bank (keys %banks){
    #my $number_of_pins = @{$banks{$bank}};
    #print "Bank: $bank ($number_of_pins pins)\n";
    my $i = 0;
    foreach my $pin (@{$banks{$bank}}){
        #print "$pin\n";
        my @val = split(/\s+/, $pin);
        #print "\t$val[0]=$val[1]\n";
        my $posy = $i * 100;
        print "X $val[1] $val[0] -550 $posy 200 R 50 50 $bank_count 1 B\n";
        $i++;
    }
    $bank_count++;
    print "\n";
}

print "ENDDRAW\nENDDEF\n";

参考文献

Kicad/file formats

ADC基板到着

ついに、Elecrowに発注していたADC基板が到着しました。

3 / 9 (木)にPayPalにて支払いを行い、3 / 29に発送のお知らせメールが到着し、3 / 30 (木)に到着しました。 Elecrowから送られてきたL/Tは2-3weeksでしたが、ぴったり3週間で到着です。

3 / 29までは全く音沙汰がなかったので、ちゃんと進んでいるのか、それとも実装に失敗しているなどの問題が起きていないか、心配でした。

完成した写真を送ってくれたという方もいるようですが、私の場合はいきなり発送されました。 OCSの履歴を見てみると、3/28の夜に中国から送られて3/29の午前には日本に到着していました。 配達はさすがに速いですね。

ちなみに、基板2枚実装で241USD, π割引3.14USDで237.86USDでした。日本円で27,784円でした。1USD=116.8円なので、 あまりレートは良くないタイミングでした。

基板の包装は次のような感じでした。

基板のパッケージ

テンション上がります。

ちなみに、かの有名なElecrowガチャは2枚でした(実装したのも2枚)。

おまけ基板

ステンシルは入っていませんでした。再度製造を依頼する場合に必要になるので、こちらから頼まなければ保管しておいてくれているのかもしれません(未確認)。

ADCの部分は次のような感じです。

ADCパターン

KiCadに習熟していないせいで、若干センターのGNDが甘い気もしましたが、勢いで作ってしまいました。

あらかじめ購入しておいたSMA-BNC変換コネクタとジャンパを装着した状態が次です。

テンションMAX

うーん、美しい。初めての基板製作で我ながらよくここまで頑張った。 フットプリントがおかしくて墓石になることもなかったようです。 また、ちゃんとDIP部品もしっかり基板に入っています。ヘッドフォン端子はフットプリントが結構変態的だったので、ちゃんと基板に入るか心配でした。 ちなみに、画面下の赤いのは、SMAコネクタを保護しているプラスチックのキャップです。

ちょっと部品間隔が狭すぎるかと予想していましたが、しっかり実装できているようです。抵抗アレイはほとんど横並びです。 自分の実力だと、これほど近接していたらチップ部品の交換はしんどいですね。

右下のジャンパの接続のためのシルクも小さいけどしっかりと見えます。

それにしても、実際の基板ができた時の満足感はすごいですね。もうデバッグはいらない気分になってしまいます。

この基板をこれまた購入済みのZ-turn Boardに装着すると、次のような感じです。

最高の組み合わせ

さすがに80ピンもあると抜き差しは慎重にやらないと危険です。

1枚の基板はこの80ピンコネクタが少し曲がっているという不具合がありましたが、ひとまず手でなんとか挿入できるくらいまでは真っ直ぐに直しました(汗)。

あ、もちろん、電源を入れる前に電源とGNDがショートしていないことは確認しましたよ。

いよいよ(すぐにアダプタを抜ける態勢で)緊張の電源ON!!

「ピー」 ….. え??? ひとまず電源を抜きます。

おかしい?? ショートしている?? というわけで基板チェック開始。いろいろ調べてみたけど、やはりショートは問題ない。 どうやらJ6のジャンパを入れてADCの電源が入ると音が鳴る。J6がoffだと音はしない。

いろいろ調べてみたところ、どうやらビープを駆動するNPNトランジスタのゲートに接続されているネットがオープン状態なのですが、 そこの電位が数百ミリボルトあがっているようでした。それでトランジスタがONしてしまっているのではないかと思いました (参考)。 こうなってしまっている原因は不明ですが、ショートは恐らくないことを考えると、 ADC出力が開始されることで、当該ネットに近い他のネットからのクロストークを受けてしまっているのかもしれません。

というわけで、本来ならばビープのネットをプルダウンするのが良い解決策だと思いますが、FPGAで当該ネットをLow駆動することで音は出なくなりました。 ひとまず変更したデザインをQSPI ROMに書き込んで、起動時にコンフィグが終了すれば音が止むようになりました。

ちょっと先が思いやられますが、デバッグを続けます。

ADC基板ほぼレイアウト完成

前回から回路図をさらに追加し、オーディオ出力部分も回路を引きました。 それからBOMを作成し、部品のフットプリントを作成、レイアウト、と進んで、 ようやく基板のデータがほぼ完成しました。一連の作業はKiCadにて行っています。

とにかく大変でした。まずはKiCadで基板レイアウトをするための操作に慣れるのも。 こればかりはDon’t think, feel.という感じです。とにかく手を動かしているとわかってきました。

4層基板でレイアウトしてみましたが、最初はどうやっても片面ではADC周辺部分に部品が載り切らなかったです。 見積もりをWeb上で試してみたところ、やはり両面実装になると、値段はそれなりにアップしてしまいます。 それで、セラコン、チップ抵抗を0603パッケージから0402に一部変更して、なんとか片側に載せきりました。

電源プレーンは、ビアもない空間がかなり広がってしまっています。最初は最低限の幅でレイアウトしていましたが、 考えてみれば、その下には配線層があるので、できるだけベタにしたほうが良いのかな?と思い、面積を広げました。

また、40MHzのクロックラインもなんとなく周りをGNDの配線でガードしてみました。 トップ面のGND塗りつぶしも試してはみましたが、あまり美しくないのでやめました。

ADC基板

上にある80ピンのコネクタがZ-turn boardと接続するためのものです。電源は+5.0Vと+3.3Vが供給されていますが、 今回は3.3Vのみ使用しました。基板の左と下にはSMAメスのライトアングルコネクタがあります。 基板右側がヘッドホン端子です。ほぼ真ん中にある45度傾いているICがLTC2292(ADC)になります。 データシートに記載されている基板レイアウトは、ADCは傾いていませんが、 その代わりにADCへの入力が傾いています。結局は同じようなレイアウトになってしまうものですね。

無駄に何も部品がない空間があるように思いますが、肝心の信号入力部をできるだけ直線になるように配置した結果、 こうなってしまいました。BPFに使っている部品が0603なので、これも長さを食っています。 これでも一応10cm角には入るので、とりあえず良しとします。

これから基板の製作と実装の見積もりを依頼します。 実装も以来できる業者として、PCBCARTElecrowあたりを考えています。

KiCadでのゾーンの切り抜き

KiCadのゾーンは少し癖があります。

KiCadのPcbNewでゾーンを作成すると、その内側にあるゾーンとショートしてしまうことがあります。 この原因は、ゾーンの優先順位です。同じ優先順位を付けるのではなく、内側の優先順位を高く設定することで、 内側の領域が外側の領域とショートしなくなります。

また、塗りつぶしを実行してから、望み通りになっていない領域ができてしまう場合、 当該領域を切り抜くことができます。これも若干操作に問題があって、バージョン4.0.5では、 「表示」メニューから「描画キャンパスを標準に切り替え(F9)」が選択されていないと切り抜きができません。 標準になっていれば、切り抜きを追加したいゾーンを右クリックして「ゾーン」->「切り抜きを追加」で切り抜き領域を設定できます。 設定後に、外側のゾーンを再度塗りつぶすと、指定領域が切り抜かれます。

1/2 »