diff options
author | rahulp13 | 2020-02-28 11:38:58 +0530 |
---|---|---|
committer | rahulp13 | 2020-02-28 11:38:58 +0530 |
commit | 246319682f60293b132fca1ce6e24689c6682617 (patch) | |
tree | 6871b758a17869efecfd617f5513e31f9a933f4a /Windows/spice/examples/memristor | |
parent | d9ab84106cac311d953f344386fef1c1e2bca1cf (diff) | |
download | eSim-246319682f60293b132fca1ce6e24689c6682617.tar.gz eSim-246319682f60293b132fca1ce6e24689c6682617.tar.bz2 eSim-246319682f60293b132fca1ce6e24689c6682617.zip |
initial commit
Diffstat (limited to 'Windows/spice/examples/memristor')
-rw-r--r-- | Windows/spice/examples/memristor/memristor.sp | 65 | ||||
-rw-r--r-- | Windows/spice/examples/memristor/memristor_x.sp | 83 |
2 files changed, 148 insertions, 0 deletions
diff --git a/Windows/spice/examples/memristor/memristor.sp b/Windows/spice/examples/memristor/memristor.sp new file mode 100644 index 00000000..fdb9488a --- /dev/null +++ b/Windows/spice/examples/memristor/memristor.sp @@ -0,0 +1,65 @@ +Memristor with threshold +* Y. V. Pershin, M. Di Ventra: "SPICE model of memristive devices with threshold", +* arXiv:1204.2600v1 [physics.comp-ph] 12 Apr 2012, +* http://arxiv.org/pdf/1204.2600.pdf + +* Parameter selection and plotting by +* Holger Vogt 2012 + +.param stime=10n +.param vmax = 3 + +* send parameters to the .control section +.csparam stime={stime} +.csparam vmax={vmax} + +Xmem 1 0 memristor +* triangular sweep (you have to adapt the parameters to 'alter' command in the .control section) +*V1 1 0 DC 0 PWL(0 0 '0.25*stime' 'vmax' '0.5*stime' 0 '0.75*stime' '-vmax' 'stime' 0) +* sinusoidal sweep +V1 0 1 DC 0 sin(0 'vmax' '1/stime') + +* memristor model with limits and threshold +* "artificial" parameters alpha, beta, and vt. beta and vt adapted to basic programming frequency +* just to obtain nice results! +* You have to care for the physics and set real values! +.subckt memristor plus minus PARAMS: Ron=1K Roff=10K Rinit=7.0K alpha=0 beta=20e3/stime Vt=1.6 +Bx 0 x I='((f1(V(plus)-V(minus))> 0) && (V(x) < Roff)) ? {f1(V(plus)-V(minus))}: ((((f1(V(plus)-V(minus)) < 0) && (V(x)>Ron)) ? {f1(V(plus)-V(minus))}: 0)) ' +Vx x x1 dc 0 +Cx x1 0 1 IC={Rinit} +Rmem plus minus r={V(x)} +.func f1(y)={beta*y+0.5*(alpha-beta)*(abs(y+Vt)-abs(y-Vt))} +.ends + +* transient simulation same programming voltage but rising frequencies +.control +*** first simulation *** +* approx. 100 simulation points +let deltime = stime/100 +tran $&deltime $&stime uic +* plot i(v1) vs v(1) +*** you may just stop here *** +* raise the frequency +let newfreq = 1.1/stime +let newstime = stime/1.1 +let deltime = newstime/100 +alter @V1[sin] [ 0 $&vmax $&newfreq ] +tran $&deltime $&newstime uic +* raise the frequency even more +let newfreq = 1.4/stime +let newstime = stime/1.4 +let deltime = newstime/100 +alter @V1[sin] [ 0 $&vmax $&newfreq ] +tran $&deltime $&newstime uic +* the 'programming' currents +plot tran1.alli tran2.alli alli title 'Memristor with threshold: Internal Programming currents' +* resistance versus time plot +settype impedance xmem.x1 tran1.xmem.x1 tran2.xmem.x1 +plot xmem.x1 tran1.xmem.x1 tran2.xmem.x1 title 'Memristor with threshold: resistance' +* resistance versus voltage (change occurs only above threshold!) +plot xmem.x1 vs v(1) tran1.xmem.x1 vs tran1.v(1) tran2.xmem.x1 vs tran2.v(1) title 'Memristor with threshold: resistance' +* current through resistor for all plots versus voltage +plot i(v1) vs v(1) tran1.i(v1) vs tran1.v(1) tran2.i(v1) vs tran2.v(1) title 'Memristor with threshold: external current loops' +.endc + +.end diff --git a/Windows/spice/examples/memristor/memristor_x.sp b/Windows/spice/examples/memristor/memristor_x.sp new file mode 100644 index 00000000..1c283e73 --- /dev/null +++ b/Windows/spice/examples/memristor/memristor_x.sp @@ -0,0 +1,83 @@ +Memristor with threshold as XSPICE code model +* Y. V. Pershin, M. Di Ventra: "SPICE model of memristive devices with threshold", +* arXiv:1204.2600v1 [physics.comp-ph] 12 Apr 2012, +* http://arxiv.org/pdf/1204.2600.pdf + +* XSPICE code model, parameter selection and plotting by +* Holger Vogt 2012 + +* ac and op (dc) simulation just use start resistance rinit! + +.param stime=10n +.param vmax = 4.2 + +* send parameters to the .control section +.csparam stime={stime} +.csparam vmax={vmax} + +*Xmem 1 0 memristor +* triangular sweep (you have to adapt the parameters to 'alter' command in the .control section) +*V1 1 0 DC 0 PWL(0 0 '0.25*stime' 'vmax' '0.5*stime' 0 '0.75*stime' '-vmax' 'stime' 0) +* sinusoidal sweep for transient, dc for op, ac +V1 0 1 DC 0.1 ac 1 sin(0 'vmax' '1/stime') + +Rl 1 11 1k + +* memristor model with limits and threshold +* "artificial" parameters alpha, beta, and vt. beta and vt adapted to basic programming frequency +* just to obtain nice results! +* You have to care for the physics and set real values! +amen 11 2 memr +.model memr memristor (rmin=1k rmax=10k rinit=7k alpha=0 beta='20e3/stime' vt=1.6) + +vgnd 2 0 dc 0 + +* This is the original subcircuit model +.subckt memristor plus minus PARAMS: Ron=1K Roff=10K Rinit=7.0K alpha=0 beta=20e3/stime Vt=1.6 +Bx 0 x I='((f1(V(plus)-V(minus))> 0) && (V(x) < Roff)) ? {f1(V(plus)-V(minus))}: ((((f1(V(plus)-V(minus)) < 0) && (V(x)>Ron)) ? {f1(V(plus)-V(minus))}: 0)) ' +Vx x x1 dc 0 +Cx x1 0 1 IC={Rinit} +Rmem plus minus r={V(x)} +.func f1(y)={beta*y+0.5*(alpha-beta)*(abs(y+Vt)-abs(y-Vt))} +.ends + +* transient simulation same programming voltage but rising frequencies +.control +*** first simulation *** +op +print all +ac lin 101 1 100k +plot v(11) +* approx. 100 simulation points +let deltime = stime/100 +tran $&deltime $&stime uic +* plot i(v1) vs v(1) +*** you may just stop here *** +* raise the frequency +let newfreq = 1.2/stime +let newstime = stime/1.2 +let deltime = newstime/100 +alter @V1[sin] [ 0 $&vmax $&newfreq ] +tran $&deltime $&newstime uic +* raise the frequency even more +let newfreq = 1.4/stime +let newstime = stime/1.4 +let deltime = newstime/100 +alter @V1[sin] [ 0 $&vmax $&newfreq ] +tran $&deltime $&newstime uic +* the resistor currents +plot tran1.alli tran2.alli alli title 'Memristor with threshold: currents' +* calculate resistance (avoid dividing by zero) +let res = v(1)/(I(v1) + 1e-16) +let res1 = tran1.v(1)/(tran1.I(v1) + 1e-16) +let res2 = tran2.v(1)/(tran2.I(v1) + 1e-16) +* resistance versus time plot +settype impedance res res1 res2 +plot res vs time res1 vs tran1.time res2 vs tran2.time title 'Memristor with threshold: resistance' +* resistance versus voltage (change occurs only above threshold!) +plot res vs v(1) res1 vs tran1.v(1) res2 vs tran2.v(1) title 'Memristor with threshold: resistance' +* current through resistor for all plots versus voltage +plot i(v1) vs v(1) tran1.i(v1) vs tran1.v(1) tran2.i(v1) vs tran2.v(1) title 'Memristor with threshold: external current loops' +.endc + +.end |