www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Verilog - falsch übersetzt?


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schaut euch das mal an:
[verilog]
module i2c_slave (SCL, SDA, start);
  input SDA;
  input  SCL;
  reg start;
  output start;

always@(negedge SDA or negedge SCL)
begin
start = !SDA & SCL;
end

endmodule
[/verilog]

wenn SDA low ist und nur SCL nach high geht, darf doch mit start gar 
nichts passieren - warum geht start hoch, wenn SCL hoch geht, es ist 
doch gar kein posedge SCL vorhanden?

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

Bewertung
0 lesenswert
nicht lesenswert
nun hab ich gerade gemerkt: das verhält sich ja wie
assign start = !SDA & SCL;

da hat der doch einfach was wegoptimiert.

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

Bewertung
0 lesenswert
nicht lesenswert
na toll, wenn ich es als if-bedingung formuliere nimmt er es nicht:
was in den klammern von always@ darf nicht in der if-bedingung verwendet 
werden.

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

Bewertung
0 lesenswert
nicht lesenswert
always@(negedge SDA or negedge SCL)
begin
  start = !SDA & SCL;
end
Willst du "nur" simulieren, oder soll das später mal in Hardware 
realisiert werden? Was für ein Bauteil soll das im richtigen Leben 
werden?
Hast du irgendwelche Warnungen bei der Synthese (nicht beachtet)?

In FPGAs gibt es nur Register, die entweder auf die steigende oder auf 
die fallende Flanke eines Signals getaktet werden (ok, mit ein paar 
speziellen Ausnahmen). Du willst hier offenbar etwas, das 2 Signale als 
Takt verwendet. Sozusagen etwas ähnliches wie ein flankengetriggertes 
RS-Flipflop.

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

Bewertung
0 lesenswert
nicht lesenswert
eigentlich wollte ich nur etwas programmieren, was start und stop bei 
i²c erkennt und ein bit soll eben zwischen start und stop 1 sein, 
außerhalb 0

so ungefähr:

always@(SCL and negedge SDA)
begin
online = 1;
end

always@(SCL and posedge SDA)
begin
online = 0;
end

aber leider stellt sich quartus ständig quer und will nicht mal sowas 
übersetzen:

always@(reset or negedge SDA)
begin
online = SCL & !reset;
end

wobei unschwer zu erkennen ist, dass es sich hier um ein 
flankengesteuertes D-FF mit asynchronen reset handelt.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber leider stellt sich quartus ständig quer und will nicht mal sowas
> übersetzen:
>
> always@(reset or negedge SDA)
> begin
> online = SCL & !reset;
> end
>
> wobei unschwer zu erkennen ist, dass es sich hier um ein
> flankengesteuertes D-FF mit asynchronen reset handelt.

Normalerweise schreibt man <= und nicht = bei flankengesteuerten 
Blöcken.

Autor: Stefan Helmert (Firma: dm2sh) (stefan_helmert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so hab ich hab es nun scheinbar hingekriegt - siehe anhang.


der <= hat auch nichts gebracht
ich möchte gerne mal wissen, wie diese FlipFlops, die ich da verwendet 
habe, in verilog beschrieben wurden. warum muss man da eigentlich alles 
immer so umständlich beschreiben, kann da quartus nicht viel toleranter 
sein und es richtig übersetzen?

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Xilinx gibt es eine Dokumentation zum Compiler, in der genau 
beschrieben wird, wie man in Verilog und VHDL bestimmte Strukturen, z.B. 
DFFs beschreiben muss.
Ich wäre überrascht wenn es das für Quartus nicht gäbe.
Vielleicht solltest Du danach suchen und sie lesen ...

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.