理論グループのミーティングの報告

日時: 98/10/06
場所: 齋藤理一郎助教授教官室 西5-517

山岡は行列の積を行なうVHDLソースを説明し、沼さんはUPボードにおいてのVGA機能を扱うVHDLソースを説明した。

山岡

<行列の積>mult.vhd (component:fpmult.vhd ,fpadder3.vhd)

(ソース説明)
このプログラムは行列Aと行列Bの積Qを求めるものです。
まず、FPGA内部にA,B,Qを格納するための配列MA,MB,QQQを"array"によりそれぞれ作成する。 ここでは、すべてのprocessにおいてBL(0)='1'となれば初期化が行なわれるようになっている。初めのprocessでは行列Aを取り込む作業を行なう。まず、PCから行列要素の下位16ビットが送られ、これを取り込む。次に行列要素の上位16ビットが送られ、これを取り込み、この2つのデータを繋げて配列MAに格納する。これを行列のインデックスに合わせて行なっていく。BL(1)='1'という信号が送られてくると、ここで列の終りにきたと認識し、次の行に移行し、列の最初に戻る。BL(2)='1'という信号が送られてくると、ここで要素をすべて格納したと認識して次のprocessの行列Bを取り込む作業に移る。行列Bを取り込む作業もAと同様に行なう。
次のprocessではMA,MBから行列要素を取り出して積和を行ない、結果を配列QQQに格納する。 ここでは、浮動小数点数乗算器、加算器に代入する信号FA,FB,Qのタイミングを合わせなくてはならないので、ソースの改良を要するところである。
最後のprocessでは計算結果の格納された配列QQQを要素ごとにPCへ送ることを行なう。 ここでは、BL(3)='1'という信号が送られてくるたびに、要素の下位16ビット、上位16ビットをPCへ送り、これに合わせてQQQのインデックスも変化させる。

以上 山岡 98/10/06/14:30

<VGA出力>vga3.vhd

(ソース説明)
今回のVGA出力プログラムは、カウンタとif文の方法からステートマシンを使った方法にすることで、プログラムを簡単にわかりやすくした。

上の図より左側が垂直同期サイクル、右側が水平同期サイクルとなっている。
今回はカウンタをベクトルではなく整数にすることで何クロック目でタイミングが出るかをわかりやすくしている。
まず、スイッチを押すことで垂直同期モードにする。そして、ステート"VERT_SYNC"は上図のPの区間に対応しており、垂直同期信号が出力される。しばらくしてステート"HORIZ_WAIT"で垂直同期信号を戻し、Qの区間に対応。そして、R区間の水平同期サイクルへ移る。
その水平サイクルの準備として、"HORIZ_READY"に移り、そこで水平同期モードにする。そして、B区間で"HORIZ_SYNC"となり、水平同期信号を出力する。C区間"RGB_WAIT"でRGB信号の出力待ちを行ない、D区間"RGB_OUTPUT"でRGB信号の出力を行なう。
それから、E区間"HORIZ_END"で水平サイクルを終了させる。このサイクルの回数が480回になったら垂直同期モードにして、"VERT_END"で垂直サイクルを終了させる(区間S)。それ以下なら"HORIZ_READY"に戻り、水平サイクルをやり直す(画面では1行ずらす)。

以上 沼 98/10/06/16:20