2017年11月11日土曜日

高速DAC基板を動作させる

DE0-nanoでつくった1MHzのIQ信号の波形です。自作高速DAC基板が動作してくれなくて困ってましたが、DACへのクロック供給方法を間違えていてCLKINとDCLKIO同相にしたらあっさり動作。思い込みではダメですね、データシートにはちゃんと書いてありました。


この波形写真、TDS3014B内蔵Webサーバにアクセスできず、仕方なく画面をデジカメ撮影することに。Chrome/IE/EdgeともにNGでしたが、ブラウザの互換性を疑っています。

高速DAC基板について

14ビット 2chの高速DAC AD9717が乗っています。各種実験ができるようDAC出力にはフィルタをもうけず、IQ信号をSMAコネクタでそのまま出力します。
クロックは、Si5338でDACとDE0-nanoの各々に個別に変更できるようにしています。基板の一番下に付いてるのは、AVRマイコンでAD9717とSi5338の初期化に使います。
基板は4層でELECROWで製造して貰いました。







高速DAC基板の駄目なところ


  • DE0-nanoにはLVDS接続するつもりでしたが、DE0-nanoと高速DAC基板の双方とも3.3V電源なのでダメ、さらには別途終端抵抗も必要です。


  • C25, FB3のシルク位置が逆。LDO出力の短絡で気が付きました。電源供給前にわかって良かった。



2017年7月3日月曜日

Raspberry Pi 回路図、拡張コネクタ、基板の外形寸法、電源の切り方

回路図

本家SCHEMATICSに掲載されています

拡張コネクタ


  • Raspberry Pi 3 Model BのGPIO拡張コネクタは40ピンヘッダで3.3V I/O
  • 拡張コネクタのGPIOピンの個別出力は16mAで各ピンの合計は50mA迄、ツール・ラボのページが詳しい
  • 拡張コネクタピンアサインはraspberrypi-spy.co.ukの図がわかりやすい。


基板の外形寸法

本家MECHANICAL DRAWINGSからRaspberry3の図です

電源の切り方

SSHして”sudo shutdown -h now"コマンドでOSをシャットダウン
GPIOにスイッチを付け、それをプログラムで監視してシャットダウン
いきなり電源を切りたい向きにはUPSを併用してシャットダウンさせる手法もあり

2017年6月30日金曜日

Quartusでデジタルフィルタ係数ROMの作成

Spartan3Eで作っていたFMトランスミッタのVerilogコードをDE0-nano(アルテラ)に移植しています。そこでIPコアのライセンスについて調べてみたら、Quartusライトエディションでは基本的な演算やハードIPは無償ですが、FIRフィルタやNCOを含むIP Base Suiteが有償オプションということになっています。これらのIPは、ライトエディションで使用できても、評価版という位置づけのようです。


係数ROMの作成

まずはデジタルフィルタのコードを移植です。係数ROMはハードIPなので、アルテラのハードIP "ROM: 1-PORT" をインスタンシエートします。基本的な機能は、ザイリンクスと同じなので同じ機能になるよう設定を進めます。ザイリンクスではフィルタの係数をCOEファイルで指定していましたが、アルテラでは、MIF(Memory Initialization File)かインテルHEXフォーマットを使います。このファイルは、QuartusでFile ⇒ New ⇒ Memory Initialization Fileとすると手入力できます。


とはいえ、係数は256行もあるのでエクセルで所定フォーマットに変換後、QuartusのMIFファイルにコピペ。Quartusのエディタを使うと係数データが2進数なのに、DATA_RADIX=UNS(Unsigned decimal)とされてエラーになるので"BIN"に修正しました。

MIFファイルのイメージ

WIDTH=18;
DEPTH=256;
ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;
CONTENT BEGIN
0    :   000000000000000001;
1    :   000000000000000001;
2    :   000000000000000000;
3    :   111111111111111111;

2017年6月29日木曜日

Raspberry Pi セットアップ備忘録

Raspberry3 model BをWiFi接続/ディスプレイ・キーボード・マウスレスで運用しながらSSHでリモートログインできるまでの設定メモです。


1.準備したもの


  • RasberryPi 3B本体
  • マイクロSDカード Class10/16GB以上を選んだ
  • HDMI-DVI D 変換ケーブル、HDMIが映るモニターがあれば要りません
  • USBキーボード
  • USBマウス
  • microUSB電源、スマホの充電器を使います


2.OSのダウンロード


  • Noobs Lite、軽量でネットワークインストール前提のもの


3.SDカードの準備


  • SDカードフォーマッター でフォーマット、要はFAT32でフォーマットしてるみたい
  • 解凍したNoobs Liteの中身をコピーしておく


4.OSのインストール


  • SDカードをRasberryPiの挿入し、起動する。赤ランプが点灯するだけで変化しないときはカードの読み込みに失敗してる。SDのフォーマット形式など確認。
  • WiFiの設定を行う
  • Raspbianを指定してインストール、ネットワークインストールは結構時間かかる
  • LanguageはEnglish(US)とする


5.OSの初期設定


  • Preferences ⇒ Raspberry Pi Configuration

Change Password : (デフォルトユーザ)pi のパスワードを変更
Auto Login : Login as user pi はチェックのまま
Boot : CLI にチェック

  • Interfaces

SSH : Enabled に変更

  • Location

Locale: en, US, UTF-8
Timezone : Asia Tokyo
Wifi Country : JP Japan 

6.WLANのIPアドレスを固定する


  • 「/etc/dhcpcd.conf」ファイルを編集

コマンドラインから sudo nano /etc/dhcpcd.conf とし、最終行に次の内容を追加
(Ctrl+O 保存、Ctrl+X終了)
 
interface wlan0
inform 192.168.0.x/24 ⇒ 固定したいIPアドレス
static routers=192.168.0.x ⇒ デフォルトゲートウェイ
static domain_name_servers=192.168.1.x ⇒ DNS

  • sudo reboot として再起動
  • コンソールからifconfigとやるとIPアドレスを確認できる


7.リモートログイン


  • WindowsからTeraTermでアクセス
  • SSH接続中 TeraTermのウインドウにファイルをドラッグアンドドロップするとファイル転送ができる(!)ただし"SCP(Secure CoPy)"を選ぶこと


2017年6月19日月曜日

DE0-nano 拡張ボード: オーディオ入出力部 光コネクタのピンアサインを間違えた

オーディオの光出力が動作しません。しかも赤色の光が暗いし。よーく考えて配線ミスではと気づきデータシートを確認。ああ、OPT-TXのピン配線が逆だった!
光コネクタのGNDとVinがあべこべに接続されていました。光コネクタを取り外し、サーマルグランドのカット・パターンカット・ジャンパ線追加・コンデンサの接続替えで無事動作してくれました。



チェックしたはずなのに、なぜ間違えたんだろう。。。EVERLIGHTのPLT133/T10WのUsing Methodだけを見て設計すればよかったんですが、同じページにあるPackage DimensionとUsing Methodのピン番号が対応してないんですね。落とし穴にはまってしまいました。



2017年6月17日土曜日

ArduinoでPB6, PB7ピンを使う

Arduino NanoではATmega328のPB6, PB7ピンは外付け水晶発振器を接続するため操作できませんが、内蔵RC発振器を使う前提であればこの端子も使えるのではと考えました。これはpins_arduino.cの設定変更で対応できるようですが、私のArduino 1.8.2ではこのファイルがpins_arduino.hに変わっていました。

C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard\pins_arduino.h に追記・変更します。

#define NUM_DIGITAL_PINS            22

const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, /* 0 */
PD,
PD,
PD,
PD,
PD,
PD,
PD,
PB, /* 8 */
PB,
PB,
PB,
PB,
PB,
PC, /* 14 */
PC,
PC,
PC,
PC,
PC,
PB, /* 20 */ PB, /* 21 */};

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 8, port B */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(0), /* 14, port C */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6), /* 20 port B */
_BV(7), /* 21 port B */
};

const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER, /* 0 - port D */
NOT_ON_TIMER,
NOT_ON_TIMER,
// on the ATmega168, digital pin 3 has hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
#else
TIMER2B,
#endif
NOT_ON_TIMER,
// on the ATmega168, digital pins 5 and 6 have hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
NOT_ON_TIMER,
#else
TIMER0B,
TIMER0A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER, /* 8 - port B */
TIMER1A,
TIMER1B,
#if defined(__AVR_ATmega8__)
TIMER2,
#else
TIMER2A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, /* 14 - port C */
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, /* 20 */
NOT_ON_TIMER, /* 21 */
};

2017年6月3日土曜日

サンプルレートコンバータをArduinoのI2Cで制御

DE0nano用の自作オーディオ入出力基板のサンプルレートコンバータはI2Cで初期設定しないと動作しません。普通ならFPGAから制御するところですが、私の実力不足であえてAVRマイコン ATmega328を付けています。このAVRマイコンチップは、Arduino UNOと同じなのでArduinoの開発環境を使ってみることにしました。

AVRマイコンとArduinoピン名称の対比

次の表は、ATmega328とArduino UNO ピン名称の対応を示したものです。自作基板の設計段階では、ArduinoIDEを使う想定はなかったのでアナログ入力端子にデジタル入力を割り当ててしまいましたが、調べたところ特に問題なく使えるようです。



ArduinoでのI2C制御

こんな感じに書くだけで、I2Cが使えます。
Wire.begin(); // join i2c bus (address optional for master)
Wire.write(0x08);   // Register 08: Transmitter Control Register 2
Wire.write(0x00);
Wire.endTransmission();
Cで書くのとやってることは同じですが、わかりやすく関数化されてます。これ、シンプルで簡単にみえますけどI2Cの信号のやりとりをイメージできないとまるでブラックボックスです。何はともあれ、SRC4382のレジスタ設定をべた書きするだけで呆気なく動いてくれました。

今回のArduinoスケッチ

#include <Wire.h>

#define ASRC_INT  2
#define MCU_INT  3
#define MCU_RDY  4
#define DIPSW0  5
#define DIPSW1  6
#define DIPSW2  7
#define DIPSW3  8
#define LED3  9
#define LED4  10
#define RST  A3
#define SRC4382_ADDR  0x70