[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
虫取りも見える化
printfで表示した値とにらめっこしていないだろうか??
値を見るよりもっと分かりやすい方法があります。
それはグラフにすることです。
ソフトとハードでの誤差をパーセント表記にしたものです。正直、ModelSIMの値だけ見てたら、
正しい値返って来た!とうぬぼれていました。
しかし、こうしてグラフにしてみると
これはひどい!としか言いようがありませんな
おそらく前段のモジュールでバグが発生しているのでしょう。
ここで僕の出来ることは・・・
まずソフトで中間値含めて全ての値を表にする。そしてハードで計算した値の差分をとって表にする。ぐらいでしょうか??さすがにこんなに誤差があると論文に書けないなぁ・・
Excelのテンプレートを作るのは大変だが、確実に研究を進めるためです。
それとプレゼンするときも表ではなくてグラフを見せたほうが分かりやすいですね。
データはどうなっているのか?と聞かれたときに
初めて表を見せるくらいでいいのではないでしょうか?
simple is the best
テストベンチのデータトレース表をExcelで書いたら、
ExcelのデータのデバッグのためにVisualC++で検算しなければならない羽目になりました。
要はModelSIMの値の確認→Excelの表を見る →??
→VHDLのソース確認、電卓で手計算→??→大元であるCのソースを走らせる→型が違う
→Excelに与えるている値は間違い
みたいなことが起こり、デバッグの手間が増えるだけなんです。
開発の手間っていうのは、開発規模の2乗で利いてくる気がしますな
だから構成は出来ることなら、とことんシンプルにした方がいいです。
妥協したり、切ったりする勇気が時には必要だということです。
共通の設定はどんどんヘッダーに書き出して、ソースの構造はとことん階層化して、
最下層にちょこっとだけ機能を記述する方が
ソースを書き換えるときに最小限の労力で済みます。
16進数は電卓では64bit、VisialC++では32bitまでしか扱えないっぽいですな
おーばーふろ~
ファイルへの入出力
テストベンチの際に、ファイルへ任意の値を入出力するやり方
1.まず、use ieee.std_logic_textio.all; と、use std.textio.all; を宣言。
2.ファイル型を定義
file read_file text open read_mode is "input.txt"; --入力ファイル
file write_file text open write_mode is "output.txt" --出力ファイル
3.入力ファイルから値の読み出し(値は2進数)
variable read_line : line; --変数のライン型を定義
variable read_value : std_logic_vector();
readline(read_file,read_line); --ファイルの一行を読み出し
read(read_line,read_value); --行中の値を読み出し(信号ではなく変数)
hoge <= read_value; --信号に代入して、後は煮るなり焼くなり
4.出力ファイルへの書き出し
variable write_line : line;
variable write_value : std_logic_vector(); --signalでもok!
write(write_line,write_value,right,10); --10の文字幅で値を行に右詰め格納(値は信号可)
writeline(write_file,write_line); --行をファイルに書き出し
5.バリエーション
oread(); owrite(); --read,writeの8進数ver. bit数は3の倍数
hread(); hwrite(); --read,writeの16進数ver. bit数は4の倍数
条件に満たない場合は適当に&で連結して任意の倍数bit長にしましょう。
--追記
16進数をファイルからreadする場合は
型の大きさより小さい数は、空白を0で埋めなきゃ駄目ですね。
Excelでもそうですしファイル読み取り全般に言えることらしいです。
PCケースを買いに
PCケースをギラギラにしたいと思い、秋葉原まで買いに行きました。
そこで目的のケースを入手しました。
家に帰って早速マザーボードを入れ替え、組み立て、
いざ!起動してみたのですが、、、
PCが立ち上がらない。ファンだけが虚しく回ります。
こういう場合は、起動しない原因が、マザーボードのあるのか、
メモリにあるのか、ドライブにあるのか分からないので最小構成で起動してみます。
最小構成とは、、、
CPU、マザーボード、メモリ一本だけ(場合によってはグラボも)です!
これに電源とディスプレイ繋げば裸でもPCは立ち上がります。
しかし、最小構成にしてもBIOSすら起動しません。
ファンが一定時間回って止まります。
そこで最終手段!BIOS初期化。
ジャンパーピンを短絡させることで、BIOSを初期化させるのです!
しかし、それでも起動しませんでした。
ご愁傷様です。
外は雨、今日も学校へ行ったのですが、あのマザーボードのことが頭から離れません。
PCのない部屋というものは何とも落ち着かないものです。
てか、新しいマザーボードを買わなきゃならんのか・・・
惜別の前に、最後にもう一度だけジャンパーキャップを被せて
電源を入れてみることにしました。そしたら、、、
な、な、なんと!PCがプーとか言って画面が表示されたではありませんか!
こいつ動くぞ。
ってなわけで、その後は今までの苦労がウソの様にサクサク進み、
ギラギラした悪趣味のPCが出来上がりましたとさ。
ウフフフフー
FIFOもどきを作る
そこでFIFOのソースを探してみたら、何やらFullFlagやらEmptyFlagやら難しい機能がやたら目に付きました。単に信号を遅延させるだけでいいのに・・・。
1.シフトレジスタで代用
IPでもいいのですがgeneric文で汎用性の高い部品を作りたかったので、自分でソースを書くことにしました。とりあえず、ROMやRAMのソースをベースにして作るということでarray文にも挑戦してみたのですが、なかなか上手くいかず・・・
結局2次元配列なんてかっこいいことは出来ずに、複数ビット分だけシフトするシフトレジスタでFIFOの機能を実現することにしました。要はデータ×レイテンシの幅のシフトレジスタを作るわけです。
記述がかなりシンプルで済みました。動作速度800MHz
ん?何か間違っているんじゃないか??
それに、実用的な機能を再現するだけでも恐ろしい幅になってしまいます。
32bit×50レイテンシ=1600bit
怖い怖い。
2.BRAMを使用
メモリにスライスを割り当てると案の定回路がものすごく大きくなってしまったので、FPGAに搭載されているBRAMを使用することにしました。既存のRAM回路からアドレス関係のI/Oを取り除き、内部にアドレス指定のカウンタを取り付けることでそれっぽく動作させました。メモリ関係のソースはこちらのページが参考になります。
http://www.nahitech.com/nahitafu/fpgavhdl/bram/bram.html