Modeling Analog to Digital Converters

The basic approach to modeling ADCs is to simply subtract an offset from the input and then scale the result such that the smallest valid input value maps to the smallest output code and the largest valid input value maps to the largest output code. Then one simply casts that value to an integer and clips the result.

Here is a Verilog-AMS model with an electrical input of a 6-bit ADC with an input range of −1 V ⋯ 1 V:

module adc (out, in, clk);
output [5:0] out; input in, clk;
electrical in;
integer result;

always @(posedge clk) begin
    result = 64*(V(in)+1)/2;
    if (result > 63) result = 63;
    else if (result < 0) result = 0;
end

assign out = result;

endmodule

Here is the same model again, but this time with a wreal input:

module adc (out, in, clk);
output [5:0] out; input in, clk;
wreal in;
integer result;

always @(posedge clk) begin
    result = 64*(in+1)/2;
    if (result > 63) result = 63;
    else if (result < 0) result = 0;
end

assign out = result;

endmodule

As always, things are more complex if you are limited to using Verilog-A. A similar example of an ADC model in Verilog-A is given here.