我在做
这样的事情时遇到了麻烦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;
连连呢? 提前致谢
答案 0 :(得分:24)
这是不允许的 - VHDL是如此强大的类型,如果你想要反转位顺序,你必须明确地做。
标准解决方案是使用一个函数(我没有写这个 - Jonathan Bromley did):
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 :(得分:4)
这个问题有几种解决方案。一种可能性如下:
gen: for i in 0 to 7 generate
y(i) <= a(i) when rev='0' else a(7-i);
end generate;
答案 2 :(得分:3)
该问题询问如何专门处理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 :(得分:2)
真的反过来说:
for i in 0 to intermediate_data'left loop
inverted_vector(i) <= intermediate_data(intermediate_data'left - i);
end loop;
答案 4 :(得分:0)
建议?
因为您的示例指定了固定长度:
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;
理论上说这应该比函数调用或循环语句更少开销。
答案 5 :(得分:-6)
OUT_PUT(7 DOWNTO 0)&lt; = IN_PUT(0 DOWNTO 7)