www.mikrocontroller.net

Forum: FPGA, VHDL & Co. [verilog] nettyp wor


Autor: Stefan Helmert (Firma: dm2sh) (stefan_helmert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Mehrfachzuweisungen zu einem wor-Netz klappen in Quartus nicht, also der 
Compiler meckert deshalb.
Was muss ich tun, damit er es frisst?

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

Bewertung
0 lesenswert
nicht lesenswert
> Mehrfachzuweisungen zu einem wor-Netz klappen in Quartus nicht,
Es gibt in einem aktuellen FPGA keine Komponente, die ein Wired-Or 
hardewaremässig abbilden kann. Deshalb gilt:
Triand, trior, wand and wor, are types of wired nets used to model wired 
logic configurations. Wired nets use truth tables to resolve the conflicts 
that result when multiple drivers drive the same net.

Du machst irgendwas, das die Auflösung verhindert...

> Was muss ich tun, damit er es frisst?
Mach ein "normales" Or daraus.

BTW:
Du kannst mit Verilog (und VHDL) Dinge beschreiben, die niemals auf ein 
FPGA abgebildet werden können.

Autor: Stefan Helmert (Firma: dm2sh) (stefan_helmert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bloß warum macht der compiler nicht einfach ein normales or draus?

also beispiel:

wor x;
assign y = a;
assign y = b;

ist das gleiche wie:

assign y = a || b;

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Helmert schrieb:
> bloß warum macht der compiler nicht einfach ein normales or draus?

Weil Du ihm explizit sagst, dass Du das nicht willst.

> wor x;
> assign y = a;
> assign y = b;
>
> ist das gleiche wie:
>
> assign y = a || b;

Nein, das eine ist eine Beschreibung, wie Deine Hardware aussehen
soll, das andere eine Zuweisung des Ergebnisses einer logischen(!)
Verknüpfung[1]. Außerdem sind die Wahrheitstabellen unterschiedlich. Was
Du vermutlich schreiben wolltest, war
assign y = a | b;

Aber auch hier ist die Tabelle anders[2]. Stell Dir mal die Umsetzung
eines wired OR vor, schreib die Tabelle auf

Den "physikalischen" Teil von Verilog sollte man bei synthetisierbaren
Designs vermeiden, da es meistens Probleme gibt. Überlass die
Umsetzung in Hardware Deinem Synthese Werkzeug.

Gruß
Marcus
http://www.doulos.com/

Footnotes:
[1]  Keine Z oder X Propagation :-)

[2]  Keine Z Propagation

Autor: Stefan Helmert (Firma: dm2sh) (stefan_helmert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man etwas auf diese Weiße formulieren möchte, sollte man wohl VHDL 
nehmen und dort den Datentyp std_logic?

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Helmert schrieb:
> Wenn man etwas auf diese Weiße formulieren möchte, sollte man wohl VHDL
> nehmen und dort den Datentyp std_logic?

Worauf bezieht sich diese Aussage? Mit VHDL wirst Du ebenfalls kein 
wired-OR hinbekommen, wenn die Zieltechnologie diese Option nicht 
bietet.

Was willst Du denn erreichen? Warum möchtest Du das unbedingt als 
wired-OR beschreiben und erwartest dass die Synthese das ggf. als 
normales Gatter umsetzt. Warum der Umweg?

Gruß
Marcus
http://www.doulos.com/

Autor: Stefan Helmert (Firma: dm2sh) (stefan_helmert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Warum möchtest Du das unbedingt als
>wired-OR beschreiben und erwartest dass die Synthese das ggf. als
>normales Gatter umsetzt. Warum der Umweg?

Weil dann der Code schöner aussieht! OK klingt doof, ist aber doch bei 
Bussystemen üblich. Wenn mehrere Komponenten sich eine Bus teilen, dann 
wird nur die aktive einen Wert auf den Bus legen, die anderen eben 
High-Z. Man kann ja das High-Z auch als low interpretieren lassen. Oder 
man gibt weak-low auf den Bus und die Komponente, die sendet legt 
forcing-high für 1 an bzw. weak-low oder high-Z für 0. Das wird 
natürlich natürlich nicht physikalisch so im FPGA realisiert.

Es geht ja darum, dass man es eben nicht so schreibt, wie es tatsächlich 
realisiert wird, sondern so, dass der Code mit einem Blick durchschaubar 
ist. Natürlich könnte man die Ausgänge von mehreren Bus-Teilnehmern über

assign daten_bus = speicher_do | cpu_do | dma_unit_do | interface_do;
assign speicher_di = daten_bus;
assign cpu_di = daten_bus;
assign dma_unit_di = daten_bus;
assign interface_di = daten_bus;

beschreiben. Aber es wäre doch besser, wenn man eine "normale" 
schreibweise anwenden könnte:

dma dma_unit1(daten_bus);
interface interface1(daten_bus);
speicher speicher1(daten_bus);
cpu cpu1(daten_bus);

zweitere sieht doch viel übersichtlicher aus. Das ist das was ich meine. 
Was muss ich dann tun, dass der Compiler nicht herummeckert, es sei mehr 
als ein Treiber auf dem Bus, sondern stattdessen diese Struktur zu der 
ersten Variante intern auflöst?

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Helmert schrieb:
>>Warum der Umweg?
>
> Weil dann der Code schöner aussieht! OK klingt doof, ist aber doch bei
> Bussystemen üblich.

Nein. Seit langer Zeit schon vermeidet man solche Strukturen aus
verschiedensten Gründen, vor allem Testbarkeit.

> Wenn mehrere Komponenten sich eine Bus teilen, dann wird nur die
> aktive einen Wert auf den Bus legen, die anderen eben High-Z.

Was zu verifizieren wäre. Kein Spaß in hinreichend komplexen Systemen
falls jede Komponente das selbständig tun soll. Schaltet der Arbiter
die Treiber, dann gehts bequemer und sicherer mit dem unten
beschriebenen Beispiel.

> Man kann ja das High-Z auch als low interpretieren lassen. Oder man
> gibt weak-low auf den Bus und die Komponente, die sendet legt
> forcing-high für 1 an bzw. weak-low oder high-Z für 0. Das wird
> natürlich natürlich nicht physikalisch so im FPGA realisiert.  Es
> geht ja darum, dass man es eben nicht so schreibt, wie es
> tatsächlich realisiert wird, sondern so, dass der Code mit einem
> Blick durchschaubar ist.

Die Beschreibung mit wor gibt aber eben eine genaue Implementierung
vor. Außerdem ist ist sie logisch nicht identisch mit dem was Du haben
möchtest. Willst Du wirklich, dass die Synthese Annahmen trifft?

> Natürlich könnte man die Ausgänge von mehreren Bus-Teilnehmern über
>
> assign daten_bus = speicher_do | cpu_do | dma_unit_do | interface_do;

Nein, es sei denn, Du schaltest irgendwelche Treiber ab
(s.o.). Grundsätzlich will man auf dem Chip aber keine Tri-state
buffer haben. Und auch keine High-Z "Pegel".

Viel einfacher (und geläufiger) ist daher ein multiplexed Bus. Du
wirst ohnehin einen Arbiter implementieren, und der schaltet einfach
die Signale durch, die gerade benötigt werden:
always @* begin
   case (grant)
      SPEICHER: daten_bus <= speicher_do;
      CPU:      daten_bus <= cpu_do;
      DMA:      daten_bus <= dma_unit_do;
      IFACE:    daten_bus <= interface_do;
      default:  daten_bus <= 32'bx;
   endcase
end

> Aber es wäre doch besser, wenn man eine "normale"
> schreibweise anwenden könnte:
>
> dma dma_unit1(daten_bus);
> interface interface1(daten_bus);
> speicher speicher1(daten_bus);
> cpu cpu1(daten_bus);
>
> zweitere sieht doch viel übersichtlicher aus.

Sieht aus wie SystemVerilog Interfaces. Auch hier wird Dir die
Implementierung nicht abgenommen, aber sie wird zentralisiert und ist
dann in der strukturellen Beschreibung nicht mehr sichtbar. Zudem kann
die Beschreibung mehrmals instanziiert werden, so dass man die Logik
nur einmal schreibt. Ist aber zur Zeit auch nicht ganz ohne
Tücken. Sieh auch diesen Artikel:
http://www.doulos.com/knowhow/sysverilog/DVCon07/D...

Gruß
Marcus
http://www.doulos.com/

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.