忍者ブログ

[PR]

2025年04月26日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

coregen_lock

2008年12月08日
IPコア生成中に取り消した後に、再度生成するとcoregen_lockなるエラーが出て
実行できないときがあります。
そういうときはディレクトリ内のcoregen_lockというファイルをそのまま削除しましょう。
あんまりいい対処法とは言えないですが、現時点ではこうするしかないので。
何か良い方法が見つかったら追記します。
PR

Kirisute Gomen

2008年12月07日
【浮動小数点数に関して】
精度という単語が出てくる計算では必ず浮動小数点数を使わなければなりません。
固定小数点数でも良いけど、浮動小数点数の方が範囲広いし誤差も少ないやんというのではなく、
浮動小数点数を使わなければダメ、絶対というレベルです。

浮動小数点数には、
倍精度(double、仮数部52bit、有効桁数15桁)と、
単精度(float、仮数部24bit、有効桁数6桁)があります。(四倍精度とかもあるが割愛)

 doubleの仮数部は52bitだから固定小数点数でも52bit保てればdoubleと同等の精度を保てるやん!といった考えもありますが、doubleでどれだけ計算しても15桁の精度を保障できるのは、bit数が大きいからではなく正規化しているからです。また正規化している数のことを浮動小数点数と言います。固定小数点数(というかここで言う固定小数点数の小数点という概念は外から勝手に与えているだけなので、計算自体は実質intと一緒)で調子に乗って下位ビット切ってると小さい数は無視されます。故に固定小数点数では精度が保障されません。というか精度という概念が無いですね。これは出力値が正しいか分からないことを意味します。 固定小数点数の52bit=doubleと同等ではないのです。故に固定小数点数の下位ビット切りは、浮動小数点数のそれとは同等ではありません。

 intは32bitだから232=10桁くらいの精度!という考えもあるかも知れません。32bitフルに使っているならそのくらいの精度でしょう。32bitフルに使っている値で乗算をしたときも、結果の下位ビットを切っても32bit精度です。しかしそれはintにおける32bitフル=正規化していると同等な状態だからです。しかし32bitをフルに使っていない場合、数の大きさが小さいほど正しい数からかけ離れていきます。最悪無視されます。

こういう考え方で合ってるんでしょうかね~??

、、、と言う訳で
これから、大幅な仕様変更を行います

それぞれの用途
固定小数点数
値がそんなに正しくなくて良いもの。最終的な出力を確認するのが人間の目や耳なもの。
音楽やら映像やら。情報落ちが起こらない。

浮動小数点数
科学技術計算。情報落ちが起こる。
大きい値と小さい値を計算したとき、相対的に小さい値が仮数部からアンダーフロー。

wikipediaを見てみると浮動でも誤差の問題がついて回るようでどっちが正しいか分かりませんな。

subprogram宣言を使ってみた

2008年11月30日
同じ文を何度も書くと、関数にしたくなります。
そこでsubprogram宣言に挑戦してみました。これを使うと、
-----------------------------------------------------
ARCHITECTURE behavior OF hoge IS 

 function func_hoge(以下略...)
 end func_hoge;
 
 signal A,B,x,y : std_logic;

begin

 A := func_hoge(x);
 B:= func_hoge(y);

end hoge;
-------------------------------------------------------
みたいな感じで書けます。
コンポーネントとどこが違うんだ?と思いますよね。
ファンクション文は出力が一個だけで、それこそC言語の関数みたいですが、
プローシージャ文は入出力を任意に設定でき、それこそコンポーネントと大差無い様に見えます。

サブプログラムとコンポーネントの違いは、コンポーネントが下位層にある全く別の回路(別ファイル)を繋げて階層化するのに対して、サブプログラムの場合、機能自体を信号やコンポーネントのI/Oを定義するアーキテクチャ宣言部に書いてしまうので、一つ回路内で完結しているということです。
よって、C言語と違って関数を別ファイルにすることが出来ません。
従って、一つのソース内で何度も使用するが階層化するほどでもない、
小さい処理を関数にしたいときにサブプログラムを使うと良さそうです。


--追記、サブプログラム宣言の入出力は、信号か変数しかとらないそうです。
fprintfみたいな関数を作ろうとしていたが残念。
ファイル入出力用の便利なパッケージを作りたいです。
てかサブプログラムに出力がある必然性を感じられない。void型みたいなのがあればいいのに、
ファイル入出力ぐらいしか需要がなさそうだが。

----まとめ----
ファンクション 戻り値一個の組み合わせ回路
プロシージャー 戻り値複数の組み合わせ回路
コンポーネント 順序回路
綺麗にまとまった!

2008年11月30日
16進数をファイル出力するときは unsigned intでキャスト
0フラグ使って余白は0で埋める。%08xで32bitの16進数になるはず?
pow関数は全部doubleなので使うときは、数値の後ろに.0をつける。

というか、VisualC++の16進数はunsigned int(32bit)しか出力されないようです。
不便ですな。

構造改革

2008年11月29日
ISEのSourceウィンドウでは、ファイル同士が自分の意図しない形でツリーを形成してしまう時があります。

1.コンポーネントでIPをぶら下げている場合
 どうもVHDL、verilog、xcoの優先順位で認識されるようです。
 IPを生成すると、目的のxcoファイル以外にもVHDL、verilogが生成されます。
 VHDLがぶら下がっていて、xcoが外に追いやられている場合は、
 そのVHDLファイルを右クリックしてremoveしましょう。
 そうするとxcoがそこにぶら下がります。
 removeしたファイルはSourceウィンドウからは消えますが、
 ファイル自体が消えたわけではなくディレクトリ内に存在しているのでご安心を。

2.階層設計にしても、目的のファイルが収まらず「?」と表示される。
 上位モジュールと、下位モジュールのport名、ファイル名は一致してるでしょうか?
 一致していてもツリーにならないときがあります。原因不明です。
 こういう場合は、その下位モジュールをコピー、ファイル削除して一から新しくファイルを
 作るとツリー構造になるときがあります。
 それでも駄目な時はコメントアウトしたり、Set as Top Moduleを変えたり・・・

3.ヘッダーファイルがぶら下がらない!
 全てのファイルにSet as Top Moduleを適用してみましょう。
 するとSet as Top Moduleを外した時に何故かヘッダーファイルが出現します(笑)

4.新規作成したのに、Sourceウィンドウに表示されない。
 ビヘイビアシミュレーションの方には載っているでしょうか?だとしたら、そのファイルを一旦removeしてproject>add copy of sourceで再び貼り付けると復活します。