FPGA

DE10-Nano Kitは結構良さそう

つい先日、FPGA評価ボードを購入して、基板まで製作しFPGAによるFMラジオまで製作してしまいましたが、 最近発売されたDE10-Nano Kitも悪くないのではないか?と思いました。 Z-turn Board(7020版)と比較してみると、次のような利点、欠点がありそうです。個人的に重要なポイントは太字で。

Pros:

  • 130USDなので、送料も含めるとZ-turn Boardよりは高くなると思われるが、JTAGケーブルは別途必要ではないので、トータルでは安いと思われる。
  • 多ピンコネクタが2.54mmピッチのようなので、汎用性は高い
  • 搭載FPGAのサイズもZynqの7020より少し大きい。ARMも少しだけ早く動作する(800MHz vs 667MHz)。
  • +5V電源もキットに標準で含まれている(でもこちらも電源SWは無さそう?)。
  • IOもZ-turn Board搭載Zynqの400pinパッケージよりも多い672pinパッケージ。でも実際に使用可能なIOはそれほど変わらない雰囲気です。

Cons:

  • DDR3の動作周波数は遅い(1066MHz vs 800MHz)。
  • ロジックの動作は多分Zynqの方が速い?
  • Alteraは無料で高位合成ツールは提供されていない。ソフトコアCPUも有償。

2017/4/17追記: Terasicの公式ページだとStockが無い様で、 “Contact Us"となっていますが、Mouserだと在庫があるようです。 しかも送料無料です。レート換算してみると、1USD=121.5円なので若干悪いですが、送料無料と思えば適正ではないかと思います。 追記終わり

一長一短という感じですが、用途(と好み)によっては良いのではないでしょうか。ちなみに、 搭載されているCyclone V SE 5CSEBA6U23I7は、digikeyで調べてみると、 1個買いで29,694円(2017/3/28調べ)です。そう考えるとかなりお値段頑張っていると思います。 ただし、Alteraは機能のわりにXilinxより元々少し高いという印象がありますが。

Z-turn Board搭載のZynqは、同じくdigikeyで調べてみると、 13,724円です。これも一個買いするのであれば、それほど変わらない値段でZ-turn Boardが買える計算になります。

ADC基板のBPFのシミュレーション

今回は、LTspiceを使用して、 ADC基板に実装しているBPF(Band Pass Filter)の周波数特性をシミュレーションしてみました。

“Simulation”

実線が左側の軸(振幅)に対応し、点線が右側の軸(位相)に対応しています。

初めて使ったので、少し使い方に迷いましたが、比較的簡単に使えました。 シミュレーションを行う周波数を50M-120Mと入力したらメガヘルツになるかと思ったら、 Mはミリと解釈されるようです。メガを指定するにはmegと入力しないといけません。 LTSpice入門を読んで分かりました。

シミュレーション結果を見てみると、-3dBになるのは大体60MHzと105MHzあたりでしょうか。 70-90MHzの範囲はほぼ0dBで通過しているのが見て取れます。 もう少し急峻にバンド外を落とすかと思っていましたが、わりとゆるやかな特性なのですね。

Wikipedia によると、これはバターワースフィルタのCauer形のようです。ロールオフ特性は緩やか、とはっきり書いてありました。

DDSデータキャプチャとFFT表示

前回、ADCキャプチャのためのFPGAとLinux周りの準備を行いました。

まだ実際のADC基板は完成してきていないので、FPGAにてDDS(Direct Digital Synthesizer: デジタル的に正弦波を生成する仕組み)を使用して、仮想的なデータを作ってみました。

具体的には、FPGAにDDS Compilerをインスタンシエートして、 PCのソフトウェアにてキャプチャ&FFTを実行しました。

DDS Compilerにて作成するIPは、3MHzの正弦波としました。

DDS compiler

12bit出力ですが、AXI Streamポートは16bit幅となっています。どうやら16bitの内、下位12bitにデータが入っている様子でした。符号付きデータです。

この12bitを5データ集めて、かつ4bitのダミービットを付加して64bitとし、前回のAXI DMA IPにてDDRに転送します。 PC側のソフトウェアは、手っ取り早くC#で作成しました。

いろいろ細かいデバッグを行って、現状次のような表示になっています。

ADC_FFT

画面上部にキャプチャした波形そのものを少し表示しています。横軸はサンプル番号です。 マイナスからプラスの範囲でしっかりフルスケールの正弦波となっている様子がわかります。 画面下部はキャプチャしたデータをFFTしてdB表示しています。 どうも使用しているFFTライブラリの正規化の挙動が不明で、0dBを超えてしまっています… 3MHzにびしっと信号があることを確認できます。

FFTライブラリには、C#でマイク音声をFFTするを参考に、 Math.NET NumericsをNugetにてインストールして使用しました。

これで基板が来るまでの準備は大体満足するところまで作成できました。

ADCデータキャプチャのためのLinuxとFPGAの設計

現在Elecrowにて製作中のADC基板ができてきた折に、Z-turnボードと接続してイーサネットにてADCデータを取得するためのファームウェア周りを作成しています。

FPGAについて

Zynqに接続されているDDRメモリにADCデータを保存します。 DMAマスタをRTLで記述するのは割と面倒(とにかくAXIはポートが多いので、どうしても行数は増える)なので、できるだけ楽をしたいと思います。 そういうわけで、Vivado HLS一択です。DMAコントローラのコードは次のように至極単純です。

ちなみに、AXI DMAを使えばいいじゃないか、という意見もありそうです。 しかしながら、AXI DMAは一回の転送で最大8MBしか転送できないという理解不能な制限があるので、今回はわざわざ作成しました。 SGDMAを駆使すればできると思いますが、とりあえずデータを取り込むことが目的なので、そのあたりは別途余裕ができたところで検討したいと思います。

#include "hls_stream.h"
#include "ap_int.h"
#include "axi_dma.h"

void axi_dma(ap_uint<64>* addr, ap_uint<32> offset, ap_uint<32> len, hls::stream<ap_uint<64> > &in){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE s_axilite port=offset
#pragma HLS INTERFACE s_axilite port=len
#pragma HLS INTERFACE m_axi depth=4096 port=addr
#pragma HLS INTERFACE axis port=in
    ap_uint<32> i;
    
    for (i = 0; i < len; i++){
#pragma HLS PIPELINE
    	addr[offset+i] = in.read();
    }
}

ん?Hugoでc++のシンタックスハイライトが効かない…

AXI Liteインタフェースでoffsetアドレス、転送長をレジスタで設定します。また、モジュールの開始終了もAXI Lite経由で操作できるようになっています。

ADC基板のRF入力部分

前回、SDRの実験用基板について記載しましたが、 やっとRF入力についての回路図が大体できたと思います。

RF入力回路図

我ながらごちゃごちゃして見にくいです。1枚に詰め込みすぎ。

図面の上半分が、ADCの入力の回路です。 片方は70-90MHzのBPFを通し、RFアンプ、RF balunを通して差動入力されています。こちらはFM用です。 RFアンプのデータシートを見てみると、一般的にはLNA(Low Noise Amplifier)を通してから、 このアンプに信号を入力するようです。ただ、Interfaceの特集記事ではLNAは使用しないで実現していましたので、 FM程度の帯域だったら問題ないのかもしれません。

もう一方の入力は、シングルエンドモードで使用し、かつRFアンプを使用するパスと使用しないパスをジャンパで選択できるようにしています。 ジャンパでRF信号を通すのは少し気が引けますが、こちらはAM帯域をターゲットするので、 まぁそれほど高速性は要求されないから良いでしょう。

ADCの入力インピーダンスは、データシートによると100Ω以下とするように記載されていますが、 どちらの入力も基本的には50Ωに揃えてあるつもりです。 RFアンプは入力も出力もインピーダンスが50Ωとなるデバイスです。

また、SENSEピンはジャンパにて2Vp-pか1Vp-pかを選択します。

図面真ん中左側にあるのは、ADCのクロック生成部です。 TCXOから出力される40MHzをCDCLVS1102で2つに分岐します。片方はADCのCLKA,CLKBに入力され、 もう一方はコネクタを介してFPGAのCCピンに接続します。ADCからのクロック出力は無いためです。

2017/2/20追記:当初予定していたTCXOは2.5ppmのものでしたが、 digikeyでは在庫がなくなっているため、 ちょっと怖いですがMEMSの5ppmのクロックに変更しました。 お値段もそれなりにアップしてしまいました。

図面下側はADCの電源部です。VDDはMax 3.4V、Typical 3.0Vです。LDOで3.3Vから3.0Vを生成し、 かつ生成された3.0Vと3.3Vから使用する電圧をジャンパで設定できるようにしています。 クロックが3.3Vなので、VDD=3.0Vで動作させるのはどうかな、という懸念があるためです。 この回路全体で使用されるのは最大で150mA程度と想定されますので、300mA出力のLDOを選択しています。

この回路を作成していたら、オーディオ出力も載せたくなってきました。 最終的にFPGAでSDRを実装したら、そのまま音を出してみたいですしね。 元々の予定だと、この程度の回路で基板を描くつもりでしたが、 オーディオ部分も回路を作成しようと思います。

回路作成すると、いろいろと欲が出てきます。

Z-turn Boardが到着

先日注文していたZ-turn Boardが到着しました。動作確認をひとまず行いました。 東芝の4GBのMicroSDカードが付属しているので、それを装着して電源を入れると、 Linuxが起動します。HDMIモニタに映像も出力されます。

USB_UARTで電源供給とターミナル接続ができますが、USBコネクタがMini-Bタイプでした。 最近珍しいですね。

いきなりdmesgで恐らくSDカードでのファイルシステムエラーが出ていますが、 ボードとしての機能は問題なさそうです。 先行して到着していたXilinx互換ケーブルで認識できることも確認しました。

ちなみに、PayPal経由での請求は、$144が16437円でした。レートにすると114.16円くらい。最近変動が激しいですが、 1%くらいしか手数料は乗っていないのではないかと思われます。

freeroot@localhost:~# free
             total       used       free     shared    buffers     cached
Mem:        771712     319528     452184          0      18980     124896
-/+ buffers/cache:     175652     596060
Swap:            0          0          0

root@localhost:~# dmesg
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 640440K/786432K available (5236K kernel code, 261K rwdata, 1616K rodata, 200K init, 207K bss, 145992K reserved, 8192K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0xf0000000 - 0xff000000   ( 240 MB)
    lowmem  : 0xc0000000 - 0xef800000   ( 760 MB)
    pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    modules : 0xbf000000 - 0xbfe00000   (  14 MB)
      .text : 0xc0008000 - 0xc06b9588   (6854 kB)
      .init : 0xc06ba000 - 0xc06ec380   ( 201 kB)
      .data : 0xc06ee000 - 0xc072f7a0   ( 262 kB)
       .bss : 0xc072f7ac - 0xc07634a4   ( 208 kB)
Preemptible hierarchical RCU implementation.
        Dump stacks of tasks blocking RCU-preempt GP.
        RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
NR_IRQS:16 nr_irqs:16 16
slcr mapped to f0002000
zynq_clock_init: clkc starts at f0002100
Zynq clock init
sched_clock: 16 bits at 54kHz, resolution 18432ns, wraps every 1207951633ns
timer #0 at f0004000, irq=43
Console: colour dummy device 80x30
Calibrating delay loop... 1332.01 BogoMIPS (lpj=6660096)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x4f15f8 - 0x4f1650
L310 cache controller enabled
l2x0: 8 ways, CACHE_ID 0x410000c8, AUX_CTRL 0x72760000, Cache size: 512 kB
CPU1: Booted secondary processor
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
Brought up 2 CPUs
SMP: Total of 2 processors activated.
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
regulator-dummy: no parameters
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
cpuidle: using governor menu
zynq device is 7z020
hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 4 bytes.
zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0xf0080000
VCCPINT: 1000 mV
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
media: Linux media interface: v0.10
Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
cfg80211: Calling CRDA to update world regulatory domain
Switched to clocksource ttc_clocksource
NET: Registered protocol family 2
TCP established hash table entries: 8192 (order: 3, 32768 bytes)
TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
TCP: reno registered
UDP hash table entries: 512 (order: 2, 16384 bytes)
UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
PCI: CLS 0 bytes, default 64
hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available
futex hash table entries: 512 (order: 3, 32768 bytes)
bounce pool size: 64 pages
jffs2: version 2.2. (NAND) (SUMMARY)  \xffffffc2\xffffffa9 2001-2006 Red Hat, Inc.
msgmni has been set to 1490
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-2364208
dma-pl330 f8003000.dmac:        DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
e0000000.serial: ttyPS1 at MMIO 0xe0000000 (irq = 59, base_baud = 6249999) is a xuartps
e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 82, base_baud = 6249999) is a xuartps
console [ttyPS0] enabled
xdevcfg f8007000.devcfg: ioremap 0xf8007000 to f006a000
[drm] Initialized drm 1.1.0 20060810
brd: module loaded
loop: module loaded
m25p80 spi0.0: found s25fl129p1, expected n25q128
m25p80 spi0.0: s25fl129p1 (16384 Kbytes)
7 ofpart partitions found on MTD device spi0.0
Creating 7 MTD partitions on "spi0.0":
0x000000000000-0x000000080000 : "qspi-boot"
0x000000080000-0x0000000a0000 : "qspi-bootenv"
0x0000000a0000-0x000000500000 : "qspi-bitstream"
0x000000500000-0x000000980000 : "qspi-kernel"
0x000000980000-0x000000990000 : "qspi-devicetree"
0x000000990000-0x000000f90000 : "qspi-rootfs"
0x000000f90000-0x000001000000 : "data"
CAN device driver interface
libphy: MACB_mii_bus: probed
macb e000b000.ethernet eth0: Cadence GEM at 0xe000b000 irq 54 (00:0a:35:00:01:22)
macb e000b000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=e000b000.etherne:03, irq=-1)
e1000e: Intel(R) PRO/1000 Network Driver - 2.3.2-k
e1000e: Copyright(c) 1999 - 2014 Intel Corporation.
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP Deflate Compression module registered
usbcore: registered new interface driver rtl8192cu
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
ULPI transceiver vendor/product ID 0x0424/0x0007
Found SMSC USB3320 ULPI transceiver.
ULPI integrity check: passed.
zynq-ehci zynq-ehci.0: Xilinx Zynq USB EHCI Host Controller
zynq-ehci zynq-ehci.0: new USB bus registered, assigned bus number 1
zynq-ehci zynq-ehci.0: irq 53, io mem 0x00000000
zynq-ehci zynq-ehci.0: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver option
usbserial: USB Serial support registered for GSM modem (1-port)
mousedev: PS/2 mouse device common for all mice
usbcore: registered new interface driver synaptics_usb
ft5x0x_ts_init successful
input: gpio-beep.3 as /devices/amba.1/gpio-beep.3/input/input0
i2c /dev entries driver
input: ADXL34x accelerometer as /devices/amba.1/e0004000.i2c/i2c-0/0-0053/input/input1
sii902x 0-003b: sii902x_probe
Sii902x: read id = 0xB0
-0x02-0x03
-0x00
myir_stlm75x_probe()
myir-stlm75x driver initialized successfully!
cdns-i2c e0004000.i2c: 400 kHz mmio e0004000 irq 57
cdns-wdt f8005000.watchdog: Xilinx Watchdog Timer at f007a000 with timeout 10s
zynq-edac f8006000.memory-controller: ecc not enabled
cpufreq: __cpufreq_add_dev: CPU0: Running at unlisted freq: 666666 KHz
cpufreq: __cpufreq_add_dev: CPU0: Unlisted initial frequency changed to: 666667 KHz
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: no vqmmc regulator found
mmc0: no vmmc regulator found
mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP: cubic registered
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20120528 t)
can: netlink gateway (rev 20130117) max_hops=1
Registering SWP/SWPB emulation handler
mmc0: new high speed SDHC card at address 1234
mmcblk0: mmc0:1234 SA04G 3.63 GiB
 mmcblk0: p1 p2
xylonfb video mode: 1280x720-32@60
Console: switching to colour frame buffer device 160x45
sii902x 0-003b: sii902x_fb_event event=0x5,
sii902x 0-003b: Sii902x: setup..
xylonfb 1 registered
sii902x 0-003b: sii902x_fb_event event=0x5,
xylonfb 0 registered
input: gpio-keys.4 as /devices/amba.1/gpio-keys.4/input/input2
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
sii902x 0-003b: det_worker
ALSA device list:
status: 0X1F, sii902x.retries: 2
sii902x 0-003b: EVENT=plugin
sii902x_poweron
  No soundcards found.
sii902x 0-003b: exit det_worker
sii902x 0-003b: det_worker
status: 0XB9, sii902x.retries: 2
sii902x 0-003b: EVENT=plugout
sii902x_poweroff
sii902x 0-003b: exit det_worker
sii902x 0-003b: det_worker
status: 0X1D, sii902x.retries: 2
sii902x 0-003b: EVENT=plugin
sii902x_poweron
sii902x 0-003b: exit det_worker
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 19, 9856 clusters in bitmap, 9858 in gd; block bitmap corrupt.
JBD2: Spotted dirty metadata buffer (dev = mmcblk0p2, blocknr = 0). There's a risk of filesystem corruption in case of system crash.
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 1, 3 clusters in bitmap, 0 in gd; block bitmap corrupt.
JBD2: Spotted dirty metadata buffer (dev = mmcblk0p2, blocknr = 0). There's a risk of filesystem corruption in case of system crash.
EXT4-fs (mmcblk0p2): 4 orphan inodes deleted
EXT4-fs (mmcblk0p2): recovery complete
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:2.
Freeing unused kernel memory: 200K (c06ba000 - c06ec000)
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 2, 474 clusters in bitmap, 507 in gd; block bitmap corrupt.
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 7, 147 clusters in bitmap, 97 in gd; block bitmap corrupt.
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 8, 21679 clusters in bitmap, 21684 in gd; block bitmap corrupt.
JBD2: Spotted dirty metadata buffer (dev = mmcblk0p2, blocknr = 0). There's a risk of filesystem corruption in case of system crash.
random: init_stage2 urandom read with 121 bits of entropy available
random: nonblocking pool is initialized
EXT4-fs error (device mmcblk0p2): ext4_mb_generate_buddy:756: group 0, 17407 clusters in bitmap, 17409 in gd; block bitmap corrupt.
JBD2: Spotted dirty metadata buffer (dev = mmcblk0p2, blocknr = 0). There's a risk of filesystem corruption in case of system crash.
udevd[760]: starting version 175
NET: Registered protocol family 10
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
init_stage2: failsafe main process (1281) killed by TERM signal
init_stage2: atd main process (1341) terminated with status 1
init_stage2: atd main process ended, respawning
xylonfb video mode: 1280x720-32@60
sii902x 0-003b: sii902x_fb_event event=0x1,
sii902x_fb_event event=[FB_EVENT_MODE_CHANGE]
sii902x 0-003b: Sii902x: setup..
sii902x 0-003b: sii902x_fb_event event=0x10,
sii902x 0-003b: sii902x_fb_event event=0x9,
sii902x 0-003b: FB_BLANK_BLANK
sii902x_poweroff
sii902x 0-003b: sii902x_fb_event event=0x10,
sii902x 0-003b: sii902x_fb_event event=0x9,
sii902x 0-003b: FB_BLANK_UNBLANK
sii902x_poweron
FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

ADC基板の構想

FPGAと基板を接続して、簡単なSDR(Software Defined Radio)の実験をしてみたいと 思っています。Interface 2015年7月号に触発されました。

上記記事では、LPC-Link2を使ってAMとFMの受信を行っています。 私も、まずはマイコン上でソフトウェア処理する前に、一回ADCデータをパソコンにすべてダンプして、PC上で オフライン処理をしてみようと試みたことがありました。 実際にLPC-Link2で実験してみたところ、USBの転送速度からして、10M sample/sec程度が良いところ、という印象でした。

上記特集ではこの程度のサンプリングレートでAM/FM復調を行っていますので、まぁ十分なのですが。

単に基板を作ってみたいという個人的趣味が先行しています。

それで、Z-turn Boardに接続する、ADCとUSB3.0が搭載されたボードを作ろうと目論んでいます。 今はいろいろと基本的な部品の選定を行っています。ある程度固まってきたので、記録しておきます。 随時追加予定です。使用する部品は、Elecrowあたりで実装することを考えて、digikeyやmouserで容易に入手できそうなものを選びます。

また、ADC周りの設計は完全に素人なのですが、自分なりに調査した結果、AM/FMならばとりあえず、 BPF->RFアンプ->RFトランス->ADCという信号の流れで良いのではないかと考えました。 ADCは差動入力なので、RFトランス(Balun)にてシングルエンド信号を差動に変換します。 ただし、RFトランスは低周波数(1MHz以下)あたりでは性能が悪化するようです。それで、FMについては上記信号経路とし、 BPF, RFアンプ, RFトランスについてはジャンパでそれぞれバイパスできるようにします。 また、ADCについても、ジャンパにて差動モードとシングルエンドモード両方で使えるようにしたいです。

実際に上記雑誌の特集では、AMについては一切外付け部品を使用せず、アンテナを直接ADCに繋いでいます(ADCの前にLPFが入っていますが)。

2017/2/17追記:上記のようにジャンパで信号パスを選択することを想定しましたが、Linear Technology LTC2292CUPは2チャンネル入力があり、 かつ比較的安価なので、こちらを使用してFM, AM用としてそれぞれ使おうかと思います。 また基板は、ADCが乗ったものと、USB3.0が乗ったものを別々に製作しようと思います。 ADCとUSB3.0基板では、必要なPCBの層数も違いますし、基板製作に失敗したときのダメージも分けたほうが小さいので。

  • RFアンプ:BGA2818 (6-TSSOP)
  • P1dB: 4dBm, Gain: 30dB, 雑音: 3.3dB
  • RFトランス:MABAES0060 (RF1:1 Flux Coupled Transformer, 0.3-200MHz, 1:1 impedance)
  • digikeyにて297円. 画像がいかにもトランスです。果たしてElecrowで実装できるのか?
  • データシート
  • ADC:LTC2292CUP (12bit, 40M sample, 64-QFN)
  • ADC:AD9235BRUZ-40 (12bit, 40M sample, TSSOP-28) こちらは対象外に脱落
  • USB:CYUSB3014-BZXC

(本当はLVDS出力のADCが良かったのですが、結構お高いので、まずはできるだけ安いもので実験してみようと思いました。 ただし、このADCはレジスタ設定のようなものが無い代わりに、ピンの電圧などで動作が変わるという奇妙なデバイスです。)

Xilinx Platform Cable USB(もどき)到着

先日Z-turn Boardを注文しましたが、それが到着する前に、 Amazonで注文したXilinx互換ケーブルが到着しました。

Platform Cable USB

もろにロゴと商品名まで使ってます。本体のコネクタは2.54mmピッチ, オス, 14pinです。ちなみに、 写真に写っているUSBケーブルも付属していました。最近A-Bタイプはあまり使わなくなってきたので、 ちょっと助かります。

重要なのは付属品の方です。

付属品

左から、

  1. 2.54mmピッチ, メス-メス, 8pinのブレークアウトケーブル
  2. 2.54mmピッチ, メス-メス, 10pinのフラットケーブル
  3. 2.54mmピッチ, メス-メス, 14pinのフラットケーブル
  4. 2mmピッチ, メス-メス, 14pinのフラットケーブル
  5. 2.54mmピッチ, メス-メス, 用途不明ブレークアウトケーブル

となっています。

そして、写真の上に写っている黒い基板が大切で、こちらの裏側は、JTAG本体に刺さる2.54mmピッチのメスコネクタが実装されています。 写真に写っている側には3つのコネクタが実装されており、 一番左、左から2番目、左から4番目のケーブルがそれぞれ刺さるようになっています(左から3番目は変換基板なしで本体に刺さる)。 これで基板に実装されているJTAGコネクタの各種に対応できるようになっています。

まだ肝心のZ-turn Boardが到着していませんが、Vivadoからの認識はできているようでした。 Z-turn Boardが到着し次第、双方の動作確認を行います。

結局、Z-turn boardを購入しました

前回、FPGA基板を探していると書きましたが、早速注文してしまいました。 結局、Z-turn Board (MYS-7Z020-C-S, 7020の方)にしました。$119と送料$25で合計$144でした。 日本の税関を通すあたりでまたいくらか取られるのかもしれません。

あと、さらに調べて分かったのは、こちらのボードはJTAGケーブルは別途必要だということです。仕方ないので、これは別途調達しようかと思います。

注文はPayPalで決済されるのですが、私は初めて利用しました。レートなどが気になったので調べてみたら、 どうやらPayPalは手数料が高いらしいです。このあたりを参考にして、 クレジットカード側にてレートが決まるように設定しました。あとはこれが日本円でいくらになるのか?ですね (2017/3/28追記 144USD=16437円でした。1USD=114.146円です。2/7のレートは111.6-112.4円/USDあたりでしたので、 それほど手数料はかかっていないと思います)。

なかなか時間が取れないですが、少しずつ進展させていきたいと思います。

**追記:**早速注文しました。@marsee101さんに教えていただいた、 JTAG-HS3です。でも、こちらのJTAGはコネクタのピッチが2.0mmなのに対して、 Z-turn Boardはおそらく2.54mmピッチのようです。変換ケーブルも発注しなければ。

**さらに追記:**変換ケーブルも調べてみたら、なかなか工作不要の2mmピッチ(オス)<->2.54mmピッチ(メス)は見つかりませんでした。 2mmピンヘッダを買って工作すれば2.54に変換できまずが、できるだけやりたくないので、 やはりAmazonのやつを買おうかと思います。これは商品の写真にもあるように、何種類かのピッチに変換する コネクタが付属しているようです。これがあるだけでも1,000円だけ高いのは自分としては十分許容されます。

FPGAの評価ボードを探してます

現在、安価で良さそうなFPGAの評価ボードを探しています。 Zynqの乗ったZyboは既に所有しているのですが、 今の興味からして、単にFPGAアクセラレータを作って遊びたいのではなくて、IOで遊びたいと思っています。 その観点からすると、ZyboはPMODコネクタしかないし、LVDSもありません(差動はあるけどなぜかバンクの電圧が3.3V。おいおい)。

希望としては、自作基板をコネクタで接続し、LVDS, 高速トランシーバあたりが使えるとベストです。

Z-Turn Boardというのは、基板の裏に80ピンのコネクタが2つも ついているので、なかなか良さそうでした。ただし、搭載Zynqにはそもそも高速トランシーバはありません。 また、使用されているコネクタの型名が回路図にも記載されていなかったので、嵌合相手がちょっとわかりません。 ケースの無いオス型1.27mmピッチであれば基本問題なさそうですが。 それと、これらのコネクタ間の距離も記載されていなかったので、両方のコネクタを使用する基板を作ろうとした 場合、ちゃんとコネクタ間の距離を計測しないと痛い目に遭います。非常に惜しい… もちろん、1つのコネクタを殺して80ピンだけ使うという方法もありますが、基板はやりだすと、 いろいろ載せたくなって欲が出てくるので、ちょっとピン数が不安です。

今のところ、FPGAとしてはCyclone V GXスタータ開発キットなるものが割と要望にマッチしていそうだと思いました。 旧Alteraですが… 私も昔(CycloneIIIくらいまで)はAlteraを使っていましたが、ZynqあたりからXilinx一辺倒になっています。 デバイスとしても、Xilinxの方が色々と細かいところの使い勝手が良くて高機能のように感じます(昔のISEは個人的には最悪でしたね。あの頃はQuartusの方が良かった)。

しばらくAlteraはご無沙汰していましたが、高速トランシーバも一応使えるコネクタがあるので、ちょっと魅力があります。でも最高速が3Gbps程度なので、Xilinxと比べてしまうと見劣りするんですよね。 しかもSDRAMはLPDDR2で最速300MHz(多分600Mbpsでしょう)と、これまた少し見劣りします。まぁ、とりあえずLVDSが使えれば良いですが…

ゆくゆくは高速ADCとUSB3.0を搭載した基板を作りたいと目論んでいます。これだけなら(JESD204B使わなければ、)トランシーバはいりませんけどね…

ちょっと検索してみたら、Cyclone V GXボードのHSMCコネクタ(ASP-122952-01)はなかなか見つからないではないですか。digikeyでも買えない。困った。

なんで、これに相当するような安価なXilinxのボードがないのでしょうね?? せめてLVDSだけでも使えれば… 自分の中では今更Altera?というのがあるのですよ。

もう少し検討してみたいと思います。

もし上記のような要望を満たした安価な評価ボード(できればXilinx)があれば、twitterで教えてください!