web-dev-qa-db-ja.com

VHDLのビット順序を逆にする

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

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;

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

19
titockmente

これは許可されていません-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
24
Martin Thompson

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

gen: for i in 0 to 7 generate
  y(i) <= a(i) when rev='0' else a(7-i);
end generate;
4
VAP

この質問では、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);
3
Matt Dallmeyer

本当に反転:

for i in 0 to intermediate_data'left loop

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

end loop;
2
menniwick

提案?

あなたの例は固定長を指定しているので:

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;

    y <= a(0)&a(1)&a(2)&a(3)&a(4)&a(5)&a(6)&a(7) when rev = '1' else a;

end rtl;

これは、関数呼び出しやループステートメントよりもオーバーヘッドが少ないという理論です。

0
user1155120