mikrocontroller.net

Forum: FPGA, VHDL & Co. Verilog: Vereinfachung von Auswertung parameter?


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: Nick M. (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Kann man sowas in Verilog einfacher schreiben?

Präziser: Geht da irgendwas mit `define um die Negierung bei der 
Zuweisung automagisch einzusetzen?
Oder irgendwas anderes kompaktes? Den code zu kopieren erscheint mir 
nicht sinnvoll.

Ich stell mir was in der Richtung vor:
4'h0: segments[6:0] = `negate 7'b0000110;
Allerding soll das 'negate' nur lokal sein.

Beispiel:
module HexToSeg #(parameter activeHigh = 1) (
  input wire [3:0] hex,
  output reg [6:0] segments
)

  always @* begin
    if (activeHigh) begin
      case (hex)
        4'h0: segments[6:0] = 7'b0000110;
        ...
      endcase
    end
    else begin
      case (hex)
        4'h0: segments[6:0] = ~7'b0000110;
        ...
      endcase
    end
  end

endmodule

Gruß & Dank,
Nick

Wieso gibt es denn kein tag für Verilog-Formatierung, sondern nur für 
VHDL? Das ist ja schrecklich! ;-)

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist nicht gnaz klar, was du mit "lokalem negate" meinst.

Ich würde das if und den ganzen else-Zweig weglassen und als letztes 
Statement im always-Block schreiben

segments_out[6:0] = activeHigh ? segments[6:0] : ~segments[6:0];

Oder was meinst du?

Autor: Nick M. (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> Oder was meinst du?

Ah! OK, das ist eine Lösung, an die dachte ich auch mal.
Aber Dein Vorschlag generiert doch im Fall der Negierung zusätzliche 
Gatter, oder?
Gibt es eine Lösung, die bei der Synthese komplett rausoptimiert wird, 
aber ohne das Bitmuster zu wiederholen.

Also so nicht:

4'h0: segments[6:0] = activeHigh ? 7'b0000110 : ~7'b0000110;


Nick

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nick M. schrieb:
> Aber Dein Vorschlag generiert doch im Fall der Negierung zusätzliche
> Gatter, oder?

Nein, die Synthese erkennt das und passt die Konstanten so an, dass die 
Invertierung wegfällt. Solche Optimierungen auf Gatterbene solltest Du 
wirklich der Synthese überlassen, die macht das besser als es jeder 
Mensch könnte. Das erlaubt es dir, den Code möglichst leicht 
verständlich zu schreiben. Die anschließende Optimierung ist "not your 
Job" :-)

Autor: Nick M. (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> Die anschließende Optimierung ist "not your
> Job" :-)

Good to hear! :-)
Danke, dann mach ich das so. Ich kann es mir ja dann noch auf 
Gatterebene ansehen was tatsächlich passiert ist...


Danke,
Nick

Autor: Nick M. (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HA!

Jetzt hab ich die Lösung für mein ursprüngliches Ziel:
if (activeHigh)
  localparam negate = 7'b0000000;
else
  localparam negate = 7'b1111111;

...
    4'h0: segments[6:0] = negate ^ 7'b0000110;


Nicht ausprobiert!

Nick

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so gehts vermutlich auch. kann sein, dass du die 
localparam-Deklaration in eine generate-Umgebung packen musst.

Oder du sagst negate={7{activeHigh}}

Ob das alles die Verständlichkeit deines Sourcecodes fördert, musst du 
selbst entscheiden :-) Die Logik nach der Synthese dürfte aber immer die 
gleiche sein.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte negate={7{~activeHigh}}, sorry

Autor: Nick M. (muellernick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> Die Logik nach der Synthese dürfte aber immer die
> gleiche sein.

Das gehört nun mal zum Lernen und Ausprobieren. Und auch zum leserlichen 
Code schreiben.

Danke für Deine Tips!

Nick

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.