VHDLのstd_logic_vectorとloopの変換
結論から書きます。この記事を書くことになった経緯や思いは後半部分に書こうと思います。
loop 変数からstd_logic_vectorの変換方法
一度、unsignedに直して、std_logic_vectorに入れる。 ghdlでコンパイルしました。 断片的にコードを書き写すのが難しい言語なので、簡単な加算器のテストベンチを貼ります。
library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity ADDER_2BIT_TEST is end ADDER_2BIT_TEST; architecture RTL of ADDER_2BIT_TEST is component ADDER_2BIT port(A,B: in std_logic_vector(1 downto 0); S: out std_logic_vector(1 downto 0); OVERFLOW: out std_logic); end component; constant STEP: Time := 100 ns; signal A,B,S: std_logic_vector(1 downto 0); signal OVERFLOW: std_logic; begin U0: ADDER_2BIT port map(A,B,S,OVERFLOW); process begin for I in 0 to 3 loop for J in 0 to 3 loop A <= std_logic_vector(to_unsigned(I,2)); B <= std_logic_vector(to_unsigned(J,2)); wait for STEP; end loop; end loop; wait; end process; end RTL;
このprocess文のところ。unsignedに直して、std_logic_vectorに直すとイける。 adaの型変換の話がまだ掴めていないのでなんとも言えないです。 強い静的型付け言語感をひしひしと感じています。オブジェクト指向らしいのですが、std_logic_vector()がキャストで、to_unsignedでunsignedのオブジェクトを生成してるらしいです。unsignedがわかって、その後std_logic_vector(unsigned(I,2))ってコンストラクタっぽく使ってたらずっとエラー出てました。 vhdl std_logic_vector loop で検索してたらあんまいい情報が出なくて、これ書いてる途中に std_logic_vector unsignedで検索したら一発だった...さっきの猛烈に検索してた時間はなんだったのか...
まぁ、新しいこと学べたのでよしとします。
経緯
学校でVHDLをやっていまして、これからFPGAのボード触るらしいです。個人的に前からFPGAは調べてた割には、環境が統一、一貫されてなさすぎて、調べて終わりみたいな感じになってたので嬉しいです。最初の方でコリコリ書いてたら少し面白みが出てきてしまったので、やる気がモリモリなのです。
教科書もなかなかわかりやすいと思っています。誤字は少し多いですけど。後、v08に対応してないみたいですね。これを調べたそもそものきっかけがuse ieee.std_logic_arith.all;だったせいなんですよね。ghdlのライブラリに標準的に備わってなくて悲しかったです。わかりやすいと思うんだけどなぁ。残念。CPU周りは面白いので、これを機にadaとヘネパタよく読みたいですね。 CPU作りたみが深いですね。4 bitのCPUの作りかたの本はだいぶ有名なので、そっちを先に読もうかな。まぁ結果はともかく色々触ってみたいですね。
ところで、カテゴリーを追加してみました。目的は毎日の変化(成長)だけども目標はそれぞれのカテゴリーで50項目ぐらい作りたいです。1 週間にそれぞれ 1 記事書けば50週...w まぁそんな冗談は置いといて、地道にやっていきたいですね。やっとやりたいことができるモチベーションになってきたのに、時間がないんですよね。これが人生というものなのでしょうか。少しずつでもやっていきたいです(強い意志)