hallo zusammen, folgendes Problem beschäftigt mich: ich benötige einen Multiplexer bei dem man aber nicht z.B. 2 Eingänge auf 1 Ausgang schaltet oder umgekehrt, sondern der im Zustand A die Daten in die eine Richtung schaltet und im Zustand B in die umgekehrte Richtung. Dem entsprechend muß ein Anschluß ein "inout" sein. (Siehe dazu die skizze im anhang) Hier mein vorläufige Ergebnis: (nur das wichtigste) sel : in std_logic; --auswahl data1 : in std_logic_vector (7 downto 0); -- Eingang für die Richtung A data2 : out std_logic_vector (7 downto 0); -- Ausgang für die Richtung B data3 : inout std_logic_vector (7 downto 0) -- Daten fließen in beide richtungen signal data2_i : std_logic_vector(7 downto 0) := "00000000"; data3 <= data1 when sel = '0' else data2_i; data2 <= data2_i; In den 2 zeilen Logik steckt aber ein Fehler, den ich nicht sehe. Oder ist mein Ansatz falsch ? Bitte helft mir Gruß und vielen Dank im voraus dete
data2_i bekommt in deiner beschreibung nie einen neuen wert zugewiesen und der Fall sel = '1' wird auch nie abgefragt.
der Fall Sel = '1' ist mit ... else data2_i; erledigt wie muß ich ....data2 <= data2_i; ändern?
Hallo Date, probier es mal so: data1 : in std_ulogic_vector (7 downto 0); -- Eingang für die Richtung A data2 : out std_ulogic_vector (7 downto 0); -- Ausgang für die data3 : inout std_logic_vector (7 downto 0) -- Daten fließen in beide richtungen signal data2_i : std_ulogic_vector(7 downto 0) := "00000000"; data3 <= ToStdLogicVector(data1) when sel = '0' else ToStdLogicVector (data2_i); data2 <= ToStdULogicVector (data2_i); Und wenn du auf den Bus nicht schreiben möchtest dann setz einfach den Bus auf high Impedance data3 <= "ZZZZZZZZ"; Gruss Stanko
hallo stanko, hier mal mein code, bei der Compilierung tritt eine Fehlermeldung auf: ------------------------------------------------------------------------ -- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity one_to_two_mux_inout_input is port( sel : in std_logic_vector (7 downto 0); data1 : in std_ulogic_vector (7 downto 0); data2 : out std_ulogic_vector (7 downto 0); data3 : inout std_logic_vector (7 downto 0) ); end one_to_two_mux_inout_input; architecture Behavioral of one_to_two_mux_inout_input is signal data2_i : std_ulogic_vector(7 downto 0) := "00000000"; begin data3 <= to_stdlogicvector(data1) when sel = "11100000" else to_stdlogicvector(data2_i); data2 <= to_stdlogicvector(data2_i); end Behavioral; ----------------------------------------------------------------- wo liegt mein fehler? ich habe mit std_ulogic_vector noch nicht gearbeitet gruß dete
poste doch auch mal den Fehler dazu. warum nutzt du überhaupt std_ulogic_vector und nich gleich std_logic_vector?
also der felher lautet: ....... \test\one_to_two_mux_inout_input.vhd(27): No feasible entries for subprogram "to_stdlogicvector". warum nutzt du überhaupt std_ulogic_vector und nich gleich std_logic_vector? --> weil Stanko T. das las beispiel gepostet hat ! und ich seinen Versuch getestet habe !
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity one_to_two_mux_inout_input is port( sel : in std_logic; data1 : in std_ulogic_vector (7 downto 0); data2 : out std_ulogic_vector (7 downto 0); data3 : inout std_ulogic_vector (7 downto 0) ); end one_to_two_mux_inout_input; architecture Behavioral of one_to_two_mux_inout_input is begin process(sel) begin if (sel = '1') then data3 <= data1; else data2 <= data3; end if; end process; end Behavioral;
Passend zu deinem ersten Ansatz:
1 | data3 <= data1 when sel = '0' else (others=>'Z'); |
2 | data2 <= data3 when sel = '1' else (others=>'X'); |
Bei data2 wird ein Latch verhindert und in der Simulation sollte es auffallen wenn der Pfad im deselektierten Zustand gelesen wird. Cheers, Roger
also ich habs so gemacht:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.STD_LOGIC_ARITH.ALL; |
4 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
5 | |
6 | entity one_to_two_mux_inout_input is |
7 | |
8 | port( |
9 | sel : in std_logic; |
10 | data1 : in std_logic_vector (7 downto 0); |
11 | data2 : out std_logic_vector (7 downto 0); |
12 | data3 : inout std_logic_vector (7 downto 0) |
13 | );
|
14 | |
15 | end one_to_two_mux_inout_input; |
16 | |
17 | architecture Behavioral of one_to_two_mux_inout_input is |
18 | |
19 | signal data2_i : std_logic_vector(7 downto 0) := "00000000"; |
20 | |
21 | begin
|
22 | |
23 | data3 <= data1 when sel = '0' else "ZZZZZZZZ"; |
24 | data2 <= data3 when sel = '1' else "ZZZZZZZZ"; |
25 | |
26 | |
27 | end Behavioral; |
und synthese funzt super
Hab deinen code kopiert, er funktiert, auch in der Simulation. Genauso wie ich das wollte, Und ich hab noch was dazu gelernt. Super, Vielen Dank Nephilim Gruß Dete
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.