Forum: FPGA, VHDL & Co. parity ermitteln in Verilog


von Micha (Gast)


Lesenswert?

Ich hab gerade eine Gehirnverknotung - hab mir ein Verilog Codeispiel 
für eine CPU angeschaut. Viele Sachen verstehe ich schon, z.B. die 
Verwendung unärer bitweiser Logik-Operatoren wie z.B. sowas:
1
reg [7:0] register;
2
...
3
wire reg_is_zero = ~|register;
4
wire reg_not_zero = |register;

Bei dem folgenden Beispiel setzt allerdings mein Verständnis aus:
1
wire parity = ~^register;

Selber wär ich nie auf sowas einfaches gekommen. Sogar in einem Lehrbuch 
hab ich das schon wesentlich komplizierter gesehen. Mir ist überhaupt 
nicht klar wie die Bits des Registers im Beispiel ge-XOR-t werden bzw. 
wie man damit zu einer Parität kommt. Kann mir eventuell jemand einen 
Verständnis-Anschubs geben?

von Lattice User (Gast)


Lesenswert?

Ein XOR ist ein 1 bit Addierer.
Es werden also alle Bits des Vektors aufaddiert. Bei gerader Anzahl von 
Einsen ist das Ergebniss 0, ansonsten 1.

von Micha (Gast)


Lesenswert?

@Lattice user: vielen Dank! Anhand der Erklärung als 1-Bit Adderbekomme 
ich eine Vorstellung wie es funktioniert.

Eigentlich wollte ich diesen Thread nicht nochmal ausgraben. Hab aber 
heute beim Durchsehen meines Krimskrams diesen Beispielcode gefunden, 
den ich neulich aus einem Tutorial im www ausgeschnippelt hatte:
1
function parity;
2
input [31:0] data;
3
integer i;
4
begin
5
  parity = 0;
6
  for (i= 0; i < 32; i = i + 1) begin
7
    parity = parity ^ data[i];
8
  end
9
end
10
endfunction

Mal abgesehen dass hier noch paar andere Aspekte  reinspielen (macht es 
Sinn, sowas in eine function auszulagern, Ergebnis komplementär zum Bsp. 
oben, 32 Bit statt 8), ist die "Parity" Aufgabe hier auf die 
Tippel-Tappel-Tour gelöst, mit einer for-next Konstruktion. Sehr viel 
umständlicher, aber ohne viel Nachdenken für einen gelernten 
Software-Programmierer auf Anhieb zu verstehen.
Interessant wär, auszuprobieren ob beide Varianten zu einem 
vergleichbaren Synthese-Ergebnis führen. Muss ich mal ausprobieren...

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Micha schrieb:
> macht es Sinn, sowas in eine function auszulagern

Nicht in Verilog. Die Schleife hat einen festen Bereich und ist daher 
weniger flexibel.

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.