www.mikrocontroller.net

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


Autor: Andreas Pfau (andreaspfau)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity Top is
  port(
    Rst, Clk: in  std_logic;
    A, B:  in  std_logic;
    Q:  out std_logic);
end entity;
architecture Arch of Top is
begin
  process (Rst, Clk)
  begin
    if Rst = '1' then
      Q <= '0';
    elsif Clk'event and Clk = '1' then
      Q <= A or B;
    end if;
  end process;
  process (Rst, Clk)
  begin
    if Rst = '1' then
      Q <= '0';
    elsif Clk'event and Clk = '1' then
      Q <= A and B;
    end if;
  end process;
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:
  Top_Map1: Top
    port map(
      Rst => Rst,
      Clk => Clk,
      A => A,
      B => B,
      Q => Q);
      
  Top_Map2: Top
    port map(
      Rst => Rst,
      Clk => Clk,
      A => C,
      B => B,
      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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Pfau (andreaspfau)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: ajax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Pfau (andreaspfau)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.