Forum: FPGA, VHDL & Co. VHDL: Mehrere Treiber / std_logic Auflösung


von Andreas P. (andreaspfau)


Lesenswert?

Hi Community,

ich habe mal eine detailiertere Frage zum Auflösungsmechanismus von 
std_logic:

Wenn ich innerhalb einer Architecture einem out-Signal mehrere Werte 
zuweise, meckert Quartus II über "multiple constant drivers". Beispiel:
1
entity Top is
2
  port(
3
    Rst, Clk: in  std_logic;
4
    A, B:  in  std_logic;
5
    Q:  out std_logic);
6
end entity;
7
architecture Arch of Top is
8
begin
9
  process (Rst, Clk)
10
  begin
11
    if Rst = '1' then
12
      Q <= '0';
13
    elsif Clk'event and Clk = '1' then
14
      Q <= A or B;
15
    end if;
16
  end process;
17
  process (Rst, Clk)
18
  begin
19
    if Rst = '1' then
20
      Q <= '0';
21
    elsif Clk'event and Clk = '1' then
22
      Q <= A and B;
23
    end if;
24
  end process;
25
end architecture;

Eigentlich würde ich erwarten, dass Q mithilfe des Auflösungsmechanismus 
von std_logic den Konflikt löst. Tuts aber nicht.

Wenn ich hingegen ein std_logic von mehreren Komponenten treiben lasse, 
klappts auf einmal. Beispiel:
1
  Top_Map1: Top
2
    port map(
3
      Rst => Rst,
4
      Clk => Clk,
5
      A => A,
6
      B => B,
7
      Q => Q);
8
      
9
  Top_Map2: Top
10
    port map(
11
      Rst => Rst,
12
      Clk => Clk,
13
      A => C,
14
      B => B,
15
      Q => Q);

Wenn ich diesen Code simuliere (mit ModelSim-Altera) tuts einwandfrei, 
Konflikte werden zu 'X' aufgelöst.

Jetzt habe ich das erste Beispiel (mehrere Treiber innerhalb einer 
Architecture) nochmal probiert, indem ich auch 'Z'-Zustände hinzugefügt 
habe. Dann gings!


Okay, so viel zu meinen Erfahrungen. Meine Frage: ist das von VHDL so 
vorgesehen? Die Literatur, die ich mir bisher zu gemüte geführt habe, 
sagt, dass std_logic bei Konflikten immer aufgelöst wird (im 
Zweifelsfall zu 'X'). Hier wirds aber nur i zwei von drei Fällen 
aufgelöst. Ist das jetzt nur in Quartus II so, oder ist das von VHDL so 
vorgesehen?

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


Lesenswert?

> meckert Quartus II über "multiple constant drivers"
deutet auf eine Synthese hin

> diesen Code simuliere (mit ModelSim-Altera) tuts einwandfrei
hier dreht es sich um Simulation

> dass std_logic bei Konflikten aufgelöst wird (im Zweifelsfall zu 'X')
Du hast hier anscheinend den Unterschied zwischen Simulation (die kann 
std_logic auflösen) und Synthese (die meckert über mehrfach getriebene 
Signale) gefunden.
In der Realität nützt es nichts, einen Konflikt zwischen '1' und '0' mit 
'X' zu beantworten. Dort gibt es nur '1', '0' und 'Z' (und noch 'H' und 
'L'). Mit einem 'X' oder 'U' kann man in der Wirklichkeit nichts 
anfangen. Deshalb kann es dort keine Auflösung nach std_logic geben.

von Andreas P. (andreaspfau)


Lesenswert?

Hi,

danke für die schnelle Antwort. Hast Recht, der Code mit den beiden 
Komponenten simuliert zwar, synthetisiert aber nicht. Und wenn ich in 
das erste Beispiel ein "--pragma synthesis_off" einbaue, simuliert es 
auch ohne Quartus-Gemecker.

> In der Realität nützt es nichts, einen Konflikt zwischen '1' und
> '0' mit 'X' zu beantworten
Joa, das ist an sich klar. Nur, was ich nicht wusste, ist dass Quartus 
die Testbench als "nur zur Simulation" auffasst, während die gemappte 
Komponente als "synthesefähig" interpretiert wird, und somit dort der 
logische Fehler zu Tage kommt.

Wieder mal was gelernt :-)

von ajax (Gast)


Lesenswert?

Trotz längerem hinschauen kann ich in Deinem Code nicht erkennen, 
welches Signal die Auswahl zwischen a or b bzw. a and b veranlassen 
soll. Kannst Du es mir sagen?

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


Lesenswert?

> welches Signal die Auswahl zwischen a or b bzw. a and b veranlassen soll
Keines, Q wird gleichzeitig beide Ergebnisse zugewiesen.
Deshalb gibt es auch die Meldung über das mehrfach getriebene Signal.

von Andreas P. (andreaspfau)


Lesenswert?

Genau, es soll keine Auswahl stattfinden, sondern ich hatte ursprünglich 
vor, den Simulator (bzw. das Synthesetool) zur Anwendung einer 
Auflösungstabelle bringen. Was in der Simulation auch klappt, während 
die Synthese verlangt (wie ich ja nun herausgefunden habe) dass sich die 
beiden Treiber über Tri-States quasi abwechseln.

Einen praktischen Nutzen hat das Beispiel nicht.

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.