// N-bit Digital to Analog Converter // LSB is <0> // Change binary_bits variable for your needs! // Author: A. Sidun // Source: AnalogHub.ie `include "constants.vams" `include "disciplines.vams" `define bits 12 // define number of binary bits here module DAC(out, in, clk); parameter real vmin = 0.0; // minimum input voltage (V) parameter real vmax = 1.0 from (vmin:inf); // maximum input voltage (V) parameter real td = 0; // delay from clock edge to output (s) parameter real tt = 0; // transition time of output (s) parameter real vdd = 5.0; // voltage level of logic 1 (V) parameter real vss = 0; // voltage level of logic 0 (V) parameter real thresh = (vdd+vss)/2; // logic threshold level (V) parameter integer dir = +1 from [-1:1] exclude 0; // 1 for trigger on rising edge // -1 for falling localparam real fullscale = vmax - vmin; output out; input [`bits-1:0] in; input clk; voltage out, clk; voltage [`bits-1:0] in; real aout; integer weight; genvar i; analog begin @(cross(V(clk) - thresh, dir) or initial_step) begin aout = 0; weight = 2; for (i = `bits - 1; i >= 0; i = i - 1) begin if (V(in[i]) > thresh) begin aout = aout + fullscale/weight; end weight = weight*2; end end V(out) <+ transition(aout + vmin, td, tt); end endmodule