[PR]
2025年04月25日
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
genatate文
2008年12月19日
genericではありません。generate(生成)です。
if-genarate文で条件に合ったときのみインスタンスを生成したり、for-generate文で量産したいときに使います。IPとかパラメータの融通が利かないモジュールに対して、
if-generaateの条件が合ったらこっちのIPを、違う条件だったらそっちのIPを生成するみたいに使ってます。これ使わないと融通の利かないIPのせいで、上位モジュールもパラメータを廃して別モジュールとして作らなきゃならないんで非常にめんどくさい!
<ラベル>:<モジュール名><(パラメータ)>とすると
IPにはパラメータを渡せないので、これは無理です
別々にIPを作ると
上位モジュールも変えねばならんというわけです 。
一からモジュールを作るのは手間だし、パラメータ部分以外は全部同じなので非常に歯がゆい!
そこでgenerate文を使えば、パラメータに応じて
どっちかのIPを生成してくれます。
if-genarate文で条件に合ったときのみインスタンスを生成したり、for-generate文で量産したいときに使います。IPとかパラメータの融通が利かないモジュールに対して、
if-generaateの条件が合ったらこっちのIPを、違う条件だったらそっちのIPを生成するみたいに使ってます。これ使わないと融通の利かないIPのせいで、上位モジュールもパラメータを廃して別モジュールとして作らなきゃならないんで非常にめんどくさい!
<ラベル>:<モジュール名><(パラメータ)>とすると
IPにはパラメータを渡せないので、これは無理です
A0:module(10) ↓ B0:ip(10) |
A1:module(12) ↓ B1:ip(12) |
A0:module(10) ↓ B0:ip_0 |
A1:module(12) ↓ B1:ip_1 |
一からモジュールを作るのは手間だし、パラメータ部分以外は全部同じなので非常に歯がゆい!
A0:module_0 ↓ B0:ip_0 |
A1:module_1 ↓ B1:ip_1 |
そこでgenerate文を使えば、パラメータに応じて
どっちかのIPを生成してくれます。
A0:module(10) ↓ if(10)generate B0:ip_0 end generate if(12)generate B1:ip_1 end generate |
A1:module(12) ↓ if(10)generate B0:ip_0 end generate if(12)generate B1:ip_1 end generate |
PR
std_logic_vectorとinteger
2008年12月19日
両者の型は違う言語なんじゃないかと思うほど書式が違います。
なので、簡単まとめておきます。
なので、簡単まとめておきます。
std_logic_vector | integer | |
初期化 | <=(others=>'0') | <= 0 |
値の扱い | ダブルクオート("")で囲んだバイナリ列 | 単に整数 |
信号定義 | std_logic_vector(WIDTH-1 downto 0) | integer range 0 to WIDTH-1 |
package宣言におけるsubprogram
2008年12月18日
今までヘッダーと呼んできましたが、VHDLでは正しくはパッケージと言います。
でも実質ヘッダーです。
subprogramはパッケージに書き出してこそ真価を発揮しますが、
これがちょいめんどくさい。
subuprogramにはsubprogram宣言とsubprogram本体があり、
ソースに直接書き込む場合は、componentやらsignalやらを定義する領域にsubprogram本体を書くことで、アーキテクチャ本文中で呼び出して使えるようになります。
しかし、出来ることならパッケージに書いといていつでもどこでも呼び出したいし、変更があっても簡単に済ませたいですよね?そこでパッケージに書くのですが、パッケージにはpackage宣言の領域と、package_body文の領域があります。コンポーネント、定数、type宣言といった大概の宣言はpackage宣言に書けばいいですが、subprogram本体だけはpackage_boby文の中に書きます。package_body文というのはいわばsubprobram本体専用の領域なのです。
でもそれだけでは実行できません。関数の機能を記述する前には関数の名前と入出力を宣言をしないといけないのは世の常ですね。そこでsubprogram宣言の出番です。subprogram本体の入出力だけを切り出しただけです。こいつをpackage宣言に記述してやります(本体ではないですよ)。
こうして初めてサブプログラム呼び出しの恩恵を受けることが出来ます。
でも実質ヘッダーです。
subprogramはパッケージに書き出してこそ真価を発揮しますが、
これがちょいめんどくさい。
subuprogramにはsubprogram宣言とsubprogram本体があり、
ソースに直接書き込む場合は、componentやらsignalやらを定義する領域にsubprogram本体を書くことで、アーキテクチャ本文中で呼び出して使えるようになります。
しかし、出来ることならパッケージに書いといていつでもどこでも呼び出したいし、変更があっても簡単に済ませたいですよね?そこでパッケージに書くのですが、パッケージにはpackage宣言の領域と、package_body文の領域があります。コンポーネント、定数、type宣言といった大概の宣言はpackage宣言に書けばいいですが、subprogram本体だけはpackage_boby文の中に書きます。package_body文というのはいわばsubprobram本体専用の領域なのです。
でもそれだけでは実行できません。関数の機能を記述する前には関数の名前と入出力を宣言をしないといけないのは世の常ですね。そこでsubprogram宣言の出番です。subprogram本体の入出力だけを切り出しただけです。こいつをpackage宣言に記述してやります(本体ではないですよ)。
こうして初めてサブプログラム呼び出しの恩恵を受けることが出来ます。
real型を使ってみた
2008年12月18日
どんどんマニアックな方向に進んでいきます(笑)
浮動小数点数化に伴い、整数から浮動小数点数に変換するIPだとか、
浮動小数点数の乗算をするIPだとかを使用しています。
計算の過程で定数を乗ずる必要があるので、これどうしようか?と悩んでいます。
単にSTD_LOGIC_VECTORならビットシフトとか駆使してどうにでもなるんですが、
これはIEEE754で規格化された倍精度演算です。
単純にビットシフトとかで解決する問題でもないんですよ。
で、本やらネットやらを駆使して、
実数を定数として扱う場合について、要はreal型について調べるんですが、
流石マニアックなreal型
な に も の っ て な い ! ! !
ふー
どうしようもないんで自己流で書いてみました。
constant SIX : real :=6.0;
何故かこれで論理合成パスしました。でも本当に正しいか分かりません。
恐らく内部的には"00011100.....000110"みたいになってるんじゃないですかね?(適当)
ちなみに数字の後ろに「.0」を付けることがポイントです!
これで浮動小数点数として認識されます。つけないと怒られます。
ここら辺はC言語とかと同じですな。
というか、そもそもこのreal型は倍精度なのか単精度なのかも分かりません。
あーだめだ。IPがSTD_LOGIC_VECTORだからrealだとはじかれる。
ここはパワーで解くしかありませんな
6.0を正規化すると
6.0=110=0.11×23
符号部0
指数部00000000011
仮数部1100..(50個ゼロが続く)
よって3C000000000000なり!
STD_LOGIC_VECTORで定義するとバイナリを全部書かなければならず、
面倒なのでintegerからコンバートか?
あぁ、そういえばintegerは32bitだった・・・
浮動小数点数化に伴い、整数から浮動小数点数に変換するIPだとか、
浮動小数点数の乗算をするIPだとかを使用しています。
計算の過程で定数を乗ずる必要があるので、これどうしようか?と悩んでいます。
単にSTD_LOGIC_VECTORならビットシフトとか駆使してどうにでもなるんですが、
これはIEEE754で規格化された倍精度演算です。
単純にビットシフトとかで解決する問題でもないんですよ。
で、本やらネットやらを駆使して、
実数を定数として扱う場合について、要はreal型について調べるんですが、
流石マニアックなreal型
な に も の っ て な い ! ! !
ふー
どうしようもないんで自己流で書いてみました。
constant SIX : real :=6.0;
何故かこれで論理合成パスしました。でも本当に正しいか分かりません。
恐らく内部的には"00011100.....000110"みたいになってるんじゃないですかね?(適当)
ちなみに数字の後ろに「.0」を付けることがポイントです!
これで浮動小数点数として認識されます。つけないと怒られます。
ここら辺はC言語とかと同じですな。
というか、そもそもこのreal型は倍精度なのか単精度なのかも分かりません。
あーだめだ。IPがSTD_LOGIC_VECTORだからrealだとはじかれる。
ここはパワーで解くしかありませんな
6.0を正規化すると
6.0=110=0.11×23
符号部0
指数部00000000011
仮数部1100..(50個ゼロが続く)
よって3C000000000000なり!
STD_LOGIC_VECTORで定義するとバイナリを全部書かなければならず、
面倒なのでintegerからコンバートか?
あぁ、そういえばintegerは32bitだった・・・
属性
2008年12月08日
再利用可能な部品を作るにはcomponent宣言、subproglam宣言、generic文だけではなく、
attribute(属性)の考え方が必要です。何も難しいことは無く、
signal A : STD_LOGIC_VECTOR(7 downto 0);と定義した場合。
A'left --Aのdowntoの左側の7を返す。
A'right --Aのdowntoの右側の0を返す。
A'length --Aのビット幅である8を返す。
といった具合です。前述のsubproglam宣言と組み合わせた関数を作ってみました。
どんなビット幅のデータが入っても40bitにしてくれる関数です。Excel用です。
難しいことは無く、40bit以下のデータに0か1を付加して拡張しているだけです。
--追記:40bit以上のデータも対応しました。
--追記:40の部分をパラメータ化すればもっと汎用性の高い部品になりますね
function BITCHANGER(din : STD_LOGIC_VECTOR)
return STD_LOGIC_VECTOR is
variable dout : STD_LOGIC_VECTOR(40-1 downto 0);
variable all_zero : STD_LOGiC_VECTOR(40- din'length-1 downto 0):=(others=>'0');
variable all_one : STD_LOGiC_VECTOR(40- din'length-1 downto 0):=(others=>'1');
begin
if(din'length > 40)then
dout := din(40-1 downto 0);
else
if(din(din'high)= '0')then
dout:=(all_zero&din);
elsif(din(din'high)= '1')then
dout:=(all_one&din);
else
null;
end if;
end if;
return dout;
end BITCHANGER;
attribute(属性)の考え方が必要です。何も難しいことは無く、
signal A : STD_LOGIC_VECTOR(7 downto 0);と定義した場合。
A'left --Aのdowntoの左側の7を返す。
A'right --Aのdowntoの右側の0を返す。
A'length --Aのビット幅である8を返す。
といった具合です。前述のsubproglam宣言と組み合わせた関数を作ってみました。
どんなビット幅のデータが入っても40bitにしてくれる関数です。Excel用です。
難しいことは無く、40bit以下のデータに0か1を付加して拡張しているだけです。
--追記:40bit以上のデータも対応しました。
--追記:40の部分をパラメータ化すればもっと汎用性の高い部品になりますね
function BITCHANGER(din : STD_LOGIC_VECTOR)
return STD_LOGIC_VECTOR is
variable dout : STD_LOGIC_VECTOR(40-1 downto 0);
variable all_zero : STD_LOGiC_VECTOR(40- din'length-1 downto 0):=(others=>'0');
variable all_one : STD_LOGiC_VECTOR(40- din'length-1 downto 0):=(others=>'1');
begin
if(din'length > 40)then
dout := din(40-1 downto 0);
else
if(din(din'high)= '0')then
dout:=(all_zero&din);
elsif(din(din'high)= '1')then
dout:=(all_one&din);
else
null;
end if;
end if;
return dout;
end BITCHANGER;