XOR-signaal in verilog

Ik heb bijvoorbeeld een signaal als dit:
wire [18:0] A;

Ik moet het met zichzelf XOR maken met meerdere XOR-poorten die maximaal 4 ingangen hebben. Dit signaal zou dus als volgt worden opgesplitst:

XOR the first 4 bits [3:0] 
XOR the next 4 bits [7:4] 
XOR the next 4 bits [11:8] 
XOR the next 4 bits [15:12] 
XOR the remaining 3 bits together [18:16]

Hoe kan ik een signaal op deze manier met zichzelf XOR maken? En wat is de beste manier om dit te doen?


Antwoord 1, autoriteit 100%

Er zijn een aantal manieren om dit te doen. Een manier zou kunnen zijn om een XOR-module met 4 ingangen te bouwen en vervolgens meerdere exemplaren te instantiëren.

module myXOR4 ( input a, input b, input c, input d, output f);
    assign f = a ^ b ^ c ^ d; // ^ is the XOR operator
endmodule
// ...
myXOR4 xor1 (A[0],A[1],A[2],A[3],out[0]);
myXOR4 xor2 (A[4],A[5],A[6],A[7],out[1]);
// etc

Een andere manier zou zijn om een for-loop te gebruiken. Dit zal niet met alle gevallen werken, omdat je niet een gelijk deelbaar aantal draden hebt.

reg [4:0] out;
integer i;
always@(*) begin
    for (i=0; i<4; i=i+1) 
        out[i]=A[4*i] ^ A[4*i+1] ^ A[4*i+2] ^ A[4*i+3];
    out[4] = A[18] ^ A[17] ^ A[16];
end

Er zijn enkele andere trucs (zoals 0-padding van de bovenste bits van A om het gelijkmatig deelbaar te maken, wat de lussen eenvoudiger maakt), maar ze zullen allemaal hetzelfde resultaat opleveren, dus dit zou genoeg moeten zijn om je bent begonnen.

Other episodes