私は何かをするのに問題があります
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;
提案?前もって感謝します
これは許可されていません-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
この問題にはいくつかの解決策があります。 1つの可能性は次のとおりです。
gen: for i in 0 to 7 generate
y(i) <= a(i) when rev='0' else a(7-i);
end generate;
この質問では、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);
本当に反転:
for i in 0 to intermediate_data'left loop
inverted_vector(i) <= intermediate_data(intermediate_data'left - i);
end loop;
提案?
あなたの例は固定長を指定しているので:
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;
これは、関数呼び出しやループステートメントよりもオーバーヘッドが少ないという理論です。