summaryrefslogtreecommitdiff
path: root/Windows/spice/examples/memristor
diff options
context:
space:
mode:
authorrahulp132020-02-28 11:38:58 +0530
committerrahulp132020-02-28 11:38:58 +0530
commit246319682f60293b132fca1ce6e24689c6682617 (patch)
tree6871b758a17869efecfd617f5513e31f9a933f4a /Windows/spice/examples/memristor
parentd9ab84106cac311d953f344386fef1c1e2bca1cf (diff)
downloadeSim-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.sp65
-rw-r--r--Windows/spice/examples/memristor/memristor_x.sp83
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