Source / Read the circuit
pipeline_align.sv
lessons/adc_digital/rtl/pipeline_align.sv
`timescale 1ns/1ps
// AD04: stage k presents sample n-k. Residue is signed8/F4 at stage3.
// Output r0 is signed12/F8. Illegal trits or mismatched aligned tags fault.
module pipeline_align(input wire clk, rst_n,
input wire [3:0] valid,
input wire [7:0] decisions,
input wire [127:0] ids,
input wire signed [7:0] residue,
output reg out_valid, fault,
output reg [31:0] out_id,
output reg signed [11:0] value);
reg signed [1:0] d0[0:2], d1[0:1], d2;
reg [31:0] id0[0:2], id1[0:1], id2;
reg v0[0:2], v1[0:1], v2;
integer i;
wire signed [11:0] w0={{10{d0[2][1]}},d0[2]};
wire signed [11:0] w1={{10{d1[1][1]}},d1[1]};
wire signed [11:0] w2={{10{d2[1]}},d2};
wire signed [11:0] w3={{10{decisions[7]}},decisions[7:6]};
wire signed [11:0] wr={{4{residue[7]}},residue};
always @(posedge clk) begin
if (!rst_n) begin
out_valid<=0; fault<=0; out_id<=0; value<=0; d2<=0; id2<=0; v2<=0;
for(i=0;i<3;i=i+1) begin d0[i]<=0; id0[i]<=0; v0[i]<=0; end
for(i=0;i<2;i=i+1) begin d1[i]<=0; id1[i]<=0; v1[i]<=0; end
end else begin
d0[0]<=decisions[1:0]; id0[0]<=ids[31:0]; v0[0]<=valid[0];
d1[0]<=decisions[3:2]; id1[0]<=ids[63:32]; v1[0]<=valid[1];
d2<=decisions[5:4]; id2<=ids[95:64]; v2<=valid[2];
for(i=1;i<3;i=i+1) begin d0[i]<=d0[i-1]; id0[i]<=id0[i-1]; v0[i]<=v0[i-1]; end
d1[1]<=d1[0]; id1[1]<=id1[0]; v1[1]<=v1[0];
out_valid<=0;
if (v0[2] && v1[1] && v2 && valid[3]) begin
if (id0[2]!=id1[1] || id0[2]!=id2 || id0[2]!=ids[127:96] ||
d0[2]==-2 || d1[1]==-2 || d2==-2 || decisions[7:6]==2'b10)
fault<=1;
else if (!fault) begin
out_valid<=1; out_id<=id0[2];
value<=(w0<<<7)+(w1<<<6)+(w2<<<5)+(w3<<<4)+wr;
end
end
end
end
endmodule