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.