Forum: FPGA, VHDL & Co. VHDL Verbindung nur wenn "enabled"


von Bliad B. (bliad_b)


Lesenswert?

Hi,
möchte nur bei enbale = 1 etwas verbinden lassen.
Es geht vielleicht mit einem process, aber bin mir noch nicht sicher wie 
man das gewöhnlich macht mit einem Baustein.
Weil man muss dann alle signale in die sens. liste schreiben oder?
das kommt mir seltsam vor.

VHDL
1
p_connect_x : process(clk,enable)
2
  begin
3
  case enable is
4
  when '1' =>
5
    t(0) <= '0';
6
<Verbindung >
7
<Verbindung >
8
<Verbindung >
9
<Verbindung >
10
<Verbindung >
11
12
  when '0' =>
13
   t(0) <= '1';
14
  when others =>
15
  end case;
16
  end process p_connect_x;

von Dussel (Gast)


Lesenswert?

Wie 'verbunden'? Du kannst nicht einfach im Betrieb Signale abhängen. 
Due kannst sie höchstens unter bestimmten Umständen hochohmig schalten.
Zeig mal ein Beispiel, was du unter <Verbindung> verstehst.

von Christoph Z. (christophz)


Lesenswert?

Bliad B. schrieb:
> Es geht vielleicht mit einem process, aber bin mir noch nicht sicher wie
> man das gewöhnlich macht mit einem Baustein.

Ich glaube, das was du beschreiben möchtest ist ein Multiplexer (oft 
auch kurz Mux genannt).

Einen Multiplexer kann man in VHDL ganz verschieden beschreiben, mit 
prozess oder nebenläufig.

Bliad B. schrieb:
> Weil man muss dann alle signale in die sens. liste schreiben oder?

Wenn es ein nur ein Mux ist, ohne Register/Flip-Flops, dann hast du eine 
rein kombinatorische Beschreibung (ohne Clock) und dann muss auch alles 
in die Sensitivitätsliste.

Dein Beispielcode zeigt aber Clock und Enable in der Sensitivitätsliste, 
Clock wird aber gar nicht verwendet. Soll das jetzt ein synchroner 
Prozess (mit rising_edge(Clock) und Flip-Flops) oder ein 
kombinatorischer werden?

von bilad (Gast)


Lesenswert?

Dussel schrieb:
> Zeig mal ein Beispiel, was du unter <Verbindung> verstehst.


Vielen Dank für die Antwort.

Also z.B. in Abhängigkeit von enbale wird der Ausgang vom IP-Core mit 
dem Ausgang des Designs verbunden.
Ansonsten hier z.B. "111111111111"

Macht man das so?
Wenn nicht wie würde man es machen?

1
ENTITY test_design IS
2
  PORT ( 
3
4
test_output: OUT STD_LOGIC_VECTOR(11 downto 0)
5
);
6
7
component ipcore
8
port(
9
ausgang1 : out std_logic_vector (5 downto 0);
10
ausgang2 : out std_logic_vector (5 downto 0)
11
);
12
end component;
13
14
p_connector : process(enable)
15
16
begin
17
if enable = '1'
18
test_output (10 downto 6) <= ausgang1  (5 downto 0);
19
test_output (5 downto 0) <= ausgang2  (5 downto 0);
20
else
21
test_output(10 downto 0) <= "111111111111";
22
end if;
23
end process p_connector;

Christoph Z. schrieb:
> Dein Beispielcode zeigt aber Clock und Enable in der Sensitivitätsliste,
> Clock wird aber gar nicht verwendet. Soll das jetzt ein synchroner
> Prozess (mit rising_edge(Clock) und Flip-Flops) oder ein
> kombinatorischer werden?

Danke.
Ja wäre ein MUX.
Ich möchte an meinen echten Board-Ports messen ob was ankommt. Deswegen 
möchte ich dort einfach mal HIGH anlegen lassen.
Clock brauche ich dafür nicht.
War nur ein Überbleibsel.
Also wenn der FPGA angeht soll einfach entweder der Core verbunden sein 
oder HIGH anliegen.

Weiß noch nicht wie ich das mit nem Schalter machen könnte oder wie ich 
den FPGA sonst ansteuern kann xD

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


Lesenswert?

bilad schrieb:
> Wenn nicht wie würde man es machen?
Ich würde diesen Multiplexer ohne Prozess ganz nebenläufig so schreiben:
1
  test_output <= ausgang1&ausgang2 when enable='1' else (others => '1');

: Bearbeitet durch Moderator
von Dussel (Gast)


Lesenswert?

bilad schrieb:
> Also wenn der FPGA angeht soll einfach entweder der Core verbunden sein
> oder HIGH anliegen.
Wie du geschrieben hast, wäre das ein Multiplexer.
1
p_connector : process(enable)
2
begin
3
  if enable = '1'
4
    test_output (10 downto 6) <= ausgang1  (5 downto 0);
5
    test_output (5 downto 0) <= ausgang2  (5 downto 0);
6
  else
7
    test_output(10 downto 0) <= "111111111111";
8
  end if;
9
end process p_connector;
Das sieht grundsätzlich erstmal gültig aus, kann man also so machen. Ob 
es dann im Gesamtzusammenhang sinnvoll ist, ist eine andere Frage.
Die Sensitivityliste ist aber nicht vollständig. Da muss noch Ausgang1 
und Ausgang2 rein.
Außerdem würde ich
test_output <= (others => '1');
schreiben. Dann musst du den Vektor nicht ändern, wenn sich die Länge 
von test_output ändert.

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


Lesenswert?

Dussel schrieb:
> Wie du geschrieben hast, wäre das ein Multiplexer. ....
> Das sieht grundsätzlich erstmal gültig aus
... hat aber auf den zweiten Blick den Fehler, dass die Sensitivliste 
nicht vollständig ist: ausgang1 und ausgang2 fehlen darin.

Mit einer nebenläufigen Schreibweise kann sowas gar nicht passieren.

: Bearbeitet durch Moderator
von Dussel (Gast)


Lesenswert?

Lothar M. schrieb:
> Dussel schrieb:
>> Wie du geschrieben hast, wäre das ein Multiplexer. ....
>> Das sieht grundsätzlich erstmal gültig aus
> ... hat aber auf den zweiten Blick den Fehler, dass die Sensitivliste
> nicht vollständig ist: ausgang1 und ausgang2 fehlen darin.
Ich zitiere mich mal:
Dussel schrieb:
> Die Sensitivityliste ist aber nicht vollständig. Da muss noch Ausgang1
> und Ausgang2 rein.
;-)

Lothar M. schrieb:
> Mit einer nebenläufigen Schreibweise kann sowas gar nicht passieren.
Das finde ich aber für einen Anfänger, der if kennt, schwerer 
verständlich (weil es kryptischer ist). Ähnlich wie ich einem Anfänger 
in C erstmal if-else statt den ?:-Operator beibringen würde.

von bilad (Gast)


Lesenswert?

Lothar M. schrieb:
> test_output <= ausgang1&ausgang2 when enable='1' else (others => '1');

Hätte aber unterschiedliche/ mehrere Zuweisungen.
Dann muss ich öfters **when** schreiben.
Kann man das nicht zusammenfassen?



Lothar M. schrieb:
> Ich würde diesen Multiplexer ohne Prozess ganz nebenläufig so schreiben:

Welche Vorteile hat das gegenüber einem Prozess?

Dankee :D

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


Lesenswert?

Dussel schrieb:
> Das finde ich aber für einen Anfänger, der if kennt
Und dann C programmiert.

> schwerer verständlich (weil es kryptischer ist).
Ist es nicht einfach nur "neu".
Ich finde es sogar "natürlichsprachlicher" als das if-Gehampel.

Hat eigentlich schon wer erwähnt, dass die Sensitivliste nicht 
vollständig ist? Und deshalb die Simulation nicht zur erzeugten Hardware 
passt?  ;-)

bilad schrieb:
> Lothar M. schrieb:
>> Ich würde diesen Multiplexer ohne Prozess ganz nebenläufig so schreiben:
> Welche Vorteile hat das gegenüber einem Prozess?
Du hast sicher keine falsche Sensitivliste. Du sparst 8 Zeilen Code ein 
und gewinnst Übersichtlichkeit. Mir reicht das als Vorteile.

: Bearbeitet durch Moderator
von Dussel (Gast)


Lesenswert?

bilad schrieb:
> Lothar M. schrieb:
>> test_output <= ausgang1&ausgang2 when enable='1' else (others => '1');
>
> Hätte aber unterschiedliche/ mehrere Zuweisungen.
> Dann muss ich öfters **when** schreiben.
> Kann man das nicht zusammenfassen?
Es gibt if-else, when-else und with-select. Welches man verwendet ist 
meiner Meinung nach oft Geschmackssache. With-select verwende ich zum 
Beispiel praktisch gar nicht.
Ich würde zum Beispiel eher
1
X <= A when cmd /= "00" else '0';
bei einer einzelnen Zuweisung und
1
process(cmd, A, B, C)
2
begin
3
  X <= '0';
4
  Y <= '0';
5
  Z <= '0';
6
  if cmd /= "00" then
7
    X <= A;
8
    Y <= B;
9
    Z <= C;
10
  end if;
11
end process;
bei mehreren Zuweisungen schreiben. (Ich hoffe, da ist kein Fehler 
drin...)

Man könnte aber auch
1
X <= A when cmd /= "00" else '0';
2
Y <= B when cmd /= "00" else '0';
3
Z <= C when cmd /= "00" else '0';
schreiben.

Lothar M. schrieb:
>> schwerer verständlich (weil es kryptischer ist).
> Ist es nicht einfach nur "neu".
Ja. Und damit ungewohnt. Für den Anfang würde ich persönlich gewohnte 
Syntax bevorzugen. Aber das ist meine Meinung und man kann natürlich 
anderer Meinung sein.

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


Lesenswert?

Dussel schrieb:
> With-select verwende ich zum Beispiel praktisch gar nicht.
Es ist aber trotzdem einen Blick wert...  ;-)

Hier mal die vier Varianten, vorneweg die von Programmierern so 
beliebten "Freunde" aus den prozeduralen Sprachen:
1
-- 7 Segment Decoder
2
 
3
--  sequentiell im Prozess:
4
   process (digit) begin
5
       segments <= "0111111"; -- Defaultwert
6
       if digit=0 then segments <= "1000000"; end if;
7
       if digit=1 then segments <= "1111001"; end if;
8
       if digit=2 then segments <= "0100100"; end if;
9
       :
10
       :
11
       if digit=8 then segments <= "0000000"; end if;
12
       if digit=9 then segments <= "0010000"; end if;
13
   end process;
14
 
15
 
16
   process (digit) begin
17
       case digit is
18
       when 0 => segments <= "1000000";
19
       when 1 => segments <= "1111001";
20
       when 2 => segments <= "0100100";
21
       :
22
       :
23
       when 8 => segments <= "0000000";
24
       when 9 => segments <= "0010000";
25
       when others => segments <= "0111111";
26
       end case;
27
   end process;
28
 
29
 
30
--  nebenläufig:
31
  segments <= 
32
     "1000000" when digit=0 else
33
     "1111001" when digit=1 else
34
     "0100100" when digit=2 else
35
      :
36
      :
37
      "0000000" when digit=8 else
38
      "0010000" when digit=9 else
39
      "0111111";
40
 
41
 
42
  with digit select segments <= 
43
      "1000000" when 0,
44
      "1111001" when 1,
45
      "0100100" when 2,
46
      :
47
      :
48
      "0000000" when 8,
49
      "0010000" when 9,
50
      "0111111" when others;
Man sieht hier, dass die if-Abfragerei die Fehleranfälligste ist, weil 
man sich da um den Defaultwert selbst kümmern muss und bei 
Nichtbeachtung sofort ein Latch an der Backe hat. Zudem braucht dieser 
Stil am meisten Platz (und das obwohl ich jede Abfrage in 1 Zeile 
geschrieben habe).

Am knackigsten und zudem am besten leserlich ist die nebenläufige 
WITH-SELECT-Variante dieses Multiplexers.

: Bearbeitet durch Moderator
von Messtechniker (Gast)


Lesenswert?

wie bekommt man denn bitte diesen Code so schön formatiert?

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


Lesenswert?

Messtechniker schrieb:
> wie bekommt man denn bitte diesen Code so schön formatiert?
Man verwendet eine passende Indention.
Und das Syntax Highlighting gibts mit den [vhdl] Tokens um den 
Sourcecode.

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.