Ich möchte einen Tri-State-Puffer für einen Eingangsvektor implementieren, der durch einen Aktivierungsvektor ausgelöst wird, wobei jedes Bit des Aktivierungsvektors das entsprechende Bit des Eingangsvektors aktiviert.
So etwas, aber mit mehreren Aktivierungsbits:
Ein einzelner Tri-State-Puffer sieht so aus:
Y <= A when (EN = '0') else 'Z';
(Beispiel aus: https://startingelectronics.org/software/VHDL-CPLD-course/tut16-tri-state-buffer/ )
Es könnte so aussehen (aber das funktioniert nicht ...):
[...]
signal Y : std_logic_vector(N downto 0);
signal A : std_logic_vector(N downto 0);
signal EN : std_logic_vector(N downto 0);
Y <= A when EN = (others => '1') else (others => 'Z');
Gibt es eine Möglichkeit, dies in VHDL zu deklarieren, oder muss ich für jedes Bit einen Puffer schreiben?
Bearbeiten: Zur Verdeutlichung suche ich eine kurze Erklärung dafür:
Y(0) <= A(0) when EN(0) = '1' else 'Z';
Y(1) <= A(1) when EN(1) = '1' else 'Z';
[...]
Y(N) <= A(N) when EN(N) = '1' else 'Z';
Wenn Sie die Steuerung für jedes Bit aktivieren müssen, verwenden Sie am einfachsten eine Generate-Anweisung:
tristate : for i in 0 to N generate
begin
Y(i) <= A(i) when EN(i) = '1' else 'Z';
end generate tristate;
Generate-Anweisungen mit for
Einschränkungen erstellen mehrere Schaltkreise, die parallel arbeiten, im Gegensatz zu einer for-Schleife in der Programmierung, bei der derselbe Code mehrmals hintereinander ausgeführt wird.
Du hast es fast geschafft. Versuche dies
signal Y : std_logic_vector(N downto 0);
signal A : std_logic_vector(N downto 0);
signal EN : std_logic;
Y <= A when EN = '1' else (others => 'Z');
user_1818839
Y <= A when EN = '0' else (A'range => 'Z');
sollte es funktionieren. (3) Die VerwendungA'range
von Attributen anstelle vonothers
macht die Größe des Vektors explizit, was an Stellen hilfreich ist, an denen der Compiler den richtigen Bereich für nicht angeben kannothers
.e1kable
OTHERS choice used in aggregate for unconstrained record or array type is not supported
Dieses Beispiel sollte nur zeigen, was ich meinte. Ja, das funktioniert, aber es ermöglicht den vollständigen Vektor. Ich suche nach einer kompakten Art, dies zu beschreiben:Y(0) <= A(0) when EN(0) = '1' else 'Z';
Y(1) <= A(1) when EN(1) = '1' else 'Z';
[...]Y(N) <= A(N) when EN(N) = '1' else 'Z';