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


von Nick M. (Gast)


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:
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! ;-)

von Vancouver (Gast)


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?

von Nick M. (Gast)


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

von Vancouver (Gast)


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" :-)

von Nick M. (Gast)


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

von Nick M. (Gast)


Lesenswert?

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

von Vancouver (Gast)


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.

von Vancouver (Gast)


Lesenswert?

Ich meinte negate={7{~activeHigh}}, sorry

von Nick M. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.