Forum: FPGA, VHDL & Co. Multiplexer - Problem


von Dete K. (dete)


Angehängte Dateien:

Lesenswert?

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

von Nephilim (Gast)


Lesenswert?

data2_i bekommt in deiner beschreibung nie einen neuen wert zugewiesen 
und der Fall sel = '1' wird auch nie abgefragt.

von Dete K. (dete)


Lesenswert?

der Fall Sel = '1' ist mit ... else data2_i;  erledigt

wie muß ich   ....data2 <= data2_i;   ändern?

von New I. (newie)


Lesenswert?

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

von Dete K. (dete)


Lesenswert?

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

von Nephilim (Gast)


Lesenswert?

poste doch auch mal den Fehler dazu. warum nutzt du überhaupt 
std_ulogic_vector und nich gleich std_logic_vector?

von Dete K. (dete)


Lesenswert?

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 !

von Doung W. (honeyleabe)


Lesenswert?

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;

von Roger S. (edge)


Lesenswert?

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

von Nephilim (Gast)


Lesenswert?

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

von Dete K. (dete)


Lesenswert?

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
Noch kein Account? Hier anmelden.