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
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
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);
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;
Vraiment en l'inversant:
for i in 0 to intermediate_data'left loop
inverted_vector(i) <= intermediate_data(intermediate_data'left - i);
end loop;
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.