2017年5月30日火曜日

サンプルレートコンバータとのインターフェースをModelSimでシミュレーション

DE0nanoにSRC4382 サンプルレートコンバータを接続するため、必要なクロックの生成とPCM信号をやりとりするインターフェースをVerilogでRTL記述します。インターフェースと言ってもシリアル・パラレル変換とパラレル・シリアル変換なんですが、いろんな書き方があります。今回は、以前作成したコードを少しアレンジしただけでしたが、当時は参考書を片手にとても苦労した覚えがあります。
シミュレーションは、テストベンチを作る手間がかかりますが、バグ取りがラクなので結局は早道です。備忘録として無償のModelSim - Intel FPGA Starter Editionを使った例を紹介します。

SRC4382とVerilogモジュールの接続イメージ

サンプルレートコンバータをスレーブモードで動作させるため、各種のクロック信号はDE0-nanoが供給します。さらにデジタルオーディオのPCMデータをシリアル・パラレル変換、パラレル・シリアル変換します。これをasrc_ifというモジュールに記述します。


Quartusの事前設定


  • Assignments ⇒ Settings ⇒ EDA Tool Settings(Simulation) ⇒ Tool name に "ModelSim-Altera"と指定。※"ModelSim"ではありません
  • Tools ⇒ Options ⇒ EDA Tool Options の ModelSim-Alteraに C:\intelFPGA_lite\16.1\modelsim_ase\win32aloem と指定。
  • ModelSimを起動するには、QuartusからTools ⇒ Run Simulation Tool ⇒ RTL Simulationとします。

新規プロジェクトの作成

  • ModelSimで、File ⇒ New ⇒ Project とし、プロジェクト名を適当に指定します。Add items to the Projectウインドウが現れるが、何もせず閉じます。


  • Project ⇒ Add to Project ⇒ Existing File として、シミュレーション対象のVerilogファイルを指定します。
  • Project ⇒ Add to Project ⇒ New File として、テストベンチを新規作成・追加します。Add file as typeでVerilogを指定しておきます。保存場所はシミュレーション対象と同じフォルダが良いようです
  • Compile ⇒ Compile All してテストベンチをコンパイルします。コンパイル結果は、プロジェクト ペインのStatusで確認できます。

シミュレーションの実行

  • もしメガファンクションが含まれる場合は、メガファンクションのシミュレーションライブラリを登録します。シミュレーションライブラリ名は、MegaWizardの途中で表示されます。
  • シミュレーションライブラリを登録は、Simulate ⇒ Start Simulation ⇒ Librariesタブ ⇒ Search Libraries( -L )欄のAdd ⇒ altera_mf_verを指定。verilog用なので _verのサフィックスが付きます


  • 次にDesignタブでワーキングライブラリ(デフォルト名work)内でテストベンチを指定します。メガファンクション ALTPLLを使うときは、Resolutionを1psにしなくてはダメという場合もあるようです。

  • Simulation Configurationに保存

ところでStart Simulation の設定は保存されないので、保存したいときはSimulation Configurationを使います。Project ⇒ Add to Project ⇒ Simulation Configurationで適当な名前を付けます。すると、ProjectペインにConfiguration名の項目が現れるので、次回からはこれをクリックします。
  • シミュレーション結果を波形表示させるため、テストベンチを右クリックしてWaveウインドウに項目を追加します。



  • シミュレーション時間を指定して Run をクリックしてシミュレーションを実行します。



  • 無事波形が出ました。テストベンチでパラレル・シリアル変換とシリアル・パラレル変換をループバックさせたところミスを発見。1カ所修正して、シミュレーションでは動作できることがわかりました。


参考資料


使用したVerilogファイルとテストベンチ

module asrc_if
(
CLK,
RST,
LCH_IN,
RCH_IN,
LCH_OUT,
RCH_OUT,
SRC_MCLK,
SRC_RST,
SRC_BCK,
SRC_LRCK,
SRC_DOUT,
SRC_DIN,
SRC_LOCK
);

2017年5月28日日曜日

AES/EBUを民生用 同軸デジタル端子に接続する検討

業務用AES/EBUデジタル音声を民生用のサウンドカードに接続すれば、音ぐらいは出るんじゃないか?と考えて、同軸接続するにはどうすれば良いかを検討しました。いろいろと準備はしたんですが、結果的に業務用機器に触れる機会がなく実際に検証するには至りませんでした。せっかくですので、検討メモを残してきます。
任意の機器間で音が出るかどうかはまったく不明ですのでご注意ください!


AES/EBUインターフェース

  • 業務用デジタル音声伝送規格として策定されたAES3規格(AESが1985年に策定)、IEC60958として国際標準化
  • 16~24ビット 2チャンネルを伝送。サンプリング周波数は48kHzが基本で、22.05/24/32/44.1/48/88.2/96/176.4/192kHzが規定されている。
  • 接続ケーブルは特性インピーダンス110Ωのシールド付きツイストペアケーブル(RS-422準拠)による平衡伝送/3ピンXLRコネクタ接続と75Ω同軸ケーブルによる不平衡伝送/BNCコネクタ接続がある。
  • 伝送距離はIEC60958に書いていない(見つけられなかった)。カナレのケーブルでは360mの伝送が可能と謳うものがある。
  • コンテンツの著作権保護に対応していない

S/PDIFインターフェース

  • 民生用デジタル音声伝送規格としてEIAJ(現JEITA)が1987年にCP-340規格として策定、IEC60958として国際標準化。さらに圧縮オーディオAC-3方式やMPEGオーディオ等を含めるためIEC61937として拡張されている
  • 16~24ビット 2チャンネルを伝送。サンプリング周波数は22.05/24/32/44.1/48/88.2/96/176.4/192kHzが規定されている。
  • 接続ケーブルは75Ω同軸ケーブルによるRCAコネクタ接続とプラスチック光ファイバによる角形光コネクタ(トスリンク)または丸形光コネクタ(基本的な形状は3.5φステレオミニジャックと同じ)接続がある。
  • 伝送距離はIEC60958に書いていない(見つけられなかった)。
  • 著作権保護機能としてSCMSに対応

AES/EBUとS/PDIFのちがい

  • AES/EBUとS/PDIFは、音声伝送部分のフォーマットは基本的に同じだが、チャンネルステータスデータの使い方が異なっているので両者に互換性はないとされています。ただ、オーディオデータそのものは両者で同じなので、機器によっては音声だけでも伝送可能ではと考えました。動作するかは実験的に確認するしかありません。Xonar D2XはS/PDIF同軸接続に対応しているので、AES/EBU XLR端子に無理矢理つないで試してみます。
  • AES/EBU XLR端子出力の規格はインピーダンス 110Ω、平衡出力、2~7Vp-p(110Ω終端)。入力はインピーダンス110Ω、200mV~7Vp-p(規格策定当初 最大10Vp-p)
  • S/PDIF同軸出力の規格は、インピーダンス 75Ω、不平衡出力、0.5Vp-p(75Ω終端)。入力は、インピーダンス75Ω、0.2V~0.6Vp-p

AES/EBUをS/PDIFに電気的に接続する方法

  • XLR端子からBNC端子への110Ω-75Ω変換器が市販されているので買ってみました。
  • AES/EBU ⇒ S/PDIFの場合、変換器に5V(変換器仕様5Vmax)が入力された場合、変換出力は3.98Vとなります。S/PDIF入力範囲は0.2V~0.6Vp-pなので減衰量20dBの75Ω減衰器を併用する必要があります。
  • S/PDIF ⇒ AES/EBUの場合は、S/PDIF出力0.5Vp-pで変換器で昇圧されて出力は0.58Vp-pとなり、電気的にはそのまま接続可能です。
  • この手法は、電圧仕様のみに着目した接続方法です。実際の機器で音が出るかは、それぞれの機器の実装により決まると思われるため、実験的に確認する必要があります。つまり音が出ればラッキーということです。

参考資料

2017年5月19日金曜日

DE0nanoでQuartus Prime Lite Editionを使う: 備忘録

新規プロジェクトの作成

  • File ⇒ New ⇒ New Quartus Prime Project ⇒(New Project Wizard画面)
  • Directory, Name, Top-Level Entity⇒ プロジェクトのディレクトリ、プロジェクト名、トップレベルモジュールの名前 ⇒ Next
  • Project Type: Empty project ⇒ Next
  • Add Files: (空白のまま)⇒ Next
  • Family, Device & Board Settings ⇒ Family: Cyclone IV E, Available devices: EP4CE22F17C6を指定 ⇒ Finish

Verilogファイルの新規作成

  • File ⇒ New ⇒ verilog HDL File
  • File ⇒ Save As ⇒ (ファイル名を確認して)保存 ⇒ (プロジェクトにファイルが追加されました)


Verilogファイルのサンプルコード

DE0nano搭載の50MHzクロックを分周してLEDを光らせてみます。
module DE0nano
(
CLOCK_50,
KEY0,
LED
);
 
input CLOCK_50;
input KEY0;
output [7:0] LED;
 
reg [27:0] count; 
always @(posedge CLOCK_50 or negedge KEY0)
begin
if (~KEY0)
count <= 0;
else if (count == 28'hFFFFFFF)
count <= 0;
else
count <= count + 1'b1;
end
 
assign LED = count[27:20]; 
endmodule

FPGAのピンアサイン

  • 事前作業としてデザイン情報を作成します。Processing ⇒ Start ⇒ Start Analysis & Elaboration
  • Assignments ⇒ Pin Planner



ピンアサインするには、Node Nameをパッケージのピン番号にドラッグ&ドロップするか、Locationにピン番号を直接記入します。I/O規格も適宜変更します。


コンパイルの実行

  • Processing ⇒ Start Compilation
  • コンパイルが無事終了したらコンパイラレポートで最大周波数などが見られます

FPGAに書き込み



ROMに書き込み

  • (Quartusで)File ⇒ Convert Programming File 
  • Programming file type: JTAG Indirect Configuration File (.jic), Configuration device: EPCS64(基板のバージョンによりEPCS16の場合あり)
  • Input files to convert: Flash Loaderをクリック ⇒ Add Device ⇒ Cyclone IV E ⇒ EP4CE22 ⇒ OK
  • Input files to convert: SOF Dataをクリック ⇒ Add File ⇒ 変換元のsofファイルを指定
  • Generate をクリック ⇒ jic ファイルが生成される
  • Convert Programming File を終了
  • Programmer を起動
  • Add File ⇒ 先ほど生成した jic ファイルを指定
  • Program/Configure と Verifyにチェックを入れる 
  • Start で書き込み開始


2017年5月16日火曜日

DE0-nano 拡張ボード: オーディオ入出力部(2)バグ取り着手

前回からなんと3年ぶりの記事です。DesignSpark PCBで設計した基板をELECROWで製造してもらってから時間が経ってしまいました。
まーなんとかなるやろ!と試作せずに作ってしまいました。シルク印刷があるとちゃんとしているように見えますが、見落としたミスがいっぱい潜んでいるはずです。

この基板には、デジタルオーディオの光コネクタ入出力が各1個、オーディオモニタ用のBNC出力が2個、USBシリアルポート1個をつけました。このほか、AVRマイコン(ATmega328P-AU; 32TQFP)が乗っていてデジタルオーディオインターフェースのSRC4382の制御とDIPスイッチと半固定ボリュームの面倒を見ています。




2017年5月8日月曜日

ArduinoIDEから生AVRマイコンに書き込み

Arduinoのスケッチを、工場出荷状態(ブートローダなし)の生AVRマイコンに書き込む手順を確認してみました。先人の情報によりArduinoIDEから違和感なく書き込みできるようになりました。

事前準備
ArduinoIDEには、"書込装置を使って書き込む"というメニューがありますがやってみると失敗してしまいます。ファイル⇒環境設定で"より詳細な情報を表示する"にチェックを入れて確認するとavrdudeのエラーが出ています。
avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch
         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
         Using Port                    : usb
         Using Programmer              : stk500v2
スケッチの書き込み中にエラーが発生しました
avrdude: usbdev_open(): did not find any USB device "usb" (0x03eb:0x2104)
avrdude done.  Thank you.
これはAtmel Studio 7.0とセットでArduinoIDEと互換性のないJungoドライバがインストールされてしまうことが原因で、ArduinoIDEがAVRISP MK IIを認識できない状態のようです。
解決策として、Jungoドライバと共存できるようにlibusb-win32ドライバをインストールします。AVRISP mkII を接続したままlibusb-win32-devel-filter-1.2.6.0.exeを実行。ウィザードの最終段階でLaunch filter installer wizardにチェック。Install a device filterとして、リストからAVRISP mkIIを指定してインストールします。(参考記事1参考記事2

ArduinoIDE/AVRISP mkIIを使ったスケッチの書き込み
さらに、kosakalabの開発環境を導入してデバイスを選んで開発できるようにしてみました。ここでは、デバイスとしてATmega328、クロックは内蔵8MHzを指定しています。この段階ではヒューズビットの書き換えまでは反映していません。


ArduinoIDE/AVRISP mkIIを使ったヒューズビットの書き換え
kosakalabの開発環境では、ツール⇒ブートローダを書き込む とすると、ダミー操作のブートローダ書込を行った後にヒューズビットの書き換えとプログラムの消去が行われます。このため改めてプログラムを書き込む操作が必要です。

2017年5月7日日曜日

互換基板でArduinoを試す

食わず嫌いだったArduinoを試してみます。いきなり互換基板から入るのもどうかと思いますが、たまたま手元にあったArduino UNO R3互換の中国製NHduino UNO基板でまずはLチカしてみることにしました。Windows10ならUSBシリアルI/F CH340Gのドライバはあっさりと自動認識してくれましたし、電源はUSB給電だしラクで良いです。


Arduino IDEをインストールして、、、
よくある解説通りにファイル⇒スケッチ例⇒01.Basics⇒Blink


次にターゲット基板を指定しましょう。ツール⇒ボード としたら、既にArduino/Genuino UNOが選択されていました。また、デバイスマネージャによるとCH340GはCOM3として認識されているので、シリアルポートをそれに合わせます。


次にプログラムを書き込んでみます。右矢印をクリック(スケッチ⇒マイコンボードに書き込む Ctrl+U と同じ)するとコンパイルされたプログラムがUSBシリアルを通じて書き込まれます。Lチカのサンプルもあっさり動作。これは簡単です!