Wie implementiere ich einen Tri-State-Puffer für einen Vektor in VHDL?

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 4-Bit-Tri-State-Puffer, jedoch mit einem einzigen Aktivierungsbit.

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';
Sie müssen uns sagen, was "funktioniert nicht" bedeutet. Ein paar Anmerkungen: (1) EN kann eine einzelne std_logic sein. (2) Dann Y <= A when EN = '0' else (A'range => 'Z');sollte es funktionieren. (3) Die Verwendung A'rangevon Attributen anstelle von othersmacht die Größe des Vektors explizit, was an Stellen hilfreich ist, an denen der Compiler den richtigen Bereich für nicht angeben kann others.
OTHERS choice used in aggregate for unconstrained record or array type is not supportedDieses 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';

Antworten (2)

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 forEinschrä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');
ja, aber hier ist nur ein Freigabebit. Ich möchte einen Aktivierungsvektor haben.