Forum: FPGA, VHDL & Co. BUS Muxer spinnt


von Steini (Gast)


Lesenswert?

Hallo

Ich habe einen BUS Muxer "gebaut" aber er schaltet nicht richtig. 
Irgendwie mixt er beide Eingangssignale ineinander. Er soll aber immer 
nur einen Eingang zum Ausgang durchschalten.
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
7
ENTITY BUS_Switch is
8
   Port ( CLK   : in std_logic;   
9
      BUS_IN_Quelle : in std_logic_vector (7 downto 0);  --Videodaten direkt von der Bildquelle
10
      BUS_IN_Change  : in std_logic_vector (7 downto 0);    --Videodaten gewandelt
11
      Switch_Enable  : in std_logic_vector (7 downto 0);
12
      
13
      BUS_OUT   : out std_logic_vector (7 downto 0)  
14
       );
15
End BUS_Switch;
16
17
ARCHITECTURE Behavioral of BUS_Switch is
18
19
BEGIN
20
 Process (CLK,Switch_Enable)
21
  Begin
22
                  
23
   If (CLK'Event and CLK = '1') Then
24
25
   If (Switch_Enable (2 downto 2) = "1") then
26
       BUS_OUT <= BUS_IN_Change;
27
   ElsIf (Switch_Enable (2 downto 2) = "0") then
28
       BUS_OUT <= BUS_IN_Quelle;
29
   End If;
30
   
31
   End If;
32
      
33
 END Process;
34
35
END Behavioral;

Ich weiß nicht wo der Fehler liegt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Steini schrieb:
> Irgendwie mixt er beide Eingangssignale ineinander.
Wie merkst du das?
Was sagt die Simulation?

Ein paar Worte zu deinem Code:
1
  If (Switch_Enable (2 downto 2) = "1") then
Das könntest du besser so schreiben:
1
  If (Switch_Enable (2) = '1') then

Warum kommt hier ein elsif?
1
   If (Switch_Enable (2 downto 2) = "1") then
2
       BUS_OUT <= BUS_IN_Change;
3
   ElsIf (Switch_Enable (2 downto 2) = "0") then
4
       BUS_OUT <= BUS_IN_Quelle;
5
   End If;
Switch_Enable(2) kann doch sowieso nur 0 oder 1 sein...

Und dann: warum macht du den Multiplexer getaktet?
Der braucht keinen Takt. Der bringt dir sowieso nur 1 Takt Latency (ich 
vermute, daher kommt das "Vermischen"). Lass den raus...
Damit wären wir hier:
1
 Process (BUS_IN_Change,BUS_IN_Quelle,Switch_Enable)
2
  Begin
3
    If (Switch_Enable(2) = '1') then
4
       BUS_OUT <= BUS_IN_Change;
5
    Else 
6
       BUS_OUT <= BUS_IN_Quelle;
7
    End If;
8
 END Process;

Und dann ginge das auch noch concurrent ohne Prozess und Sensitivliste. 
Ich würde das also so machen:
1
       BUS_OUT <= BUS_IN_Change when Switch_Enable(2) = '1' else BUS_IN_Quelle;

Und damit wird der Mux so aussehen:
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
7
ENTITY BUS_Switch is
8
   Port ( BUS_IN_Quelle : in std_logic_vector (7 downto 0);  --Videodaten direkt von der Bildquelle
9
          BUS_IN_Change  : in std_logic_vector (7 downto 0);    --Videodaten gewandelt
10
          Switch_Enable  : in std_logic_vector (7 downto 0);
11
      
12
          BUS_OUT   : out std_logic_vector (7 downto 0)  
13
       );
14
End BUS_Switch;
15
16
ARCHITECTURE Behavioral of BUS_Switch is
17
BEGIN
18
       BUS_OUT <= BUS_IN_Change when Switch_Enable(2) = '1' else BUS_IN_Quelle;
19
END Behavioral;

Und spätestens jetzt würde ich dem Mux das Recht auf eine eigene Entity 
absprechen, und den direkt dahin platzieren, wo er hingehört... ;-)

von Steini (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie merkst du das?

das Bild welches der Monitor zeigt ist verzerrt.

Ich probiere mal deine Variante und geb gleich ne Rückinfo.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Steini schrieb:
> das Bild welches der Monitor zeigt ist verzerrt.
Autsch, da kann dieser VHDL-Code nichts dafür...
Hast du Constraints gesetzt?
Ist dein Design schnell genug?
Wie sehen deine Signale aus (Oszi)?

> das Bild welches der Monitor zeigt ist verzerrt.
Aber die Simulation funktioniert?

> Ich probiere mal deine Variante
Das wird in dem Fall nichts nützen...  :-/

von Steini (Gast)


Lesenswert?

...doch hats...ich habe den CLK entfernt und "HURRA" es ging.

bei genauerem Betrachten der ModelSim fielt mit jetzt auch auf, das der 
Muxer um einen Takt versetzt reagiert und vorallem das der Takt mir 
nicht erklärbare Umschaltungen im Muxer erzeugte.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Steini schrieb:
> das der Muxer um einen Takt versetzt reagiert
Das ist klar und nennt sich Latency...

> und vorallem das der Takt mir
> nicht erklärbare Umschaltungen im Muxer erzeugte.
In der Simulation?
Das kann dann nur von der Latency kommen...

von Steini (Gast)


Lesenswert?

...hab ich in anderen Modulen auch...und ich dachte auch das es ja egal 
ist ob der Muxer einen Takt versetzt schaltet..sieht man das Bild halt 
später / verzögert umgeschaltet...aber es kam eben nur Murx raus...

Ohne Takt gehts auf jeden Fall..Danke Lothar

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.