Ordre inversé des bits sur VHDL

j'ai du mal à faire quelque chose comme

b(0 to 7) <= a(7 downto 0)

quand je le compile avec ghdl, j'ai une erreur d'ordre. Le seul moyen que j'ai trouvé pour faire mon circuit de travail est la suivante:

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;

des Suggestions? Merci à l'avance

15
demandé sur rick 2012-11-27 16:31:34

6 réponses

ce n'est pas autorisé - VHDL est si fortement tapé que si vous voulez inverser les ordres de bits, vous devez le faire explicitement.

La solution standard est d'utiliser une fonction (je n'ai pas écrit ce - 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
22
répondu Martin Thompson 2012-11-27 13:05:21

La question demande comment traiter spécifiquement avec b(0 à 7) <= a(7 0). Je ne sais pas les raisons, mais parfois cette tâche fonctionne pour moi (affecte les choses de gauche à droite sans tenir compte de la découpe) et parfois cette tâche envoie des erreurs de compilation (découpage mal adapté ou quelque chose).

Heureusement, vous n'avez pas besoin d'utiliser une fonction pour gérer incompatibles découpage. Si vous obtenez des erreurs du compilateur pour ce problème spécifique, vous pouvez utiliser une boucle pour générer attribuer un à 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;

il fait essentiellement la même tâche déroulante que dans votre exemple, juste serré et graduable.

j'ai également utilisé ce modèle lorsque j'ai mal aligné tranchage sur le côté droit de la tâche. Par exemple:

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;

ce qui équivaut à:

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);
4
répondu Matt Dallmeyer 2013-10-04 01:32:06

Il y a plusieurs solutions à ce problème. Une possibilité est la suivante:

gen: for i in 0 to 7 generate
  y(i) <= a(i) when rev='0' else a(7-i);
end generate;
4
répondu VAP 2014-01-05 20:42:50

Vraiment en l'inversant:

for i in 0 to intermediate_data'left loop

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

end loop;
2
répondu menniwick 2016-10-18 11:07:07

des Suggestions?

Parce que votre exemple spécifie longueur fixe:

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;

La théorie, cela devrait être moins de ressources qu'un appel de fonction ou instruction loop.

0
répondu user1155120 2014-06-15 09:39:50

OUT_PUT (7 DOWN TO 0) <= IN_PUT (0 DOWN TO 7)

-6
répondu Pawan G 2014-06-14 05:18:53