Source / Read the circuit
dwa_encoder.sv
lessons/adc_digital/rtl/dwa_encoder.sv
`timescale 1ns/1ps
// AD05: eight unit elements, q=0..8; state changes only on valid requests.
module dwa_encoder(input wire clk, rst_n, valid,
input wire [3:0] q, output reg [7:0] select,
output reg out_valid, error);
reg [2:0] pointer;
integer j;
always @(posedge clk) begin
if (!rst_n) begin pointer<=0; select<=0; out_valid<=0; error<=0; end
else begin
out_valid<=0; error<=0;
if (valid) begin
if (q>8) error<=1;
else begin
select<=0;
for (j=0;j<8;j=j+1)
if (j<q) select[(pointer+j)%8]<=1;
pointer<=pointer+q; out_valid<=1;
end
end
end
end
endmodule