Posts Tagged with "Vivado HLx"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

6809

posted by sakurai on July 26, 2019 #136

さて、目的はレトロコンピュータの設計ですが、そのために8bit CPUを搭載します。ここでは使用するソフトウェアの関係上6809を取り上げます。入手元はOpen Coresで、VivadoにはRTLとして取り込みます。
https://opencores.org/projects/6809_6309_compatible_core

開発ツールが必要ですが、6809アセンブラを以下から入手します。
https://www.6809.org.uk/asm6809/

画面表示用のサンプルソースファイルをテキストエディタで、

VRAMB equ \$0000
VRAMR equ \$4000
VRAMG equ \$8000
;
start org \$c000
;
 clra
l1 ldx #VRAMR
l2 sta ,x+
 inca
 cmpx #VRAMR+16000-1
 blo l2
;
 ldx #VRAMG
l3 sta ,x+
 inca
 cmpx #VRAMG+16000-1
 blo l3
;
 ldx #VRAMB
l4 sta ,x+
 inca
 cmpx #VRAMB+16000-1
 blo l4
 bra l1
;
 org \$fffe
 fdb start
;
 end

として、以下のようにアセンブルします。

asm6809 --bin test.asm -l test.lst -o test.o

以下のアセンブルリストのようにアセンブルされ、合わせてバイナリファイルが生成されます。

0000         VRAMB  equ   \$0000
4000         VRAMR  equ   \$4000
8000         VRAMG  equ   \$8000
           ;
C000         start  org   \$c000
           ;
C000 4F           clra
C001 8E0000     l1   ldx   #VRAMR
C004 A780      l2   sta   ,x+
C006 4C           inca
C007 8C3E7F         cmpx  #VRAMR+16000-1
C00A 25F8          blo   l2
           ;
C00C 8E4000         ldx   #VRAMG
C00F A780      l3   sta   ,x+
C011 4C           inca
C012 8C7E7F         cmpx  #VRAMG+16000-1
C015 25F8          blo   l3
           ;
C017 8E8000         ldx   #VRAMB
C01A A780      l4   sta   ,x+
C01C 4C           inca
C01D 8CBE7F         cmpx  #VRAMB+16000-1
C020 25F8          blo   l4
C022 20DD          bra   l1
           ;
FFFE             org   \$fffe
FFFE C000          fdb   start
           ;
0000             end


左矢前のブログ 次のブログ右矢

グラフィックタイミング設計 (2)

posted by sakurai on July 25, 2019 #135

SVGAの物理画面のグラフィックタイミングは変更しないので、RTLはタイミングに関してはほとんど変更ありません。以下は元のRTLのグラフィックタイミング定義部分です。

parameter HD=800; // Phyisical Display Timing Horizontal
parameter HFP=40;
parameter HSP=128;
parameter HBP=88;
parameter HO=HFP+HSP+HBP;
parameter HL=HD+HO; // 1056

parameter VD=600; // Phyisical Display Timing Vertical
parameter VFP=1;
parameter VSP=4;
parameter VBP=23;
parameter VO=VFP+VSP+VBP;
parameter VL=VD+VO; // 628
parameter EHD=512; // Embedded Display Timing Horizontal
parameter EVD=512; // Embedded Display Timing Vertical

parameter HW=11;
parameter VW=10;
parameter EHOFF = (HD-EHD)/2; // Embedded Display Offset Horizontal
parameter EVOFF = (VD-EVD)/2; // Embedded Display Offset Vertical

このうち、論理画面のサイズについて、赤字のように修正します。

parameter EHD=640; // Embedded Display Timing Horizontal
parameter EVD=400; // Embedded Display Timing Vertical

parameter HW=12;

しかしながら、Space Invadersと異なり、Xが2の階乗でないため、アドレスカウンタがXとYについてきれいにフィールドで分かれません。従って、水平、垂直カウンタとは別に、VRAMアドレスカウンタを設け、EHD&EVDのディスプレイタイミングでカウントイネーブルをかけます。このようにすれば、表示期間のみアドレスが進み、穴が空く(表示の隣り合うビットが物理的には離れたアドレスに位置する)ことはありません。

さらに、アドレスカウンタを偶数用、奇数用に分け、水平ラインの偶数と奇数でカウンタを進み分けることで、同じアドレスを2回出力することにします。これで縦の2倍拡大が行えます。

実際に動かしてみると、データ表示のビット並びが逆順になっているようです。dual port memoryのA側(CPU側)は8bit幅、B側(ディスプレイ側)は1bit幅で、dual port memoryの内部に8:1のマルチプレクサがあるはずです。表示されたビットの並びが思ったのと逆だったので、アドレス下位3bitを反転することで正しい並びになりました。


左矢前のブログ 次のブログ右矢

グラフィックタイミング設計

posted by sakurai on July 24, 2019 #134

概略が決定できたので、詳細設計を行います。各パラメータはVGAタイミングのサイトで決定すると、以下の表のようになります。

図%%.1
図134.1 タイミング表

これに基づき、水平、垂直のタイミングチャートを書くと、以下の図のようになります。

図%%.1
図134.2 タイミングチャート

参考のため、HD (Horizontal Display Timing)及びVD (Vertical Display Timing)を示していますが、実際には不要であるため、信号は存在しません。その代わりにEHD (Embedded Horizontal Display Timing)及びEVD (Embedded Vertical Display Timing)を生成し、画面のブランキングを行っています。前稿の物理画面の中に論理画面が存在しますが、論理画面に対するディスプレイタイミングが、このEHD及びEVDとなります。


左矢前のブログ 次のブログ右矢

グラフィックメモリの設計

posted by sakurai on July 23, 2019 #133

ある目的があり、グラフィックメモリシステムの設計を再度行います。前回設計しているので、パラメータを少々変更するだけで簡単にできそうな気がします。

さて、設計仕様は、昔の8bit PCのVGAをエミュレートするものです。640dotx200dotのRGB各1bitの8色という仕様ですが、横に対して縦のドット数が小さいですね。VGAタイミングのサイトだと640x400というものはあっても、640x200というサイズはありません。

画面が横長に歪であることには理由があり、アドレス空間が16bitであることが関係していると思われます。640x400にすると、RGB各1bit(2^3=8色)だと、メモリに対して8bitアクセスの場合、96,000アドレスとなり、アドレスラインは17bit必要となり、通常の8bitマイコンの16bitアドレス空間として1bit足りません。しかたなく解像度を半分の640x200にすれば、3原色で48,000アドレスとなり、アドレスラインは16bit空間に入ります。

先のFIFOを用いたデザインを再利用して、タイミングだけを変更しようとしたのですが、再検討ついでにFIFOが削除できたので、そのデザインを再利用します。これだと計算が簡単で、dual port memoryで分離されている非同期クロックドメインであるため、ビデオ系のタイミングしか検討する必要がありません。

図%%.1
図133.1 グラフィックタイミング設計用ブロック図

画面構成が640x200なので、それに基づき前回と同じSVGA(800x600)のタイミングで設計することにします。

Space Invadersの画面設計を示します。左が論理画面、右が物理画面です。SVGAの物理画面の中央に論理画面を配置し、適宜拡大します。論理画面が256x256と小さいので、縦横2倍の拡大表示を行います。

図%%.2
図133.2 Space Invadersグラフィックタイミング設計図
次に今回の画面設計を示します。SVGAの物理画面のタイミングは同じで、論理画面のサイズが異なり、縦のみ2倍の拡大表示を行います。
図%%.3
図133.3 今回のグラフィックタイミング設計図

左矢前のブログ 次のブログ右矢

posted by sakurai on July 22, 2019 #132

前稿で設計したグラフィックディスプレイコントローラですが、あとから振り返るとFIFOが無駄であることに気づきました。早速リファクタリングします。

リファクタリング前のクロックドメインが3つあるのに比べて、リファクタリング後は2つに減っています。それだけでなく、FIFOとメモリをリードしてFIFOに入れる回路の2つを削減しています。これはdual port memoryが本来FIFOの役割を果たすためです。

図%%.1
図132.1 リファクタリング前の回路

図%%.2
図132.2 リファクタリング後の回路

FIFOとメモリ読み出し回路を削減し、メモリ読み出し回路から出ていたメモリアドレスをグラフィックコントローラから出す変更により、問題なくリファクタリングが達成できました。


左矢前のブログ 次のブログ右矢

posted by sakurai on July 13, 2019 #129

FPGAの設計トライアルとしてスペースインベーダを取り上げたブログ記事を書いてきましたが、最初はAvnetのMicroZedボードで、PMOD-VGAとPMOD-I2Sのインタフェースを購入して、入力はボード上のスイッチを使用していました。

開発がほぼ完了した段階で、AvnetからUltra96 ボードが発売されたので、さっそく購入し移植しようとしましたが、Ultra96はPMODインタフェースを搭載していないため、インタフェースボードを設計せざるを得なくなりました。

そのため、Eagleを使用して、PCBを設計し、さらに格安でPCBを製造するベンダを探しました。中国から送られてきたボードに部品を実装し、ジョイスティックを作成し、ゲームを動作させることができました。

この経緯をQiitaに投稿しました。

図%%.1
図129.1 Qiitaの投稿記事

合わせてYouTubeにも上げています。


左矢前のブログ 次のブログ右矢

posted by sakurai on January 16, 2019 #79

デジタル的に出力すればOKのグラフィック系と異なり、アナログであるオーディオ系は正しく動作させるのに案外苦労が必要でした。これだけでなく、リアルタイム性やノイズ防止の考慮を含めるともっと大変でしょう。

出来上がったサウンド系階層のブロック図を図79.1に示します。これはソフトマクロで、中にステートマシン、サウンド格納用ROM、パラシリ変換ユニットから構成されます。

図79.1
図79.1 サウンド系階層ブロック図

基本的に左側のステートマシンが、外部から与えられた音色コードに従い、右上のサウンド格納用ROMから8bitPCM wave情報を読み出し、それを右下のパラシリ変換ユニットを用いてDAC用シリアルデータに変換します。

サウンドの難しい点は演奏終了以前に割込みが入ったらどうする等の、時間的な仕様を定義するところです。本来は同時発声チャネルを複数用意し、サウンドを重ね合わせれば良いはずですが、今回は優先順位表(図79.2)を作成し、優先度の高いサウンドが、演奏中の優先度の低いサウンド演奏を中断させる仕様としてみました。優先度の高いサウンドを待たせるとおかしくなるためです。例えばインベーダの移動音が、弾の発射音を中断させても違和感を感じます。マスキング効果を考えれば、重畳しなくても特に問題ないことが実験により判明しました。

図79.2
図79.2 サウンド優先順位表

左矢前のブログ 次のブログ右矢

posted by sakurai on January 6, 2019 #78

ここでアナログ波形をDSOで取得してみます。図78.1のような波形が取得されました。青がシリアルDACデータ、黄色がDACの出力のアナログ波形です。

図78.1
図78.1 DSOアナログ波形

一方で、サウンドデータをAudacityで開いてみると、図78.2のような低音の波形となっています。これはインベーダの進行音です。

図78.2
図78.2 Wave波形

シミュレーション波形やwaveデータ波形は図78.2のようであり、アナログ波形はこのようでなければならないはずなのですが、図78.1ではある閾値以上と以下で波形が折り返されているようです。ここで思いつくのがMSBが反転しているのではないかということです。ここまではwaveデータをそのままDACに入力すれば良いと思っていたので、データ構造を調べてみます。すると、以下の事がわかりました。

  • 8bitPCMデータは符号なし
  • 16bitPCMデータは符号付き

従って、パラシリ部で8bitから16bitへ伸長する際にLSBへのゼロ詰めだけではなく、符号なし⇒符号付き変換を実施しなければなりません。ハードウェアにMSBを反転する修正を加えたところ、図78.3のような正しいアナログ波形が得られました。

図78.3
図78.3 DSOアナログ波形

破裂音はロウパスフィルターが入っていないことだと考えていましたが、波形を見て一目瞭然、符号付き⇒符号なしの変換が抜けていたことが根本原因でした。これで音楽データであってもきれいに再生できるはずです。


左矢前のブログ 次のブログ右矢

posted by sakurai on December 28, 2018 #77

破裂音原因解析

シミュレーション波形を確認すると、アナログ波形がなんだか尖っています。アナログとデジタルの一致性が必要で、そのためにはサンプリング周波数の1/2以上の周波数をカットする必要があります(標本化定理)。

図77.1
図77.1 シミュレーション波形

周波数帯域を制限するには22.05KHz以上をカットするロウパスフィルターを入れる必要がありますが、まずDACチップのデータシートの参考回路図を確認します。

図77.2
図77.2 DACデータシート

図77.2のとおり、アナログ出力にRとCで構成されるロウパスフィルターが入っています。

次にそれがどのように実装されているかを、PMOD DACモジュールのデータシートで確認します。

図77.3
図77.3 PMOD DACモジュールデータシート

出力のロウパスフィルターが入っていないことがわかりました。 サンプリング周波数は44.1[KHz]であったので、ロウパスフィルターの時定数を決定します。 図77.2にCを求める式が書かれており、 $$ C=\frac{50+470}{4\pi\cdot 44.1\cdot 10^3\cdot 50\cdot 470}=40[nF]=0.04[\mu F] $$ となることから、アナログ出力に40nFのキャパシタ(0.04$\mu$Fのセラコン等)を挿入すれば良いことになります。


左矢前のブログ 次のブログ右矢

posted by sakurai on December 20, 2018 #76

データ変換

ROMに入れるデータをVivadoで読めるCOEフォーマットに変換します。以下はwaveの16進ダンプファイルをCOEのデータ部に変換するコマンドです。これにヘッダとトレーラを付ける修正を行いROMデータとします。

$ od -An -t x1 -v input.wav >output.coe

シミュレーション

詳細設計に基づきシミュレーションを実施し、波形を確認し、不具合を修正するというループに入ります。 Vivadoはアナログ波形も表示可能であり、シミュレーションでアナログ波形を確認します。

もちろん全体だけでなく、細かいクロック毎の動きを見ていきます。ステートマシンが期待通りのステート遷移をしているか、LRCLKとシリアルビットデータの並びはDAC仕様に合っているかなどを見ていきます。

図76.1
図76.1 シミュレーション波形

実験

FPGAにビットファイルをダウンロードし、実験します。STARTスイッチを押すと、それなりの音が出ますが、元のファイルをPCで再生した音と若干異なるようです。なにか破裂音が混ざっています。元の音はインベーダが破壊された時の音なので、破裂音が混ざっていても構いませんが、もし音楽だったら聴くに堪えないでしょう。


左矢前のブログ 次のブログ右矢


ページ: