VHDL を使用して、それぞれに 16 ビットを格納するいくつかのレジスタが必要です。VHDLには配列が組み込まれていることがわかりました。それを使用してiyの各要素に16ビットを格納したいので、VHDLがこの配列を実際のレジスタにマップするかどうかを知りたいですか?
4 に答える
配列は、他の変数や信号と同じです。動作を記述した場合、あるクロック ティックから別のクロック ティックまでの状態を記憶する必要があることを意味する場合、フリップフロップ (または条件が正しければメモリ ブロック) がシンセサイザーによって推論されます。
簡単に言うと、いいえです。配列型はレジスタにマップされません。
長い答え:
VHDL の配列型は、同じ型の要素のインデックス付きコレクションです。あなたの場合、おそらくレジスタバンクからの出力として配列を使用するでしょう。
たとえば、それぞれが 16 ビットを保持する 8 つのレジスタのバンクがあるとします。このバンクからの出力は、16 ビット ベクトルの配列 (サイズ 8) になります。このレジスタ バンクのコンポーネント宣言は次のようになります。
コンポーネントreg8x16 ポート( クロック: std_logic 内; リセット: std_logic 内。 有効化: std_logic で。 rout : out r_array(0~7) ); エンドコンポーネント;
rout
レジスタバンクからの登録済み出力の配列です。rout(0)
したがって、タイプのを使用して、バンクからレジスタ 0 の出力を逆参照できますstd_logic_vector(15 downto 0)
。
また、配列型をどこか (通常はパッケージ ファイル) で宣言することを忘れないでください。次のようになります。
type r_array is array (integer range <>) of std_logic_vector(15 downto 0);
この(integer range <>)
ステートメントは、配列インデックス範囲の一種のプレースホルダーです。後で配列タイプが使用されるときに入力されます (上記のコンポーネント宣言など)。
これがあなたの質問に答えているかどうかはわかりません。reg8x16 コンポーネントの作成方法の詳細については説明しません。基本的には、出力が型の 16 ビット レジスタを作成するだけですstd_logic_vector(15 downto 0);
(これを行う方法をオンラインで調べることができます...これは非常に基本的な VHDL です)。次に、これらのレジスタのうち 8 つをインスタンス化し、それらを という名前のコンポーネントに配置しますreg8x16
。
有効な範囲を持つ配列は、生成されたネットリストのワイヤにマップされます。これは明らかです。ハードウェアにはゲートとワイヤしか含まれていません。a(3 downto 0)(1 to 0) のようなものは、4x2 または 8 ビット サイズのワイヤになります。a(3)(1) のような個々のアクセスを、この 1 次元配列のインデックスにマップします。したがって、a(3)(1) は基本的に a(7) です。