![]() |
|
Module: sampencbank Hierarchy: pulsenet: sampencbank |
It's useful to look at the icon for sampencbank, so that we can clearly see the inputs and outputs.
|
Module: sampencbank (icon) Hierarchy: pulsenet: sampencbank |
The capture below shows a closeup of one of eight sampler_encoders in each sampencbank module.
![]() |
|
Module: sampencbank (closeup of sampencbank -
lower left in top-level capture) Hierarchy: pulsenet: sampencbank |
The capture below shows a closeup of the coinc_detect module.
![]() |
|
Module: sampencbank (closeup of coinc_detect -
lower right in top-level capture) Hierarchy: pulsenet: sampencbank |
Here's a capture of the inside of the coinc_detect block. It's rather simple: an array of AND gates to detect the coincidences, clocked D-flip-flops to latch the coincidences, and an inverter horn to drive a large output.
![]() |
|
Module: coinc_detect Hierarchy: pulsenet: sampencbank: coinc_detect |
The capture below shows a closeup of the astmux module and several assorted drivers.
![]() |
|
Module: sampencbank (closeup of astmux - middle in top-level capture) Hierarchy: pulsenet: sampencbank |
Here's a capture of the inside of the top quater of the astmux block. The triangular modules that are gated by pix_add_ast[0] are just pass gates.
![]() |
|
Module: astmux Hierarchy: pulsenet: sampencbank: astmux |
Here's a capture of the pass gate. in passes to out when control is high.
![]() |
|
Module: pass Hierarchy: pulsenet: sampencbank: astmux: pass (elsewhere, too) |
The capture below shows a closeup of one of three coincmuxes.
![]() |
|
Module: sampencbank (closeup of coincmux -
one of three in upper right in top-level capture) Hierarchy: pulsenet: sampencbank |
Here's a capture of coincmux. It's also just a bunch of pass gates.
![]() |
|
Module: coincmux Hierarchy: pulsenet: sampencbank: coincmux |
The capture below show a closeup of the shift register chains.
![]() |
|
Module: sampencbank (closeup shift register delay lines -
middle in top-level capture) Hierarchy: pulsenet: sampencbank |
Here's a capture of shiftmem2. It contains the same shift register elements (2X lev1 = 8 stages) as membank..
![]() |
|
Module: shiftmem2 Hierarchy: pulsenet: sampencbank: shiftmem2 |
Now let's go through the hierarchy levels of sampler_encoder. Here's a look inside. We can see the single analog input ("in"), Vref[6:0], and the two clocks enter on the left. The sampling happens in two sampler_7 blocks. The 7-bit outputs of these blocks are encoded to 3-bit Gray code in the encoder blocks. The outputs also go to the sampmux block where c_ast[6:0] and c_coinc[6:0] determine which bit of the 7 bit streams will pass to the astronomy module and coinc_detect (in sampencbank), respectively.
The encoder is not shown in detail because it was was synthesized from verilog.
![]() |
|
Module: sampler_encoder Hierarchy: pulsenet: sampencbank: sampler_encoder |
Here's the inside of sampmux. It contains two 1-of-7 muxes ("mux7" -- just a bunch of pass gates) that act to select 1-of-seven bits from each of the data streams.
![]() |
|
Module: sampmux (top half) Hierarchy: pulsenet: sampencbank: sampler_encoder: sampmux |
sampler_7 is one level deeper still into the sampler. It just distributes the single analog input to seven samplers ("senselatch") along with the seven voltages for comparison. Note that Vref[0] is apparently wired backwards (in on "+", not "-"); this is not an error. Vref[0] is the veto voltage threshold. Since it is positive with respect to in's DC voltage, the inputs have to be reversed to that a veto produces out[0]=1.
![]() |
|
Module: sampler_7 Hierarchy: pulsenet: sampencbank: sampler_encoder: sampler_7 |
senselatch is basically two comparitors (strongarm and sarmlatch) and a latch (srmod).
![]() |
|
Module: senselatch Hierarchy: pulsenet: sampencbank: sampler_encoder: sampler_7: senselatch |
strongarm is a gate-isolated sense amplifier. The output nodes (xp and xn) are precharged high when ck is low. The input pair (an and ap) converts the differential input voltage into a differential current, which is integrated on bn and bp. When the source node corresponding to the high input, say bn, reaches a threshold drop below Vdd the transistor above this node begins conducting, transferring charge imbalance to xn and xp. This starts the regenerative action of the cross-coupled inverters at the top and the circuit quickly latches the state.
(Note of interest: It's called strongarm because it was originally used as a flip-flop in the StrongArm microprocessor.)
![]() |
|
Module: strongarm Hierarchy: pulsenet: sampencbank: sampler_encoder: sampler_7: senselatch: strongarm |
sarmlatch is similiar to strongarm, and was included for the extra gain it provides.
![]() |
|
Module: sarmlatch Hierarchy: pulsenet: sampencbank: sampler_encoder: sampler_7: senselatch: sarmlatch |
srmod stores the 1-bit comparitor measurement when clock goes low.
![]() |
|
Module: srmod Hierarchy: pulsenet: sampencbank: sampler_encoder: sampler_7: senselatch: srmod |
For reference, here are links to the schematics shown above:
The nodes in the simulations of senselatch (the three stages above
cascaded) below are named with a stage prefix (s1, s2, s3). For
example, the node ap in sarmlatch (stage 1) would be s1_ap.
Below is the extraction technique I used to get accurate model (C
within 0.1fF). Note that the accuracy is needed. When I tried these
simulations with parasitic capacitances to within 1fF, I observed
slightly different results and unusual behavior.
Simulation 0 -- No Parasitic Capacitance:
Screen 2 -- Zoom In
(t = 48ns - 58ns; DeltaV = -1mV - +4mV)
Simulation 1 -- Basic Performance:
Screen 2 -- Zoom In
(t = 34ns - 42ns; DeltaV = -8mV - -4mV)
Screen 3 -- Zoom In
(t = 36ns - 40ns; DeltaV = -7mV - -5mV)
Symmetry in senselatch_test.spi:
What is the origin of the asymmetry between Simulations 1 and 2?
Specifically, why is there a -6mV offset for stage 1 in Simulation 2?
The table below shows all of the parasitic capacitance lines from the
spice file for senselatch (senselatch_test.spi). I sorted it by node
and grouped by stage (s1 on the left, etc.). Note that in stage
1, there is total symmetry between the p and n sides for the inputs
(s1_ap/s1_an). There is a slight asymmetry in for the integrating
nodes of s1 (s1_bp/s1_bn) -- a little extra capacitance between s1_bn
and all nodes compared with s1_bp and all nodes.
I manually changed the capacitance values for s1_bp/s1_bn so that they
were pairwise equal and ran the simulation again. The -6mV voltage
offset disappeared! I then tried changing the capacitance values one
at a time, to see if one of them was critical, but it appears that
they all matter, as one would expect. So, perhaps I should look for
the asymmetry in layout and try to fix it?
Testing:
In the design review, someone raised the concern that the 2nd stage
of gain in senselatch (sarmlatch) would latch before the 1st stage had
a chance to latch. An offset voltage in the 2nd stage could
exaccerbate this problem. The simulations below examine the issue.
in magic: extract do all
in magic: extract
commandline: ext2spice -c 0.1 filename.ext
commandline: sed 's/fet/mos/g' filename.spice > filename.spi
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test.{mag, ext, spi} with all capacitor
lines removed from .spi)
Screen 1 -- Large View
(t = 0ns - 102ns; DeltaV = -25mV - +25mV)
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test.{mag, ext, spi}) with the
capacitor lines included. (Compare with Simulation 0.)
Screen 1 -- Large View
(t = 0ns - 102ns; DeltaV = -25mV - +25mV)
| Stage 1 | Stage 2 | Stage 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
Simulation 2 -- Negative Offset Voltage:
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test2.spi) in which connections between
s1_xn/s2_an and s1_xp/s2_ap were cut in layout and an offset voltage
was inserted between the nodes as shown in the HSPICE lines below:
voffsetp s1_xp s2_ap -0.020
voffsetn s1_xn s2_an +0.020
|
|
Screen 2 -- Zoom In (t = 50ns - 56ns; DeltaV = 0mV - +3mV)
|
|
Simulation 3: Positive Offset Voltage
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test2.spi) in which connections between
s1_xn/s2_an and s1_xp/s2_ap were cut in layout and an offset voltage
was inserted between the nodes as shown in the HSPICE lines below:
voffsetp s1_xp s2_ap +0.020
voffsetn s1_xn s2_an -0.020
|
|
Screen 2 -- Zoom In (t = 22ns - 38ns; DeltaV = +11mV - +19mV)
|
|
Simulation 4: Add Capacitance to x2_bp
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test.spi)
Add 3fF between s2_bp and GND.
No offset voltages
|
|
Screen 2 -- Zoom In (t = 34ns - 40ns; DeltaV = -8mV - -5mV)
|
|
Simulation 5: Add Capacitance to x2_bn
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test.spi)
Add 3fF between s2_bn and GND.
No offset voltages
|
|
Screen 2 -- Zoom In (t = ns - ns; DeltaV = +mV - +mV)
|
|
Simulation 6: Add MORE Capacitance to x2_bn
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test.spi)
Add 10fF between s2_bn and GND.
No offset voltages
|
|
Screen 2 -- Zoom In (t = 34ns - 60ns; DeltaV = -17mV - +5mV)
|
|
Screen 3 -- Zoom In (t = 38ns - 42ns; DeltaV = -6mV - -4mV)
|
|
Screen 4 -- Zoom In (t = 52ns - 56ns; DeltaV = +1mV - +3mV)
|
|
Simulation 7: Decrease Tail Transistor Size
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test3.spi)
change transistor size of tail transistor in stage2 (gate=ck,
source=tail, drain=GND) to 6-lambda. The default size is 10-lambda.
no offset voltages
|
|
Screen 2 -- Zoom In (t = 38ns - 42ns; DeltaV = -6mV - -4mV)
|
|
Simulation 8: Decrease Tail Transistor Size AND add 10fF to s2_bn
s1_ap = 1.475V to 1.525V in 50 clock cycles (100ns), 0.5mv/ns (1mv/clock)
s1_an = 1.500V
Use layout netlist (senselatch_test3.spi)
change transistor size of tail transistor in stage2 (gate=ck,
source=tail, drain=GND) to 6-lambda. The default size is 10-lambda.
no offset voltages
|
|
Screen 2 -- Zoom In (t = ns - ns; DeltaV = +mV - +mV)
|
|
sim9: add inverters between clocks, keep voffsets
Last updated: 12/01/2004
Back to main page