294 Oscillating Bones

294 : Oscillating Bones

Design render

How it works

A stylish ring oscillator built from SkullFET transistors — MOSFETs hand-drawn in the shape of skulls. A chain of 21 SkullFET inverters forms a ring oscillator that generates a ~120 MHz square wave; an 8-bit ripple divider then produces /2 through /256 taps on uo_out[0..7]. The raw oscillation is brought out on the analog pin ua[0] through one more SkullFET wired as a buffer, so an external probe/load on ua[0] can't pull the ring frequency.

This is the gf180mcu (GlobalFoundries 180nm) port of the design, migrated from the original IHP sg13g2 version. The SkullFETs are 3.3V devices running directly on the 3.3V core supply (VDPWR). The skull artwork is preserved verbatim from the original; only the layer stack, device implants and feature sizes were retargeted to gf180mcuD (a uniform 1.45× scale clears the 180nm width/spacing/gate rules; grid-snap, exact-cut and metal-slot passes then make it KLayout sign-off-clean — see scripts/remap_to_gf180.py).

Layout

Pin Signal Post-layout frequency
ua[0] osc_out (buffered raw 3.3V oscillation) ~120 MHz
uo_out[0] osc_div_2 ~60 MHz
uo_out[1] osc_div_4 ~30 MHz
uo_out[2] osc_div_8 ~15 MHz
uo_out[3] osc_div_16 ~7.5 MHz
uo_out[4] osc_div_32 ~3.7 MHz
uo_out[5] osc_div_64 ~1.9 MHz
uo_out[6] osc_div_128 ~0.94 MHz
uo_out[7] osc_div_256 ~0.47 MHz

(uo_out[0] is the LSB / ÷2, uo_out[7] the MSB / ÷256.) All unused outputs — uio_out[7:0] and the output-enables uio_oe[7:0] — are tied low in the macro, so the bidirectional pads stay in input mode.

Post-layout simulation (extract the hardened GDS with magic, simulate with the gf180mcuD ngspice models — run make sim): the ring oscillates rail-to-rail at ~120 MHz and the 8-stage divider produces clean /2 .. /256 taps. The testbench supplies only VDPWR/VGND and the substrate bias — it does not force any std-cell rail or device well, so the result reflects the actual extracted connectivity (every pfet body is tied to VDPWR through its n-well tap, every std-cell rail is strapped to VDPWR/VGND — nothing floats). With the buffer, a swept capacitive load on ua[0] (0→10 pF) leaves the ring frequency unchanged at ~120 MHz; without it the same load would drop the ring 25–60 %.

Simulation results

osc_out (the buffered ~120 MHz oscillation on ua[0]) and the first three divider taps, captured from the post-layout netlist (make plot):

Simulation results

Reset

rst_n (active-low) resets only the divider — it asynchronously clears all eight flip-flops, so while rst_n is held low the divided taps uo_out[0..7] sit at 0. The 21-stage ring oscillator has no reset and free-runs whenever the design is powered, so ua[0] keeps oscillating at full speed even during reset. Release rst_n (high) and the divider starts counting from a known phase. clk and ena are not used — the ring self-clocks the divider.

How to test

Connect an oscilloscope to a low divider tap such as uo_out[7] (÷256, ~0.5 MHz) or uo_out[4] (÷32, ~3.7 MHz) — scope-friendly. The fast taps and the buffered ua[0] (~120 MHz) exceed typical GPIO bandwidth, so the analog pin ua[0] is the place to look for the raw oscillation. Note that uo_out[0..7] stay at 0 until you release rst_n.

External hardware

None — just an oscilloscope.

IO

#InputOutputBidirectional
0osc_div_2
1osc_div_4
2osc_div_8
3osc_div_16
4osc_div_32
5osc_div_64
6osc_div_128
7osc_div_256

Analog pins

uaPCB PinInternal indexDescription
0B814osc_out

Chip location

Controller Mux Mux Mux Mux Mux Analog Mux Analog Mux Mux Mux Mux Analog Mux Mux Mux Analog Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_tnt_gf_555 (tnt's recreation of a 555 on GF180mcu) tt_um_mcml_vco (MCML VCO) tt_um_tnt_gf_vco (Quadrature VCO) tt_um_oscillating_bones (Oscillating Bones) tt_um_MichaelBell_tinyQV (TinyQV Risc-V SoC) tt_um_essen (256x8 SRAM) tt_um_analog_factory_test (TT GF180mcuD Analog Factory Test) tt_um_cw_testbuffer (TT GF180mcuD Testbuffer) tt_um_fabulous_gf_0p3 (Tiny FABulous FPGA) tt_um_fabulous_gf_0p3_3v3 (Tiny FABulous FPGA (3.3V version)) tt_um_htfab_momcap (MoM capacitor) tt_um_gf_r2r_dac (GF R2R DAC) tt_um_AbAdA_2048 (Abad2048) tt_um_mattvenn_signal_generator (Simple Signal Generator) tt_um_74hct00 (74HCT00 Quad 2-Input NAND (3.3 V)) tt_um_algofoogle_gf_analog (algofoogle analog stuff) tt_um_LPCAS_TTGF0P3_TP1 (3.3V Folded Cascode OTA ) tt_um_kianV_rv32ima_uLinux_SoC (KianV uLinux SoC) tt_um_kiterai_current_dac (Analog 4 bit Current DAC) tt_um_urish_simon (Simon Says memory game) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_urish_usb_cdc (USB CDC (Serial) Device) tt_um_a1k0n_nyancat (VGA Nyan Cat) tt_um_rahulbhagwat_gf180_bandgap_reference (GF BGR) tt_um_odgrip_polywave (PolyWave) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_combined (Philippine flag waving) tt_um_gojimmypi_ttgfa_UART_FSM_TRNG_Lab (Hardware Entropy Explorer: UART/SPI TRNG and PUF) tt_um_gojimmypi_ttgfa_UART_FSM_TRNG_Lab_analog (Hardware Entropy Explorer: UART/SPI TRNG and PUF (Analog)) tt_um_coldbrew (Until heat death do us part) Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available