// Binary to Thermometer decoder // Implements two options: // Start_Bit = 0: Decimal 0 equals thermometer 0 // Start_Bit = 1: Decimal 0 equals thermometer 1 // Change binary_bits variable for your needs! // Source: AnalogHub.ie `include "constants.vams" `include "disciplines.vams" `define binary_bits 4 // define number of binary bits here module bin2therm(in,out); input [`binary_bits-1:0] in; output [2**`binary_bits-1:0] out; voltage [`binary_bits-1:0] in; voltage [2**`binary_bits-1:0] out; parameter real vdd = 1; // voltage level of logic 1 (V) parameter real vss = 0; // voltage level of logic 0 (V) parameter real threshold = 0.5; // logic threshold level (V) parameter integer Start_Bit = 0; // defines if thermometer starts from 0 or 1 real dout[2**`binary_bits-1:0]; // internal result variable integer code; genvar i; analog begin // convert binary input to code code = 0; for (i = 0; i < `binary_bits; i = i + 1) begin @(cross(V(in[i]) - threshold)) ; if (V(in[i]) > threshold) code = code + (1 << i); end //$display("Code = %d", code); case (Start_Bit) 0: begin // Decimal 0 equals thermometer 0 for(i=1;i<2**`binary_bits+1;i=i+1) begin if(code!=i) begin dout[i-1]=vss; end else begin dout[i-1]=vdd; end end end 1: begin // Decimal 0 equals thermometer 1 for(i=0;i<2**`binary_bits;i=i+1) begin if(code!=i) begin dout[i]=vss; end else begin dout[i]=vdd; end end end endcase // Plotting outputs for (i=0; i<2**`binary_bits; i=i+1) V(out[i]) <+ transition(dout[i],0,0); end endmodule