2017-12-05 4 views
0

私は生成の内部の整数からバイナリstd_logic_vectorを取得したいと思います。 > 1111VHDL:ブロックを生成するイテレータをstd_logic_vectorに変換するにはどうすればいいですか?

-

例えば、

0 - > 0000

1 - > 0001

2 - > 0010

...

15私は各整数に対して16個のif-else文を書くことができましたが、私はこの考え方が気に入らないのです。 (私は16の整数よりもはるかに多くを持っているかどうか?)

私は2つのメソッドを使用しようとしたが、それらのどちらも動作します: アドレスとヒットは両方STD_LOGIC_VECTORまた

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

G_2 : for i in 0 to 15 generate 
    address <= std_logic_vector(to_unsigned(i, 4)) when hit(i) = '1'; 
end generate G_2; 

ある私は気づきました私がiの代わりに数字を使うと、それは機能します。 (例:conv_std_logic_vector(5、4)を使用すると "0101"になります)

私は間違っていますか? vhdlを使ってそれを行う方法はありますか?

答えて

2

まず、use ieee.std_logic_arith.allを入力しないでください。代わりに、use ieee.numeric_std.all、そしてどんな厄介なものも取り除いてください。conv_integer;好ましいスタイルはunsignedのような型を使用し、次に2番目のコード例のように変換またはキャストします。これは、フォームの16行を生成します

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

あなたのループに移る、あなたがgenerateループを使用している

address <= conv_std_logic_vector(0, 4) when hit(0) = '1'; 
address <= conv_std_logic_vector(1, 4) when hit(1) = '1'; 
address <= conv_std_logic_vector(2, 4) when hit(2) = '1'; 

など各同時割当てが独自のプロセスを推測しているので、デザインにはaddressシグナル上に複数のドライバがありますが、これは合成適格デザインでは許可されていません。

hitベクターの最下位セット('1')ビットに従ってaddressを設定することが目的のようです。これをプライオリティエンコーダと呼びます。このような何かが良いだろう。

process (hit) 
begin 
    for i in 0 to 15 loop 
    address <= (others => '0'); -- Default assignment, any later assignment takes priority 
    if (hit(i) = '1') then 
     address <= std_logic_vector(to_unsigned(i, address`length)); 
     exit; 
    end if; 
    end loop; 
end process; 

符号なしの数を表しているようだaddressので、あなたはこの信号用のタイプunsignedを使用し、型キャストを救うことができます。

+0

ありがとうございました!それはかなりうまくいく) –

+0

VHDL 2008以降を使用している場合は、 'unsigned'の代わりに' u_unsigned'(未解決)を使用することもできます(解決済み)。この方法では、複数のドライブ状況でエラーが発生します。 –

関連する問題