adcHandler の設計を始めている。
全体の構成をまとめる目的でノート上にブロック・ダイアグラム描く過程で、2 線+チャンネル分の CS といった構成で高速通信を行う仕掛けを思い付いた。

端子のスリム化を目指すために INH+chAddress といった構成で回路を組むことを思いつき、ベクターを使ってセレクタを記述しようとしたものの、VHDL の文法を完全に忘れてしまった。
記憶を掘り返すために書庫からトラ技スペシャルを発掘して基本的な文法の確認を行ったが、20 年前の資料は流石に古臭い感が強く、実際 VHDL の仕様は 2008 年頃に改訂されているらしい。
例えば、reduce_or といったファンクションが追加されていたので、これを使った Wired OR を暫定的に組んでみたが、実験の結果はネガティブで、残念ながら Lattice の IDE にはこのファンクションが実装されていないことが判明、旧来のオーソドックスな手法で設計を行うことになった。
まず、以前は 32bit 構成のシフトレジスタを制御するクロック・ライン毎に分散させていた ChipSelect を一箇所に集約するためのセレクタを記述した。

賢いオプティマイザがリソースの消費を抑える形で最適化を行っていると思われるが、今回行う試みは CS ラインの合理化で、従来は 8 本だったそれが4本に収まる。 一方、MCU 側ではアドレッシングに要するステップが加算されるので、処理能力的には若干の劣化が見込まれる。
adcHandlerは、入出力の構造が dacHandler とは逆の構成になる。 出力最終段をまとめる WiredOR を模した素子に行った、orIn(0) といった端子の指定法に自信がなかったが、受け入れられたようだ。

新たに組み上げた adcHandler の全体構成はこのようになった。

adc から出力されるデータを捌くために、内部の信号ラインを増設している。

データラインのやり取りを統括する LRCK の信号ラインは従来のスタイルを踏襲している。

同様に、SCK の取り回しも従来と変化がないが、何れの場合にも極性のミスマッチが出てくるかもしれない。

リセット回路に関しては、終段手前の D-FF を配線から取り除いている。

今回使用を想定している 24bit 精度の ADC から LSB のデータをマスクするために出力される FSYNC の入力端子を 4 本追加した。

終段手前の D-FF のリセットは、CS 端子から "L" が入力されるタイミングで行う。

D-FF のクロックラインは Inverter によって反転されている。

ピンの配列はこのようにまとめた。


赤いマークで示されるエラーのアラートが認められるが、直後にリカヴァーが行われているので問題はないだろう。 処理速度のボトルネックも許容範囲に収まっているようだ。


蓄積したデータを放出するタイミングがシビアな故に実験で不具合を見つけなければならないのだが、旧dacHandler で出ていた「重篤な遅延が発生する旨の警告」は確認されていない。
シフトレジスタ周りのクロックラインを整理したついでに、dacHandler のアップデートを行うことにした。

旧 dacHandler のピン配置は D/CLK/CS*8 がフルチャンネルの構成だった。新しい設計で消費される端子は、D/CLK/addr0~2/C の計6本とほぼ半減する。

現在楽器に実装している DA 出力は4ch で、この場合 MCU 側に必要とされる出力端子は D/CLK/CS*4 の6本が D/CLK/addr0~1/CS の5本に減少する。

こちらもスピードは確保できているようで、、、

重篤な制限はほぼ掛かっていない模様。
追記(0211_25):
順次処理領域の構成を修正することで、

データラインの遅延を抑えつつ所々で発生していたエラーをほぼリカヴァー出来るかもしれない。

AnalysisReport のエラーレポートは以下の通り。

高速動作が求められる信号ラインに発生したエラーが解消されているようだ。
Place&RouteTraceのエラーレポート。

MCK を分周した 2 ラインを除いて、エラーに対応が行われているようだ。

クロックラインのボトルネックは 245MHz と、状況は好転している。
posted by Yasuski at 22:07|
FPGA