Verilog: Vereinfachung von Auswertung parameter?

Gast #6013455
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:
1
4'h0: segments[6:0] = `negate 7'b0000110;
Allerding soll das 'negate' nur lokal sein.

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

6
  always @* begin
7
    if (activeHigh) begin
8
      case (hex)
9
        4'h0: segments[6:0] = 7'b0000110;
10
        ...
11
      endcase
12
    end
13
    else begin
14
      case (hex)
15
        4'h0: segments[6:0] = ~7'b0000110;
16
        ...
17
      endcase
18
    end
19
  end
20

21
endmodule

Gruß & Dank,
Nick

Wieso gibt es denn kein tag für Verilog-Formatierung, sondern nur für 
VHDL? Das ist ja schrecklich! ;-)
Gast
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?
Gast
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
Gast
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" :-)
Gast
HA!

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

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

Nicht ausprobiert!

Nick
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.