Southampton VHDL-AMS Validation Suite

School of Electronics and Computer Science, University of Southampton

 

  Home Example Models Web Parser Acknowledgement ESD Group ECS University of Southampton
 

Van der Pol Oscillator

Lorenz Chaos

Bouncing Ball

Level3 MOS Transistor

Bipolar Transistor with Thermal Effects

AnalogueSchmitt Trigger

VoltageControlled Oscillator with Integration of Phase

Phase-Locked-LoopFrequency Multiplier

Switch-modePower Regulator

Ferromagnetic Hysteresis

Sigma-Delta Modulator

Ballistic CNT

MEMS Accelerometer with SD control loop

 

 

 

Ballistic CNT Transistor

 

<<Previous<<        >>Next>>

 

 

-- VHDL-AMS model of CNT Transistor I-V Characteristics
-- (c) Southampton University 2007
-- Southampton VHDL-AMS Validation Suite
-- author: Dafeng Zhou, Tom J Kazmierski and Bashir M Al-Hashimi
-- School of Electronics and Computer Science, University of Southampton
-- Highfield, Southampton SO17 1BJ, United Kingdom
-- Tel. +44 2380 593520   Fax +44 2380 592901
-- e-mail: dz05r@ecs.soton.ac.uk, tjk@ecs.soton.ac.uk
-- Created: 17 October 2007
-- Last revised:  17 October 2007 (by Dafeng Zhou)

--

------------------------------------------------------------------

--
-- Description:
-- This is a simple, fast DC model which indicates the I-V

-- characteristics of ballistic carbon nanotube transistors.
--

--------------------------------------------------------------------------------

 

-- 1. VHDL-AMS Model of Ballistic CNT Transistor

 

library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;

library work;
use work.cntcurrent.all;

entity CNTTransistor is
    generic( -- model parameters
            T   : real := 300.0;
            dcnt: real := 1.0E-9;
            Ef  : real := -0.32*1.6E-19);
    port(terminal drain, gate, source, bulk: electrical);
end entity CNTTransistor;

architecture Characteristic of CNTTransistor is

    --terminal values
    quantity Vd across drain to bulk;
    quantity Vg across gate to bulk;
    quantity Vs across source to bulk;
    quantity Ids through drain to source;


begin

    Ids == Fcnt(Vg, Vs, Vd, Ef, T, dcnt);

end architecture Characteristic;

 

--------------------------------------------------------------------------------

 

--2. Package of Cntcurrent

 

-- This package defines how the DC characteristics of the ballistic CNT

-- transistor is calculated. To avoid the complicated and time-consuming

-- integration, this approach employs a piece-wise approximation of the

-- charge densities and simplifies the calculation into quadratic analysis.

library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;
 

package cntcurrent is
    function Fcnt(Vg, Vs, Vd, Ef, T, dcnt: real)
    return real;
end package cntcurrent;

package body cntcurrent is

    -- some physical constants
    constant e0 : real := 8.854E-12;
    constant pi : real := 3.1415926;
    constant t0 : real := 1.5E-9;
    constant L  : real := 3.0E-8;
    constant q  : real := 1.6E-19;
    constant k  : real := 3.9;
    constant acc : real := 1.42E-10;
    constant Vcc : real := 3.0*1.6E-19;
    constant h  : real := 6.625E-34;
    constant hbar : real := 1.05E-34;
    constant m0 : real := 9.11E-31;
    constant KB : real := 1.380E-23;

    function Fcnt(Vg, Vs, Vd, Ef, T, dcnt: real) return real is
            variable Vds, Ids, Eg, CB, ms, Em, Tm, goD, NoD, A, N0, c, Cox, Cge, Cse, Cde, Ctot, y : real;
        begin
            Eg := 2.0*acc*Vcc/dcnt;
            Cox := 2.0*pi*k*e0/log((t0+dcnt/2.0)*2.0/dcnt);
            Cge := Cox;
            Cse := 0.097*Cox;
            Cde := 0.040*Cox;
            Ctot:= Cge+Cse+Cde;
            ms := m0*1.3*acc/dcnt;
            if Ef > -0.32*q then
                Em := exp((1.0-1.5E-9/t0)/2.0)/exp((Ef/q+0.32)/0.4313);
            else
                Em := 1.0;
            end if;
            Tm := 0.8+T/1500.0;
            goD := 2.0*sqrt(2.0*ms/pi/hbar/hbar);
            NoD := sqrt(KB*T)/2.0*Em*Tm*goD;
            A := NoD/2.0;
           
            N0 := 1.0/3.0*Em*exp(0.32)*exp((Ef/q+0.5)/0.025);
            c := -q*(Vg*Cge+Vs*Cse+Vd*Cde)/Ctot;
            Vds := Vd - Vs;

            if (q*Vds/KB/T>6.0) then
           
                if ((Ef-(c+q*q/Ctot*(-N0)))/KB/T<=-3.0) then
                    y := (Ef-(c+q*q/Ctot*(-N0)))/KB/T;
                elsif (-3.0<(-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot) ) and ( (-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot)<=3.0) then
                    y := (-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot);
                elsif (3.0<(Ef-c+q*q/Ctot*N0)/(KB*T+A*q*q/Ctot) ) and ( (Ef-c+q*q/Ctot*N0)/(KB*T+A*q*q/Ctot)<=(-3.0+q*Vds/KB/T)) then
                    y := (Ef-c+q*q/Ctot*N0)/(KB*T+A*q*q/Ctot);
                elsif ((-3.0+q*Vds/KB/T)<(-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot) ) and ( (-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot)<=(3.0+q*Vds/KB/T)) then
                    y := (-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot);
                elsif ((3.0+q*Vds/KB/T)<(Ef-c+q*q*N0/Ctot+A*q*q/Ctot*q*Vds/KB/T)/(KB*T+2.0*A*q*q/Ctot)) then
                    y := (Ef-c+q*q*N0/Ctot+A*q*q/Ctot*q*Vds/KB/T)/(KB*T+2.0*A*q*q/Ctot);
                else
                    y := 0.0;
                end if;

            elsif (0.0<=q*Vds/KB/T) and (q*Vds/KB/T<=6.0) then

                if ((Ef-(c+q*q/Ctot*(-N0)))/KB/T<=-3.0) then
                    y := (Ef-(c+q*q/Ctot*(-N0)))/KB/T;
                elsif (-3.0<(-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot) ) and ( (-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot)<=(-3.0+q*Vds/KB/T)) then
                    y := (-(A*q*q/2.0/Ctot+KB*T)+SQRT((A*q*q/2.0/Ctot+KB*T)*(A*q*q/2.0/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+3.0*A*q*q/4.0/Ctot)))/(1.0/6.0*A*q*q/Ctot);
                elsif ((-3.0+q*Vds/KB/T)<(-((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/6.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+1.5))))/(1.0/3.0*A*q*q/Ctot) ) and ( (-((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/6.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+1.5))))/(1.0/3.0*A*q*q/Ctot)<=3.0) then
                    y := (-((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.0-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/6.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+1.5))))/(1.0/3.0*A*q*q/Ctot);
                elsif (3.0<(-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot) ) and ( (-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot)<=(3.0+q*Vds/KB/T)) then
                    y := (-((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)+SQRT(((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)*((1.5-1.0/6.0*q*Vds/KB/T)*A*q*q/Ctot+KB*T)-4.0*1.0/12.0*A*q*q/Ctot*(c-q*q*N0/Ctot-Ef+A*q*q/Ctot*(1.0/12.0*q*q*Vds*Vds/KB/KB/T/T-q*Vds/2.0/KB/T+0.75))))/(1.0/6.0*A*q*q/Ctot);
                elsif ((3.0+q*Vds/KB/T)<(Ef-c+q*q*N0/Ctot+A*q*q/Ctot*q*Vds/KB/T)/(KB*T+2.0*A*q*q/Ctot)) then
                    y := (Ef-c+q*q*N0/Ctot+A*q*q/Ctot*q*Vds/KB/T)/(KB*T+2.0*A*q*q/Ctot);
                else
                    y := 0.0;
                end if;

            else
                y := 0.0;
            end if;

            IDS := 4.0*q*KB*T/h*(log(1.0+exp(y))-log(1.0+exp(y-q*Vds/KB/T)));

            return Ids;
    end function Fcnt;
end package body cntcurrent;
 

 

--------------------------------------------------------------------------------

 

--3. Constant Voltage Source

 

-- This source provides the gate voltage to the transistor.

 

library IEEE;

use IEEE.math_real.all;

use IEEE.electrical_systems.all;

 

entity v_source is

       generic(lv: voltage);

       port(terminal po, ne:electrical);

end entity v_source;

 

architecture vol of v_source is

       quantity v across i through po to ne;

begin

       v == lv;

end architecture vol;

 

--------------------------------------------------------------------------------

 

--4. Pulse Voltage Source

 

-- This source provides the drain voltage to the transistor.

 

library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;

entity v_pulse is
    generic(
            initial: real:= 0.0;
            pulse : real:= 5.0;
            tchange : time:= 5sec); -- initial to pulse [Sec]
    port(terminal po, ne: electrical);
end entity v_pulse;

architecture behaviour of v_pulse is
    function time2real(tt : time) return real is
    begin
    return time'pos(tt) * 1.0e-15;
    end time2real;

    constant slope:real:=pulse/time2real(tchange);

    quantity v across i through po to ne;
    -- Signal used in CreateEvent process below
    signal pulse_signal : real := initial;
begin

    v==pulse_signal'slew(slope);

    CreateEvent : process
    begin
    wait until domain = time_domain; -- Run process in Time Domain only
    pulse_signal <=pulse;
    end process CreateEvent;

end architecture behaviour;

 

--------------------------------------------------------------------------------

 

--5. Testbench

 

library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;

entity test_CNTTransistor is
end entity test_CNTTransistor;

architecture test of test_CNTTransistor is
    terminal d, g: electrical;
    alias ground is ELECTRICAL_REF;
begin
    vg: entity v_source generic map(lv=>0.6)

                            port map(po=>g, ne=>ground);
    vd: entity v_pulse generic map(pulse=>1.0,tchange=>1sec)

                            port map(po=>d, ne=>ground);
    transistor:entity CNTTransistor port map(drain=>d, gate=>g, source=>ground, bulk=>ground);
end architecture test;

 

--------------------------------------------------------------------------------

 

--6. Simulation Results

 


 

<<Previous<<        >>Next>>         Top^

 

School of Electronics and Computer Science, University of Southampton, Highfield, Southampton S017 1BJ, United Kingdom