19

私は何かをするのに問題があります

b(0 to 7) <= a(7 downto 0)

ghdl でコンパイルすると、順序エラーが発生します。回路を機能させるために私が見つけた唯一の方法は次のとおりです。

library ieee;
use ieee.std_logic_1164.all;
entity reverser is
    port(
        a: in std_logic_vector(7 downto 0);
        y: out std_logic_vector(7 downto 0);
        rev: in std_logic
        );
end reverser;

architecture rtl of reverser is
    signal b: std_logic_vector (7 downto 0);

begin

    b(7) <= a(0);
    b(6) <= a(1);
    b(5) <= a(2);
    b(4) <= a(3);
    b(3) <= a(4);
    b(2) <= a(5);
    b(1) <= a(6);
    b(0) <= a(7);

    y <= b when rev = '1' else a;

end rtl;

提案?前もって感謝します

4

6 に答える 6

29

これは許可されていません。VHDL は厳密に型指定されているため、ビット順序を逆にしたい場合は、明示的に行う必要があります。

標準的な解決策は、関数を使用することです (私はこれを書きませんでした - Jonathan Bromley が書きました):

function reverse_any_vector (a: in std_logic_vector)
return std_logic_vector is
  variable result: std_logic_vector(a'RANGE);
  alias aa: std_logic_vector(a'REVERSE_RANGE) is a;
begin
  for i in aa'RANGE loop
    result(i) := aa(i);
  end loop;
  return result;
end; -- function reverse_any_vector
于 2012-11-27T13:05:21.013 に答える
5

この問題にはいくつかの解決策があります。1 つの可能性は次のとおりです。

gen: for i in 0 to 7 generate
  y(i) <= a(i) when rev='0' else a(7-i);
end generate;
于 2014-01-05T20:42:50.443 に答える
4

質問は、具体的にどのように対処するかを尋ねますb(0 to 7) <= a(7 down 0)。理由はわかりませんが、この割り当てが機能する場合があり(スライスに関係なく左から右に割り当てます)、この割り当てがコンパイラエラーをスローする場合があります(スライスの不一致など)。

幸いなことに、スライスの不一致を処理するために関数を使用する必要はありません。この特定の問題でコンパイラ エラーが発生する場合は、generateループを使用して a を b に代入できます。

for i in a'range generate
   b(i) <= a(i)  
   --when i is 0, you assign a's right-most bit to b's left-most bit
end generate;

それは基本的にあなたの例と同じ展開された割り当てを行いますが、タイトでスケーラブルです。

割り当ての右側でスライスが一致しない場合にも、このパターンを使用しました。例えば:

signal a : std_logic_vector(0 to 7);
signal b : std_logic_vector(7 downto 0);
signal c : std_logic_vector(0 to 7);

...

for i in a'range generate
   c(i) <= a(i) xor b(i);
end generate;

これは次と同等です:

c(0) <= a(0) xor b(0);
c(1) <= a(1) xor b(1);
c(2) <= a(2) xor b(2);
c(3) <= a(3) xor b(3);
c(4) <= a(4) xor b(4);
c(5) <= a(5) xor b(5);
c(6) <= a(6) xor b(6);
c(7) <= a(7) xor b(7);
于 2013-10-04T01:32:06.610 に答える
2

本当に反転:

for i in 0 to intermediate_data'left loop

  inverted_vector(i) <= intermediate_data(intermediate_data'left - i);

end loop;
于 2016-10-18T11:07:07.183 に答える