Wednesday, October 5, 2011

How to implement an ASIC Mix signal for an Automotive application: ASIC's Supply Pin connected to a car battery

Here are some implementation details related to the specification outlined in the other blog entry:  ASIC Mix signal Specification: Automotive application: ASIC's Supply Pin connected to a car battery  ( reffered as “Specification”).


The implementation will be divided  on analog and digital part.

Analog part

To monitor VBAT_uv or VBAT_ov we could use analog comparators. Here is an example of Unbuffered, Two-Stage CMOS Operational Amplifier that we could use an analog comparator.


In the Specification it was mentioned just VBat ( car battery voltage ) but to use the comparator we will need in the ASIC couple more reference voltages and currents.
  • a reference current Iref for a current mirror used in the comparator
  • a reference voltage Vref for alimentation of comparator transistors
  • a reference voltage 1.2V (used in voltage comparison). Here is an assumption made that the reference voltage 1.2V is a very stable voltage produced by  another analog circuit present in the ASIC:  e.g. bandgap.


Here is a hint how to use two instances of the comparator to produce VBAT_uv and VBAT_ov.

There is no need to detect VBAT_ov and VBAT_uv if a digital block of the ASIC Mix signal is under POR ( Power-On-Reset). VBAT_ov and VBAT_uv signals will exit analog block of the ASIC and enter the digital block, but if digital block is under reset,  the register flag vbat_ouv is not recorded anyway.

Digital part

Output of the analog part ( or its comparators ), VBAT_uv and VBAT_ov are inputs to digital part. A reasonable assumption here is that digital block is designed in synchronous manner meaning it is using only one clock (“clk”).
Before any use of non synchronous digital input signals VBAT_uv and VBAT_ov should be first resynchronized to the clock domain clk  using 2 Dff back to back.






t_VBAT_uv and  t_VBAT_ov are implemented also in digital block.










© 2011 ASIC Stoic. All rights reserved.

Wednesday, September 28, 2011

Verilog AMS: Code examples

Resistor, Capacitor, Inductor, RLC Circuit, Voltage and Current Sources, A Simple Circuit, Relay Digitally controlled Relay, Comparator, Simple 16-bit digital-to-analog converter model, Simple DAC ( digital input async. or no clock involved),DAC ( digital input async. or no clock involved, but  with reference voltage), Simple DAC ( digital input sync. on clock ), Analog tristate buffer, Voltage deadband amplifier, Hysteresis

Code examples

Resistor


In general, a resistor is a relationship between voltage and current, as in
v = ri
where v represents the voltage across the resistor, i represents the current through the
resistor and r is value of resistance of resistor.
v = V(p,n)
i = I(p,n)
v = ri

module resistor (p, n);
inout p, n;
electrical p, n;

parameter real R = 1.0;
analog
V(p,n) <+ R * I(p,n);
endmodule

 

Capacitor

A capacitor is a relationship between voltage and charge, as in where v represents the voltage across the capacitor, q represents the charge through the capacitor and c is capacitance of capacitor:

q = cv

Capacitors current  is related to its charge like this:
i = dq/dt

So for a linear capacitor, current is:

i = c dv/dt

which is encoded as a Verilog-A/MS contribution statement as
I(p,n) <+ c * ddt(V(p,n));


// Linear capacitor
module capacitor (p, n);
parameter real c=0; // capacitance (F)
inout p, n;
electrical p, n;
analog
I(p,n) <+ c * ddt(V(p,n));
endmodule

Inductor


An inductor is a relationship between flux and current, where Φ represents the flux across the inductor, i represents the current through the inductor, and l is inductance of inductor.
Φ = li
flux is related to the voltage using:
v = dΦ/dt

the constitutive relation between inductance, voltage and current is:
v = l di /dt


// Linear inductor
module inductor(p, n);
parameter real I=0; // inductance (H)
inout p, n;
electrical p, n;
analog
V(p,n) <+ I * ddt(l(p,n));
endmodule





RLC Circuit




module rlc_behav(ana_in, ana_out) ;
inout ana_in, ana_out ;
electrical ana_in, ana_out ;

parameter real R=1, L=1, C=1 ;

electrical n1 ;

analog begin
V(ana_in, n1)    <+ R*I(ana_in, n1)        ;
V(n1, ana_out) <+ L*ddt(I(n1, ana_out)) ;
I(ana_out)        <+ C*ddt(V(ana_out))     ;
end

endmodule




Voltage and Current Sources

Constant voltage source


// DC voltage source
module vsrc (p, n);
parameter real dc=0; // dc voltage (V)
output p, n;
electrical p, n;
analog
V(p,n) <+ dc;
endmodule



Constant current source

// DC current source
module isrc (p, n);
parameter real dc=0; // dc current (A)
output p, n;
electrical p, n;
analog
l(p,n) <+ dc;
endmodule


A Simple Circuit






//A simple circuit
`include “V_const.vams”
`include “condensator.vams”
module smpl_ckt;
electrical p,n;

V_const        #(.dc(1)) V_const (p,n);
condensator #(.c(1F)) Cond-1  (p,n);
endmodule

Relay

A relay is a switch controlled by analog input (ana_inp),ideal in the sense that when the relay is closed ( ana_inp > treshold ), there is no voltage on its output (ana_out), and when it is open( ana_inp < treshold ) there is no current flowing though its ana_out output contact.


Verilog-A/MS model for an ideal relay.
// Ideal relay
`include “disciplines.vams”
module relay (ana_in, ana_out);
parameter real treshold =0;
output ana_out;
input ana_in;
electrical ana_out, ana_in;

ground gnd ;
analog begin
@(cross( V(ana_in) – treshold , 0 ))
;
if (V(ana_in) > thresh)
V(ana_out) <+ 0;
else
l(ana_out) <+ 0;
end
endmodule

Digitally controlled Relay


module switch (p, n, s);
input s;
output p, n;
logic s;
electrical p, n;
analog begin
if (s)
V(p, n) <+ 0.0;
else
l(p, n) <+ 0.0;
end
endmodule




Comparator

 
The input of this module is an analog input ( ana_inp ) and  the output is a logic signal ( dig_out ).

The output changes when the ana_inp crosses a certain voltage threshold, described as absolute value of parameter offset and parameter hysteresis. The parameter hysteresis provides the capability to add a hysteresis between the lower and the upper thresholds.

// Comparator with logic output
module comparator ( dig_out, ana_inp );
parameter real offset           = 0;
parameter real hysteresis = 0.0 from [0:inf);
inout ana_inp;
output dig_out;
electrical ana_inp;
logic dig_out;
reg dig_out;

ground gnd ;

parameter real thrlo = offset – 0.5*hyst; // Lower threshold voltage (V)
parameter real thrhi = offset + 0.5*hyst; // Upper threshold voltage (V)
always @(above(V(ana_inp) – thrhi))
dig_out = 1;
always @(above(thrlo – V(ana_inp)))
dig_out = 0;
endmodule


Simple 16-bit digital-to-analog converter


analog process is sensitive to the value of in at all times

Simple DAC ( digital input async. or no clock involved)

e.g. module dac (out, in);
parameter fullscale = 1.0;
input [15:0] in;
electrical out;
analog
V(out) <+ in * (fullscale/65536);
endmodule




Simple DAC ( digital input sync. on clock )


analog process is only sensitive to the value of in at the instant of a rising edge on clk


module dac (out, in, clk);
parameter fullscale = 1.0;
input [15:0] in;
input clk;
electrical out;
real smpld;
analog begin
@(posedge clk)
smpld = in * (fullscale/65536);
V(out) <+ smpld;
end
endmodule

Analog tristate buffer

This module evaluates the case statement whenever in changes and will set the local
variable value to 0 if in is 0 and to 1 if in is 1. Otherwise it leaves value unchanged.

Finally, it tests the value of in and if not z it drives V(out) with value, otherwise it
leaves out un-driven.

module buf3 (out, in);
input in;
output out;
electrical out;
real value;
analog begin
@(in)
case (in)
1'b0: value = 0;
1'b1: value = 1;
endcase
          
if (in !== 1'bz)
V(out) <+ value;
end
endmodule

Voltage deadband amplifier

If the input voltage is greater than vin_high or less than vin_low, the amplifier is active.
When the amplifier is active, the output is gain times the differential voltage between the input voltage and the edge of the deadband.

When the input is in the deadband between vin_low and
vin_high, the amplifier is quiescent and the output voltage is zero.



module vdba(in, out);
input in ;
output out ;
electrical in, out ;
parameter real vin_low = -2.0 ;
parameter real vin_high = 2.0 ;
parameter real gain = 1 from (0:inf) ;

analog begin
if (V(in) >= vin_high) begin
V(out) <+ gain*(V(in) - vin_high) ;
end
else if (V(in) <= vin_low) begin
  V(out) <+ gain*(V(in) - vin_low) ;
end
else begin
V(out) <+ 0 ;
     end
 end

endmodule




Hysteresis




//--------------------
// hysteresis
//
// -  rectangular hysteresis
//

module hysteresis(Vin, Vout);
input Vin ;
output Vout;
electrical Vin, Vout;
parameter integer hyst_state_init=1;
parameter real Vout_high = 1 ;
parameter real Vout_low = -1;
parameter real Vout_high = 1 ;
parameter real Vout_low = -1;

  integer hyst_state;
  real    Vout_val;

  analog begin

     @ ( initial_step ) begin
      hyst_state = hyst_state_init;
     end

     @ (cross (V(Vin) - Vout_high,1) )
        if (hyst_state == 0)
           hyst_state = 1;

     @ (cross (V(Vin) - Vout_low,-1) )
        if (hyst_state == 1)
           hyst_state = 0;
 
     if (hyst_state == 1) begin
           Vout_val = Vout_high;
     end
     else begin
           Vout_val = Vout_low;
     end

     V(Vout) <+ transition (Vout_val);
  end
endmodule

© 2011 ASIC Stoic. All rights reserved.