mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Pull Up Simulation


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielleicht stehe ich nur auf dem Schlauch, aber ich dachte ich frage mal 
in die Runde.

Ich möchte einen Pin mit externem Pullup simulieren.
Dabei kann der externe Baustein für ein Busy die Leitung auf 0 ziehen.
(Außerdem kann er noch Daten schicken, aber das ist hier egal)

D.h. ich muss intern auf 'Z' setzen und '1' prüfen, d.h. ob nicht busy.
Soweit, so gut.

Ich muss aber auch auf der Gegenstelle das gleiche tun, d.h. in der 
Testbench auf 'z' oder 'H' setzen um zu lauschen was das FPGA so 
schickt.
D.h. bei nicht busy kann ich nicht einfach '1' von der testbench 
treiben.

Aktuell sieht mein Code so aus(Codebeispiel, nur relevanter Teil)

TB
signal <= signal_out when signal_ena = '1' else 'H';

FPGA
signal <= signal_out when signal_highz = '0' else 'Z'

process(clk)
...
signal_in <= signal
if (signal_in = '1') then -- Variante 1
if (signal_in /= '0') then -- Variante 2
...


Variante 2 funktioniert für die Simulation. Klar, weil 'H' eben nicht 
'0' ist kann ich damit arbeiten.

Ich habe aber ein schlechtes Gewissen für die Synthese, dort würde ich 
lieber Variante 1 nehmen. Die bekomme ich aber wie gesagt nicht 
simuliert, weil die TB ein H treibt.

Was tun?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Korrekt wäre aber wohl
if (signal_in = 'H') then -- Variante 3
Und damit käme zumindest mal der Vivado-Synthesizer gut zurecht, weil er 
naheliegenderweise 'H' wie '1' behandelt. Jetzt musst du nur noch das 
Handbuch deines Synthesizers lesen, um dort die selbe Passage zu 
finden...

: Bearbeitet durch Moderator
Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mensch Lothar, was du alles ausgräbst :)

Für Quartus habe ich auf die schnelle nichts gefunden, aber ich werde 
nochmal auf die Suche gehen.

Hatte die Hoffnung es gibt eventuell eine elegantere Lösung, die 
eindeutiger ist, ohne vom Tool abhängig zu sein.

Natürlich ist man das immer ein bischen, aber ein Vergleich auf '1' wäre 
in der Hinsicht schon nett.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGA zum Spass schrieb im Beitrag #5861051:
> aber ein Vergleich auf '1' wäre in der Hinsicht schon nett.
Dann musst du ein to_01() aus der numeric_std dazupacken:
if (to_01(signal_in) = '1') then   -- Variante 4

: Bearbeitet durch Moderator
Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder mal ein nettes Beispiel dafür, dass es wichtig ist, physikalische 
Simulationen mit VHDL getrennt von den logischen durchzuführen und das 
Logikdesign von der äusseren Physik zu trennen. Dann ergeben sich solche 
Überschneidungen gar nicht. In der P-Simulation braucht man dann nur 
einen Überwacher, der bei einen unbelegten Signal, das nicht vom FPGA 
und nicht von irgendeinen anderen Bausteing getrieben wird, eine 1 zu 
setzen. Die konsequente Trennung von äuserer Leitung (linke Seite des 
Pins) und der inneren Leitung (rechte Seite des Pins) ermöglicht diesen 
Zugriff und die Beobachtung der informationsgebenden Signale. Das geht 
auch und vor allem durch die Tristate-Buffer durch und schafft ein 
tatsächliches Zeitverhalten, dessen eleganter Nebeneffekt es ist, dass 
die Simulation nicht in eine Schleife rennt, wenn man die Reaktion des 
Pins mit einigen ps verzögert. Danm kann man sich meist auch das 
umständliche Simulieren der buffer-Verzögerungen mit exakten Timings 
sparen. Die Reaktionen der Chips auf die Signale sind dann immer 
sequentiell wie in der Realität.

Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Lothar, genau sowas habe ich gesucht.
Sehr fein.

Ich teste dann morgen ob das auch "synthesefest" ist, für heute ist 
Schluss.


@ Jürgen:

sind das jetzt threoretische Überlegungen oder kannst du konkret 
beschreiben was du da meinst?

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGA zum Spass schrieb im Beitrag #5861131:
> sind das jetzt threoretische Überlegungen oder kannst du konkret
> beschreiben was du da meinst?

Das ist durchaus sehr praktisch gemeint.

Bei der Simulation der Interaktion des FPGAs mit seiner Umgebung 
simuliert man ja Interfaces zu Prozessoren, das Verhalten von 
Leitungstreibern und/oder die Kommunikation über PCB-Grenzen hinweg mit 
anderen Teilnehmern. Oft kommt es auch auf die Interaktion von 
Baugruppen an, wenn sie am selben Bus hängen, sei es ein bidirektionaler 
Datenbus, I2C oder sonst etwas.

Bei diesen Simulation gibt es nicht nur völlig andere Zielsetzungen und 
damit Testcases, sondern auch ein völlig andere Timing, komplett 
losgelöst von FPGA-Takten. Daher sollte man das auch isoliert 
voneinander abwickeln. Z.B. braucht man hier mitunter die min/max Zeiten 
von irgendwelchen Buffern, also Exemplarstreuungen.

Hat man das im Griff, kann man sich bei der Interaktion von z.B. 
Prozessor und FPGA sowie allen Innereien auf die Logiksimulation 
beschränken.

Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist ja immer wieviel Aufwand man treiben will und muss.

Fürs Hobby reicht mir z.b. wenn etwas bei Raumtemperatur auf meinem 
Evalboard funktioniert.

Für eine Massenproduktion muss ich ggf sogar während der Laufzeit 
Timings überwachen, also das andere Ende des Spektrums.


Hierfür passt das alles aber weniger, weil es um einen halbwegs 
langsamen Bus geht und ich eigentlich nur die Logikseite brauche und 
dafür eben einen Pullup in der Simulation.


Habe es jetzt übrigens so gelöst:
if (to_bit(signal_in) = '1') then   -- Variante 5

weil entwerder steht ich auf dem Schlauch oder to_01 von der numeric_std 
kann nur signed und unsigned konvertieren, ich habe jedoch einen 
std_logic.

Läuft jedenfalls in Simulation und Synthese und sieht halbwegs sauber 
aus.

Autor: St. D. (st_d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Funktion:
 if (signal_in = '1' or signal_in = 'H') then   -- Variante 6 

Das finde ich noch besser,

: Bearbeitet durch User
Autor: Tobias B. (Firma: www.elpra.de) (ttobsen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
St. D. schrieb:
> Ohne Funktion:
>
>
 if (signal_in = '1' or signal_in = 'H') then   -- Variante 6 
> 
>
> Das finde ich noch besser,

Ich schreibe in diesen Faellen die Logik immer um und pruefe auf '0'.
if (signal_in = '0') then
...
else
...

Das finde ich immer ganz gut lesbar, auch weil das 0 ziehen aktiv 
geschieht, waehrend die '1'/'H' nur einer Art idle Zustand entspricht.

Ist das wirklich mal unguenstig, dann eignet sich auch eine vorherige 
Konvertierung auf kombinatorischer Ebene
sig <= '0' when signal_in = '0' else '1';

-- ab dann mit sig weiterarbeiten wie gewohnt

Das finde ich einfach sauberer und sollte mit praktisch allen Synthese 
Werkzeugen kompatibel sein, da die Pruefung auf 'H' komplett entfaellt.

: Bearbeitet durch User

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.

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