VHDL上的反转位顺序

时间:2012-11-27 12:31:34

标签: 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;

连连呢? 提前致谢

6 个答案:

答案 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)