My One-Pin FPGA Weaver Transmitter: Four Quadrature Mixers and a Phase-Domain Summator

July 27, 2026

One-pin Weaver radio · physical I/Q combination

My transmitter is four quadrature mixers followed by a phase-domain summator. Two baseband I/Q sigma-delta streams undergo the first Weaver conversion. The resulting two one-bit signals control a four-state selector that realizes the two 216 MHz carrier mixers and their sum on one RF pin. N16 then excites a hand-built resonant tank.

At the wanted frequency, the I and Q products reinforce. At the conjugate frequency, they oppose. On July 26 the complete tank-to-receiver path placed a 223.5625 MHz wanted lane 29.44 dB above its 208.4375 MHz true conjugate image. A wider 500 kHz upper-sideband run produced the rectangular spectrum I wanted, with only 1.14 dB of level spread across its flat core.

29.44 dBwanted / true image, complete path
35.2measured loaded tank Q
1.14 dB500 kHz flat-core spread
1 pinfinal programmable RF output
Three genuine receiver views of the July 26 one-pin Weaver transmitter: the square upper sideband, the 208.5 megahertz true conjugate image region, and the 216 megahertz four-phase carrier
The July 26 Weaver triad: the square 223.25–223.75 MHz upper sideband, the 208.5 MHz true conjugate-image region, and the 216 MHz physical carrier. This wideband triad measured 20.28 dB raw wanted/image separation; the separate narrow-lane pair measured 29.44 dB and appears below. Levels are receiver-relative, not dBm. Download the plotted spectra.

Four Quadrature Mixers End in a Phase-Domain Summator

A Weaver transmitter uses two quadrature mixer pairs: four mixers altogether. Physical27 sigma-delta encodes I and −Q into one bit each. A +7.5 MHz quadrant sequence performs the first mixer pair as exact swaps and inversions of the complete two-bit word. Its outputs are two one-bit intermediate signals.

Those two signals control a four-state selector. Each state is the algebraic result of the second pair of quadrature mixers operating on 0°, 90°, 180°, and 270° phases of the physical 216 MHz PLL clock. The selector is therefore a phase-domain summator: it realizes both 216 MHz carrier mixers and their sum on one RF pin. N16 switches that result high or high impedance into the tank.

Let Q′ denote the selected quadrature polarity; Physical27 uses Q′ = −Q. The first two mixer products form I1 = I·cos(IF) − Q′·sin(IF) and Q1 = I·sin(IF) + Q′·cos(IF). The second two mixer products enter the summator as I1·cos(LO) − Q1·sin(LO). The LO+IF terms reinforce while the LO−IF terms cancel. Reversing Q′ swaps which side survives.

Physical27 Weaver path with two baseband I/Q sigma-delta streams, a first quadrature mixer pair, two one-bit intermediate signals, and a four-state selector that performs the phase-domain sum of the two 216 megahertz carrier mixers on N16
The active Physical27 path implements four quadrature mixers followed by a phase-domain summator. The final selector emits their summed state on one RF pin.

The April 2025 mod_apr20.sv used opposing sawtooth baseband sources, two one-bit sigma-delta streams, the same four-mixer Weaver structure, and the same phase-domain summator. Physical27 is its architectural descendant: the frontend now generates PRBS16 QPSK, but the two one-bit intermediate signals, four physical carrier phases, high/high-impedance N16 boundary, and resonant tank remain.

I Removed the Pilot and the Carrier Fell Away

On July 25 I sent a narrow QPSK upper branch through the FPGA, N16, tank, nominal 3 dB pad, and RTL-SDR. A deliberate +I pilot made the translated center conspicuous. Removing only that pilot pushed the center line down by 23.41 dB while changing wanted power by 0.01 dB and the local opposite branch by 0.08 dB.

With the pilot gone, the wanted branch stood 18.87 dB above the opposite branch and the residual translated center was 28.00 dB below the wanted signal. Visually, this was the orthogonal-looking spectrum I had been chasing: information occupied one side while the local opposite branch and translated center fell away.

Physical comparison of the one-pin transmitter with and without a deliberate in-phase pilot, showing the carrier fall 23.41 decibels while wanted and opposite QPSK branches remain nearly unchanged
The same FPGA image, QPSK bytes, tank, pad, receiver gain, and fixed integration masks before and after removing the pilot. The local opposite branch around the translated center is not the 208 MHz true RF conjugate image. Levels are receiver-relative. Download the measured ratios.

The Square Upper Sideband Was the Point

Physical37 streamed signed 16-bit I and Q at 750 ksample/s into the FPGA SDM/DDS/Weaver path. The tank-coupled output filled a 500 kHz upper-sideband core from 223.25 to 223.75 MHz. Its P10-to-P90 level spread was 1.14 dB: visually and numerically close to the flat rectangular band I had been chasing.

I then retuned the same receiver to the true 208.2–208.8 MHz conjugate-image region and to the 216 MHz four-phase carrier. Across those sequential views, raw integrated wanted/image separation was 20.28 dB. The raw 216 MHz carrier was 5.70 dB below the wanted band; a coarse receiver-shape adjustment changed those ratios to 21.48 and 9.81 dB.

The three receiver views at the top use the v15 payload and path while the RTL-SDR tunes sequentially to the wanted band, true image, and carrier. Each view includes its own RF-off baseline. The uninterrupted run then continued after midnight. A later same-configuration four-view sweep improved the 500 kHz flat-core spread to 0.929 dB, placed the 216 MHz carrier 28.85 dB below the desired band, integrated a ±2 kHz translated-center window 38.39 dB below it while excluding the exact tuner-DC bin, and measured 22.52 dB desired/image separation.

July 27 after-midnight same-configuration Weaver measurements showing the wanted rectangular band, 216 megahertz carrier, true conjugate image, and translated-center integration window
Physical136–139, acquired from 1:12 to 1:17 a.m. PDT on July 27, use the same payload, bitstream, rotation, and guarded acquisition sequence. The four receiver tunings are sequential and receiver-relative. Download every plotted bin.

The Narrow Lane Put the True Image 29.44 dB Down

Physical27 sent a narrow FPGA-native QPSK lane at 223.5625 MHz. Physical28 kept the FPGA image, gain, sample rate, cable path, and three-second gate unchanged, then moved only the RTL-SDR tuning to the predicted 208.4375 MHz conjugate image. Signed TX-on-minus-RF-off power in fixed 25 kHz windows gave a 29.44 dB wanted/image ratio.

Across five broad NanoVNA sweeps, S21 was about 7.95 dB higher at 223.5625 MHz than at 208.4375 MHz, so the tank clearly favored the wanted frequency. The NanoVNA sweep and sequential SDR captures used different instruments and reference planes; subtracting 7.95 dB from 29.44 dB would not isolate a digital-only Weaver cancellation figure.

Actual receiver views centered on the 223.5625 megahertz wanted lane and the 208.4375 megahertz true conjugate image with same-capture RF-off traces
The wanted lane and its resolved true conjugate image. This 29.44 dB result belongs to the sequential tank-to-receiver path. Download the plotted windows.

The Tank Turned One-Pin Switching Into Measurable RF Power

The pMOS output does not synthesize a smooth voltage. It injects timed charge into the coupled resonant network and then releases the pin. Electric and magnetic energy continue exchanging in the tank between FPGA edges. That is why this transmitter is not merely a digital pin followed by cosmetic filtering: the RF waveform exists through the interaction of the phase sequence and the tuned matter.

My historical bench sketch notes about −15 dBm beside the earlier 7.5 kΩ coupling path. As a power unit, −15 dBm is 31.6 µW; if that power is delivered into 50 Ω, it corresponds to 39.8 mV RMS or about 112 mV peak-to-peak for a sine wave. The sketch does not name its load, output reference plane, bandwidth, cable correction, or instrument settings, so it remains the earlier noted tank value—not a July 2026 output-power measurement.

Historical one-pin transmitter composite with quadrature sawtooths, the hand-built resonant tank, and the RF analyzer screen near 245.388 megahertz
The original experiment family: I/Q sawtooths, the coupled tank, and a historical analyzer view at 245.388 MHz. The views are not one synchronized capture.
Brian's historical sketch of the FPGA switching waveform, coupling resistor and capacitor, coupled resonant tank, sinusoidal output, and minus 15 dBm note
The contemporaneous topology sketch carries the rounded −15 dBm note and the earlier 7.5 kΩ value.

For the July 26 Physical27 run, the fixed 25 kHz wanted window integrated to −20.85 dB on the receiver analysis scale, and its peak reached −38.55 dBFS per FFT bin. The RTL-SDR chain had no injected reference supplying a frequency-and-gain calibration constant, so converting either number to dBm would invent a reference that was never measured. The next absolute-power pass must sample voltage at a named 50 Ω output plane with the exact bitstream, tank load, carrier setting, probe factor, scope termination, and path loss recorded together.

The Laboratory Became One Causal Loop

The hard part was not merely loading another bitstream. FPGA source, timing closure, volatile programming, live logic state, passive transfer, receiver tuning, RF-off baselines, packet recovery, and the next design decision all had to refer to the same physical event.

I set the architecture, the physical connections, the 222–225 MHz boundary, and the safety rules. The orchestration could then synthesize and place a one-variable change, reject a timing failure, arm telemetry and the RTL-SDR before programming, load only volatile CRAM, verify CDONE, capture one bounded burst, recover the received consequence, and return N16 to high impedance. In response-driven branches it selected the next discriminator from the previous physical result. Predetermined sweeps and unchanged repeats remained ordinary instrument mechanics.

Hardware-in-the-loop cycle from Brian choosing a physical question through FPGA rebuild, armed telemetry and SDR capture, volatile programming, one RF burst, message recovery, and retain or reject decision
Each question crossed the complete boundary: design choice, timed FPGA image, live silicon state, resonant matter, received RF, recovered information, and the next physical question.
171RTL-SDR acquisitions
87configured NanoVNA sweeps
70volatile FPGA loads
42distinct FPGA images

Those counts span different instrument and programming operations across two calendar dates; they are not 258 interchangeable experiments. Receiver captures include RF-off guard time. Most FPGA images emitted one finite burst and then became electrically quiet at N16.

July 25: Make the Physical Boundary Answer Simple Questions

I began by untangling the fixture. The NanoVNA measured the passive network while the transmitter was off. The RTL-SDR then measured the active path with the NanoVNA powered down. Early captures checked tuner behavior, receiver gain, the idle state, finite on/off timing, harmonics within the receiver’s usable range, and whether the ADC hit its rails.

Five complex tank sweeps put the median S21 maximum at 220.783 MHz. The half-power crossings were 217.439 and 223.719 MHz, giving a 6.28 MHz loaded bandwidth and loaded Q of about 35.2. The later 223.5625 MHz QPSK lane lies about 156 kHz inside the upper half-power crossing. Its interpolated median S21 is about −23.22 dB, roughly 2.75 dB below the tank peak.

Close photograph of the hand-built resonant network used by the one-pin transmitter family
The hand-built resonant network. This close photograph belongs to the transmitter family; it is not a photograph of the complete July 26 fixture.
Macro photograph of the HX8K breakout header silkscreen around M16, N16, and ground
The board silkscreen around N16. The RF path uses one programmable output pad, not one wire for the entire experiment.
Five-repeat NanoVNA tank transfer curve with the final 223.5625 megahertz QPSK lane marked just inside the upper half-power crossing
Five complex NanoVNA sweeps of the actual tank. The existing calibration fixes the local measurement plane but is not independently traceable. Download the plotted S21 values.

Then I asked the one-pin boundary a cleaner causal question: if only the sign of Q changes, does the physical RF component cross the carrier? It did. The received peak moved from about −997.9 Hz to +997.9 Hz around the measured midpoint, a 1.996 kHz separation. The same digital-to-physical boundary was controlling direction, not merely gating a carrier.

Full physical receiver spectrum and close view showing that changing only the Q sign moves the selected RF component from 997.925 hertz below the measured midpoint to 997.925 hertz above it
The full 222.5–223.0 MHz receiver view and the close sideband view from two bounded six-second transmissions. Changing only Q's sign reversed the Weaver sideband. Levels are receiver-relative. Download the plotted bins.

I Separated Wanted Shape, Carrier, and Image

On July 26 I separated three physical questions that had been conflated: the wanted-band shape, the residual 216 MHz carrier, and the 208 MHz conjugate image. Each receiver tuning changed one observable boundary, so the next FPGA change could address one mechanism at a time.

July 25, 11:13
I reconstructed the board, tank, coupling path, receiver, and bounded operating sequence.
14:59–16:46
Q-sign reversal and pilot removal made the physical I/Q direction and translated-center suppression visible.
July 26, 16:48–17:50
Physical27 carried FPGA-native PRBS QPSK; Physical28 moved the receiver to the predicted true-image frequency.
20:57–21:23
Physical37 produced the 500 kHz square upper sideband; Physical39 and Physical48 added the true-image and 216 MHz carrier views.
July 27, 01:12–01:17
Physical136–139 repeated wanted, carrier, image, and translated-center views with one payload, bitstream, and rotation.

A Native QPSK Payload Exercised the Weaver Path

The final Physical27 image did not stream payload samples from the host. A PRBS16 generator inside the FPGA began from 0x1D2B, advanced with the recurrence p15 ^ p13 ^ p12 ^ p10, and mapped lane 62 as {p5 ^ 1, p7}. Its four states were 0=+I, 1=+Q, 2=−I, and 3=−Q.

The timing-closed HX8K image used 2,127 of 7,680 logic cells, one of two PLLs, no block RAM, three global buffers, and seven I/O cells. The 12, 30, 108, and 216.03 MHz domains all passed their declared timing constraints. A 324,000,000-cycle gate created one nominal three-second burst at 3,295.9 symbols/s and 6,591.8 gross bits/s.

The April 2025 mod_apr20.sv transmitter used opposing sawtooth baseband sources, two sigma-delta streams, a quadrature IF mixer pair, and the same phase-domain summator for the second two mixers and their RF sum. V10 retains that four-mixer structure, the two one-bit intermediate signals, pMOS-only N16 boundary, and external tank. It replaces the baseband and IF implementation with FPGA-native PRBS QPSK, a complex lane waveform, signed SDMs, complete-word +7.5 MHz rotation, one-shot gating, and direct telemetry. It is a descendant, not a byte-equivalent rebuild of the April 2025 source.

Actual ordered Physical27 FPGA telemetry snapshots of pre-sigma-delta I and Q, I and Q sigma-delta bits, first-mixer DDS quadrant, and phase-domain summator state
Actual ordered snapshots from the live v10 datapath: pre-SDM I/Q, both one-bit SDM outputs, first-mixer DDS quadrant, and phase-domain summator state. USB telemetry is not a sample-synchronous 216 MHz logic analyzer. Download the 120 plotted snapshots.

Follow every v10 stage from PRBS state to N16, including source excerpts, constraints, the exact build command, and the source bundle used by the measured image.

8,592 Bits Crossed the Physical Path

Physical27 armed the RTL-SDR and direct telemetry before programming the FPGA. The receiver captured unsigned 8-bit complex samples at 2.4 MS/s, centered at 223.4875 MHz. The analysis mixed the 223.5625 MHz lane to baseband, averaged groups of 45 input samples, and applied a 257-tap 10 kHz low-pass filter. Channel energy located one 3.008-second burst without using the transmitted sequence.

Actual RTL-SDR spectrum of the final Physical27 QPSK burst around the 223.5625 megahertz wanted lane
The actual received Physical27 spectrum. The level is receiver-relative dBFS per FFT bin, not calibrated power at N16 or at the tank output. Download the plotted spectrum.

A fourth-power carrier tracker learned its smoothing width from early directly observed epochs, then followed received I/Q during held-out data without using held-out truth or decisions. Timing, orientation, clock scale, complex gain, and offset were frozen from the early region. Each symbol came from 13 interpolated samples across the central 72% of its epoch.

The nominal held-out span contained 5,623 epochs. Direct telemetry reached 4,296 of them; 1,327 holes inside that span stayed absent. Across the entire run, 2,332 epochs were missing. None were reconstructed or scored. The 4,296 directly observed symbols became 8,592 checked bits with no observed errors, 2.07% carrier-tracked RMS EVM, and 0.9996 normalized correlation.

Actual held-out Physical27 QPSK constellation with 4296 received symbols clustered tightly around the four ideal cardinal states
All 4,296 held-out, directly observed physical symbols. Zero observed errors in this finite burst is not a zero-BER claim or a BER curve. Continue through the receiver and scoring path.

The Chamber Bounded Each Burst

I ran the bench inside an RF chamber as a transmission-safety boundary. Each final profile used volatile configuration, N16 defaulted to high impedance, PLL or reset loss vetoed RF, and the board’s TX LED followed the real physical gate. Physical27 and Physical28 both ended with idle postflight telemetry: N16 high-impedance, burst inactive, and the TX LED off.

The chamber confined the bounded bursts, but no calibrated exterior field-strength sweep measured what escaped it. Distance, antenna factor, orientation, detector, bandwidth, ambient baseline, uncertainty, and field units were not part of the run, so chamber leakage and regulatory margin remain unquantified. The transmitter was not operated as an outdoor legal-power test.

Listen to an Earlier FM Passage Through the Same Boundary

Before the final FPGA-native PRBS experiment, a July 25 run used complex FM to pass a privacy-neutral spoken progress report through N16, the tank, the nominal 3 dB pad, and the RTL-SDR. The physical demodulation below lasts 9.79 seconds. Against its exact source-phase model, the longer fitted interval reached 0.869 correlation and 4.91 dB single-fit SNR, with a 56.8% EVM-like residual.

The audio is recognizably information-bearing and audibly imperfect. It belongs to the earlier FM branch, not the Physical27 QPSK payload.

Received physical FM demodulation

Download the 16-bit mono WAV

Waveform and relative audio spectrum of the physically demodulated progress-report FM received after N16, the tank, pad, and RTL-SDR
The re-encoded public WAV contains the physical receiver demodulation, not a synthetic reconstruction. Its RIFF container was rebuilt without source metadata.

What I Am Building Next

The next work is traceable conducted power, common-clock timing, repeatability, and a wider experiment envelope.

Working foundation

  • Bounded volatile FPGA images with high-impedance idle behavior.
  • Direct applied-symbol and live-datapath telemetry beside independent RF capture.
  • Repeatable passive tank transfer and same-capture RF-off baselines.
  • Response-driven one-variable experiments that can reject an attractive failure.
  • Finite FPGA-native QPSK recovery through the complete physical path.

Next measurement plane

  • Complete tank schematic, measured BOM, geometry, loading, cables, and named reference planes.
  • Raw TDS3034C waveform at the intended RF output plane, tied to the exact image, carrier setting, load, and scope configuration.
  • Traceable amplitude calibration and conducted output power with uncertainty.
  • Common-trigger or common-clock FPGA/RF timing instead of host-edge association.
  • Repeated bursts, temperature and supply monitoring, drift, and a real BER-versus-condition curve.

Wider laboratory capability

  • Calibrated exterior chamber field-strength sweeps with distance, antenna factor, orientation, detector, bandwidths, ambient baseline, and uncertainty.
  • Final-profile harmonic and out-of-view emissions work with an instrument that can cover the required range.
  • Neutral public audio and packet reruns generated by the final FPGA-native datapath.
  • Multiple active lanes, automatically chosen discriminators, and models that connect RTL changes to separate image, carrier, flatness, and information consequences.
  • A browser control surface that can launch safe predetermined experiments and replay privacy-clean numerical traces.

Build the V10 Transmitter

Run bash scripts/build-v10.sh to regenerate the v10 netlist, route report, and FPGA image; all four declared clocks pass timing. The bundle includes the RTL, generated constants, constraints, build script, route summary, and scorer.

The source is available for study and reproduction; no separate reuse license has been granted.

Source tree

RTL, generated tables, constraints, build script, route summary, and a local scoring program.

Open the build README

Scored symbols

The privacy-clean held-out table and scorer recompute symbol errors, bit errors, RMS EVM, and normalized correlation.

Download 4,296 points

Complete source bundle

One ZIP contains the RTL, generated constants, constraints, build and scoring programs, route summary, and held-out points.

Download the v10 source bundle