DSP56001ボードのデジタル部分についてはほぼ完成でいいでしょう。今のところハード設計ミスは無いみたいです。ソフトはアセンブラでモニタまでできましたがコーディングしてみた感じではやはりDSP特有のアーキテクチャから来るクセが結構ありました。
以下気になったところをまとめてみると・・・
1.命令の直交性
インストラクションセットは同じモトローラの68000とよく似ていて取っつきやすいのですがオペランドに取る対象レジスタ、メモリの制約が大きく直交性は悪いといえます、以下の図のようにレジスタは豊富にあるのですが特に算術論理演算の対象レジスタは56bitアキュームレータに限られたり、即値は転送命令MOVEにしか使えません
2.データ表現
前にも触れましたがデータレジスタは2の補数による固定小数点表現で格納されることを想定していてレジスタ間の転送・演算、シフトでは自動符号拡張や有効なビット位置に注意が必要です
3.並列転送
DSP56001内には複数のデータバスがありALUで演算処理をしている間に空いているXデータバス。Yデータバスを使ってデータ転送を同時実行できます。つまり1命令で3~4回データ転送できるわけでうまくコーディングすると非常に効率の良い処理ができるはずですが、これはアセンブラレベルでの設計ではなかなか難しそうです
4.パイプライン処理
これもDSPの処理高速化のため搭載されている機能ですが、その挙動にも気を付ける必要がありそうです。例えば以下のようなコード:
MOVE #0,R1
MOVE P:(R1),X0
これはプログラム領域0番地の内容を間接参照でレジスタに読み出すだけの基本的なコーディングですが、これをアセンブルするとこんなエラーが発生します
「前の命令で書き込まれたレジスタの内容は利用できません」と怒られます。アセンブラのマニュアルによるエラー説明では
Due to pipelining, if an address register (Rn or Nn) is changed in the previous instruction,
the new contents are not available for use as a pointer until the next instruction.
とありパイプライン処理によりアドレス レジスタ を変更すると直後の命令ではポインタとして使用できないようでこれは結構めんどくさそうです
このあとはコーデックを含めたアナログ系の確認をしていくことになるのでコーデックCS4215とサンプリングクロック用の水晶2個も実装しハードウエアは完成させました