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 的类型非常强,如果你想反转位顺序,你必须明确地这样做。

标准解决方案是使用一个函数(我没有写这个 -乔纳森布罗姆利做了):

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

这个问题有几种解决方案。一种可能性如下:

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 回答
1

建议?

因为您的示例指定了固定长度:

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;

理论上,这应该比函数调用或循环语句的开销更少。

于 2014-06-15T09:39:50.997 回答
-8

OUT_PUT(7 DOWNTO 0) <= IN_PUT(0 DOWNTO 7)

于 2014-06-14T05:18:53.663 回答