1. Dual-Mode Baseband-Modem
The Dual-Mode Baseband-Modem (BM) is responsible for handling the transmission and reception of both Bluetooth LE and IEEE 802.15.4 packets. For Bluetooth Low Energy, the BM handles Bluetooth Low Energy 1M Uncoded Link Layer Packets. For IEEE 802.15.4, the BM handles packets transmitted according to the PHY standard for the O-QPSK modulation in the 2.4 GHz band. Additionally the BM exposes an interface for the CPU to read/write various information (e.g. tuning bits) to the analog RF.
There are two primary sub-components in the Baseband-Modem, the Baseband, and the Modem. The baseband is responsible for the bit-stream processing of incoming and outgoing packets. The modem is responsible for modulation on the TX side, and digital image rejection and demodulation on the RX side.
1.1. Architecture Overview
![rx chain diagram](./images/rx_chain_diagram.png)
![tx chain diagram](./images/tx_chain_diagram.png)
1.3. Commands and MMIO Registers
The baseband-modem (BM) block contains a set of memory mapped registers used for passing commands to the BM, tuning analog RF components, and making BM status visible to the CPU. The address map is shown below. Note that the addresses are relative to the BM’s base attachment address. For example, if the BM is attached at 0x8000, then the address of 0x04 corresponds to 0x8004.
ADDR | DATA | Size (bits) | Description |
---|---|---|---|
0x00 |
Instruction |
32 |
Instruction received from processor. Contains 4 bits of primary instruction, 4 bits of secondary instruction, then 24 bits of data. |
0x04 |
Additional Data |
32 |
Additional data to write. Set data before writing instructions when applicable. |
0x08 |
Status 0 |
32 |
[2:0] Assembler State |
0x0C |
Status 1 |
32 |
[5:0] Modulation LUT index |
0x10 |
Status 2 |
32 |
[31:0] BLE CDR bit count |
0x14 |
Status 3 |
32 |
[31:0] LRWPAN CDR bit count |
0x18 |
Status 4 |
32 |
[31:0] LO/32 counter |
0x1C |
General trim 0 |
8 |
General trim bits (N/C) |
0x1D |
General trim 1 |
8 |
[0] LO/32 input (external, not implemented) |
0x1E |
General trim 2 |
8 |
General trim bits (N/C) |
0x1F |
General trim 3 |
8 |
General trim bits (N/C) |
0x20 |
General trim 4 |
8 |
General trim bits (N/C) |
0x21 |
General trim 5 |
8 |
General trim bits (N/C) |
0x22 |
General trim 6 |
8 |
General trim bits (N/C) |
0x23 |
General trim 7 |
8 |
Debug Enable (0 = debug enable) |
0x24 |
I VGA gain control |
10 |
Manual VGA value if not using I AGC |
0x26 |
I VGA attenuation reset |
1 |
reset the I AGC |
0x27 |
I VGA attenuation useAGC |
1 |
use I AGC (manual VGA value if not) |
0x28 |
I VGA attenuation sample window |
8 |
I AGC sample window |
0x29 |
I VGA attenuation ideal peak to peak |
8 |
I AGC ideal peak to peak |
0x2A |
I VGA tolerance peak to peak |
8 |
I AGC peak to peak tolerance |
0x2B |
I BPF CHP 0 & 1 |
8 |
I bandpass filter tuning |
0x2C |
I BPF CHP 2 & 3 |
8 |
I bandpass filter tuning |
0x2D |
I BPF CHP 4 & 5 |
8 |
I bandpass filter tuning |
0x2E |
I BPF CLP 0 & 1 |
8 |
I bandpass filter tuning |
0x2F |
I BPF CLP 2 |
4 |
I bandpass filter tuning |
0x30 |
Q VGA gain control |
10 |
Manual VGA value if not using Q AGC |
0x32 |
Q VGA attenuation reset |
1 |
reset the Q AGC |
0x33 |
Q VGA attenuation useAGC |
1 |
use Q AGC (manual VGA value if not) |
0x34 |
Q VGA attenuation sample window |
8 |
Q AGC sample window |
0x35 |
Q VGA attenuation ideal peak to peak |
8 |
Q AGC ideal peak to peak |
0x36 |
Q VGA tolerance peak to peak |
8 |
Q AGC peak to peak tolerance |
0x37 |
Q BPF CHP 0 & 1 |
8 |
Q bandpass filter tuning |
0x38 |
Q BPF CHP 2 & 3 |
8 |
Q bandpass filter tuning |
0x39 |
Q BPF CHP 4 & 5 |
8 |
Q bandpass filter tuning |
0x3A |
Q BPF CLP 0 & 1 |
8 |
Q bandpass filter tuning |
0x3B |
Q BPF CLP 2 |
4 |
Q bandpass filter tuning |
0x3C |
I DCO use |
1 |
toggle using I DCO |
0x3D |
I DCO reset |
1 |
reset the I DCO |
0x3E |
I DCO gain |
8 |
set gain for I DCO (unsigned FixedPoint w/ 2 bit binary point) |
0x3F |
Q DCO use |
1 |
toggle using Q DCO |
0x40 |
Q DCO reset |
1 |
reset the Q DCO |
0x41 |
Q DCO gain |
8 |
set gain for Q DCO (unsigned FixedPoint w/ 2 bit binary point) |
0x42 |
DCOC tuning 1 |
6 |
Manual I current DAC for stage 2 VGA value if not using I DCO |
0x43 |
DCOC tuning 2 |
6 |
Manual Q current DAC for stage 2 VGA value if not using Q DCO |
0x46 |
MUX debug in |
10 |
Debug configuration, input |
0x48 |
MUX debug out |
10 |
Debug configuration, output |
0x4A |
Enable RX I |
5 |
Manual enable RX I values {3’b0, mix, buf, vga_s1, vga_s2, bpf} |
0x4B |
Enable RX Q |
5 |
Manual enable RX Q values {3’b0, mix, buf, vga_s1, vga_s2, bpf} |
0x4C |
Enable VCO LO |
2 |
Manual enable VCO LO {6’b0, vco_lo, lna} |
0x50 |
LUT command |
32 |
LUT set instruction [3:0] LUT ID [9:4] address (index) [31:10] value |
0x54 |
RX error message |
32 |
Interrupt message, RX error message |
0x58 |
RX finish message |
32 |
Interrupt message, RX finish message |
0x5C |
TX error message |
32 |
Interrupt message, TX error message |
0x60 |
FIR command |
32 |
FIR filter reprogramming instruction, [3:0] FIR ID [9:4] coefficient (index) [31:10] value |
0x64 |
I VGA attenuation gain increase |
8 |
I AGC gain increase step size (by LUT index) |
0x65 |
I VGA attenuation gain decrease |
8 |
I AGC gain decrease step size (by LUT index) |
0x66 |
Q VGA attenuation gain increase |
8 |
Q AGC gain increase step size (by LUT index) |
0x67 |
Q VGA attenuation gain decrease |
8 |
Q AGC gain decrease step size (by LUT index) |
In order to pass commands to the BM, two 32-bit registers at addresses 0x00 and 0x04 are utilized. The register at 0x04 contains the additional data field for a given command while the register at 0x00 contains the instruction. Writing to the register at 0x00 is the trigger for the BM to execute a given command. Accordingly, the processor should always write to the additional data register prior to writing to the instruction register for a given command. The format for a BM instruction and a list of available instructions are detailed below.
Bits | 31-8 | 7-4 | 3-0 |
---|---|---|---|
Field |
Data |
Instruction 2 |
Instruction 1 |
1.4. List of Commands
Configure Command
Configure baseband constants. The constant is selected using the instruction 2 field and set to the value specified in the additional data field. In the case that the secondary instruction is set to CONFIG_LUT, reference the LUT addresses provided in the explanations below/
Field | Data | Instruction 2 | Instruction 1 |
---|---|---|---|
Value |
X unless CONFIG_LUT, then LUT address |
See table |
0 |
Field | Additional Data |
---|---|
Value |
Value for the constant to be set to |
Instruction 2 | Name |
---|---|
0x0 |
CONFIG_RADIO_MODE |
0x1 |
CONFIG_CRC_SEED |
0x2 |
CONFIG_ACCESS_ADDRESS |
0x3 |
CONFIG_SHR |
0x4 |
CONFIG_BLE_CHANNEL_INDEX |
0x5 |
CONFIG_LRWPAN_CHANNEL_INDEX |
Configuration instruction descriptions
- (0x0) CONFIG_RADIO_MODE
-
Specify the following in the Additional Data register (0x04) prior to issuing the instruction 0: Set the radio transceiver mode to Bluetooth Low Energy 1: Set the radio transceiver mode to IEEE 802.15.4 LR-WPAN Valid in any radio mode.
- (0x1) CONFIG_CRC_SEED
-
Set the CRC (cyclic redundancy check) seed for the BLE and LR-WPAN CRC circuits to the value in the Additional Data register (0x04). This value changes for BLE and should be 0 for LR-WPAN
- (0x2) CONFIG_ACCESS_ADDRESS
-
Set the BLE Access Address for the BLE uncoded packet. This value must be provided by the CPU. More information may be found in the BLE Baseband section. NOTE: An access address of 0xFFFFFFF6 disables whitening of transmitted BLE packets
- (0x3) CONFIG_SHR
-
Set the LRWPAN SHR to match with for receiving a LRWPAN packet. This value must be provided by the CPU. According to 802.15.4 spec, it should be a fixed value of 0xA700 (only 2 bytes are matched due to lower hardware cost), but is programmable for flexibility.
- (0x4) CONFIG_BLE_CHANNEL_INDEX
-
Values for the channel index can range from 0 to 39, corresponding to BLE channel frequencies beginning at 2402 MHz until 2480 MHz. It is critical to note that the channel index from 0 to 39 is a direct mapping to channel frequencies - NOT the BLE channel numbering scheme that considers advertising channels separately.. For example, setting CONFIG_BLE_CHANNEL_INDEX to 0 will result in a transmission with center frequency at 2402 MHz. This corresponds to BLE channel 37. More information: https://www.rfwireless-world.com/Terminology/BLE-Advertising-channels-and-Data-channels-list.html
- (0x5) CONFIG_LRWPAN_CHANNEL_INDEX
-
Values for the channel index can range from 0 to 15, corresponding to LR-WPAN channel frequencies beginning at 2405 MHz until 2480 MHz.
Send Command
Transmit a specified number of PDU header and data bytes. Bytes are retrieved by the BM by loading them from the specified address.
Field | Data | Instruction 2 | Instruction 1 |
---|---|---|---|
Value |
Number of bytes |
X |
1 |
Field | Additional Data |
---|---|
Value |
Load address |
Receive Enter Command
Place the device into receive mode. If a message is picked up, it will be stored starting at the specified address address.
Field | Data | Instruction 2 | Instruction 1 |
---|---|---|---|
Value |
X |
X |
2 |
Field | Additional Data |
---|---|
Value |
Storage address |
Receive Exit Command
Exit the device from receive mode. This command will succeed as long as the device has not yet matched an instruction preamble.
Field | Data | Instruction 2 | Instruction 1 |
---|---|---|---|
Value |
X |
X |
3 |
Field | Additional Data |
---|---|
Value |
X |
Debug Command
Turns on both the TX and RX paths according to the specified loopback mask before passing the specified number of PDU bytes in a loop. For simplicity the return data is stored at <load address + total bytes> rounded to the next byte aligned address. The loopback mask is used to determine at which point the data should be revered and sent back towards the CC.
Field | Data | Instruction 2 | Instruction 1 |
---|---|---|---|
Value |
Total bytes to send |
Loopback mask |
15 |
Field | Additional Data |
---|---|
Value |
Load address and base for store address calculation |
Loopback Mask | Loopback Point |
---|---|
0b0001 (0x1) |
Empty |
0b0010 (0x2) |
In the modem, loop the FSKTX output back in to the CDR in FSKRX |
0b0100 (0x4) |
Empty |
0b1000 (0x8) |
Empty |
![loopback diagram](./images/loopback_diagram.png)
1.5. Configuring Modem LUTs
The modem LUTs can be configured using the LUT command register in the MMIO map enumerated above (register offset 0x50).
LUT IDs are defined as follows:
- 0x0 - VCO_MOD
-
64-entry, 8-bit valued LUT that is sampled to produce frequency deviations from the center frequency. This LUT must be reloaded on each channel and mode change. 0 indicates the largest negative frequency deviation, 63 indicates the largest positive deviation, and 31 indicates no frequency deviation. Note that 0/63 should be +/-250kHz for BLE and +/-500kHz for LR-WPAN.
- 0x1 - VCO_CT_BLE
-
40-entry LUT sampled with BLE channel index to produce coarse and medium tuning bits to drive the VCO to the center frequency of the BLE channel index selected. Does not apply when in LR-WPAN radio mode.
- 0x2 - VCO_CT_LRWPAN
-
16-entry LUT that is sampled with the LR-WPAN channel index to produce the coarse and medium tuning bits to drive the VCO to the center frequency of the LR-WPAN channel index selected. Does not apply when in BLE radio mode.
- 0x3 - AGC_I
-
64-entry LUT that is sampled to drive the VGA attenuation gain for the I channel VGA. Only the lower 32 entries are used.
- 0x4 - AGC_Q
-
64-entry LUT that is sampled to drive the VGA attenuation gain for the Q channel VGA. Only the lower 32 entries are used.
- 0x5 - DCO_I
-
64-entry LUT that is sampled to drive the current DAC for the I channel stage 2 VGA. Only the lower 32 entries are used.
- 0x6 - DCO_Q
-
64-entry LUT that is sampled to drive the current DAC for the Q channel stage 2 VGA. Only the lower 32 entries are used.
1.6. Configuring the FIR filter coefficients
The FIR filter coefficients can be configured using the FIR command register in the MMIO map enumerated above (register offset 0x60).
FIR IDs are defined as follows:
- 0x0 - NONE
-
Reserved
- 0x1 - TX_GAUSSIAN
-
24-entry, 8-bit FixedPoint (2-bit fractional component) filter for BLE GFSK. Only 16 coefficients are used. Note the filter was designed to run at 8MHz (length = 2*cycles/bit) but there’s a bug in the implementation. The short-term fix to get it working was to double the coefficients.
- 0x2 - RX_HILBERT_I
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for image rejection.
- 0x3 - RX_HILBERT_Q
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for image rejection. The output of the I and Q filters are summed to form the image rejected signal suitable for FSK demodulation.
- 0x4 - RX_MATCH_SIN_F0
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for matched filter for binary 0. Two templates (filters) are used to account for phase shift. Note BLE coefficients are loaded by default. LR-WPAN ones must be loaded separately.
- 0x5 - RX_MATCH_COS_F0
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for matched filter for binary 0. Two templates (filters) are used to account for phase shift. Note BLE coefficients are loaded by default. LR-WPAN ones must be loaded separately.
- 0x6 - RX_MATCH_SIN_F1
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for matched filter for binary 1. Two templates (filters) are used to account for phase shift. Note BLE coefficients are loaded by default. LR-WPAN ones must be loaded separately.
- 0x7 - RX_MATCH_COS_F1
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for matched filter for binary 1. Two templates (filters) are used to account for phase shift. Note BLE coefficients are loaded by default. LR-WPAN ones must be loaded separately.
- 0x8 - RX_LPF
-
32-entry, 16-bit FixedPoint (12-bit fractional component) filter for bitrate filter of the matched filter output. Two filters with the same coefficients are used, one for 0s and another for 1s. Note BLE coefficients are loaded by default. LR-WPAN ones must be loaded separately.
1.7. Interrupts
The Baseband-Modem provides five interrupts as outputs from the Baseband Frontend. These interrupts provide the CPU with triggers for events from the transceiver module. The interrupts are described in the table below:
Interrupt Index | Name | Description |
---|---|---|
0 |
RX_ERROR |
Triggers on recognition of an error while the BM is in RX state. The MMIO register 0x54 will be populated with an RX_ERROR_MESSAGE. Presently not implemented. |
1 |
RX_START |
Triggers when the baseband disassembler/correlator enters the busy state. Denotes that a packet has been received and demodulated, but has not yet been disassembled. |
2 |
RX_FINISH |
Triggers when the disassembler has completed processing an incoming message. Populates the MMIO register RX_FINISH_MESSAGE at 0x58 with the length of the message. |
3 |
TX_ERROR |
Triggers on recognition of an error while the BM is in TX state. The MMIO register 0x5C will be populated with an TX_ERROR_MESSAGE. Presently not implemented. |
4 |
TX_FINISH |
Triggers when the modem has completed transmission of all bytes in the provided message. The DMA read response bytes must match the number of bytes specified in the Send Command for this interrupt to fire. |
1.8. IEEE 802.15.4 LR-WPAN Baseband
![lrwpan baseband](./images/lrwpan_baseband.png)
The LR-WPAN baseband transmission chain involves DMA packet disassembly, LR-WPAN packet assembly, CRC generation, bit-to-symbol translation, and symbol-to-chip translation before the final chip stream is provided to the modem for modulation. The packet is assembled according to the IEEE 802.15.4 (LR-WPAN) PPDU schematic (shown below).
It is important to note the rates at each stage of the baseband TX chain. The standard calls for a 250 kb/s bitrate corresponding to packet assembly/packet disassembly. Following bit-to-symbol translation, the symbol rate becomes 62.5 ksym/s (where 4 bits specifies 1 symbol). Following symbol-to-chip translation, the chip rate now matches the LR-WPAN nominal baseband frequency of 2 MHz frequency or 2 Mchip/s (where 1 symbol specifies 32 chips). The inverse applies for the RX chain.
During packet assembly, a frame check sequence is calculated as a 16-bit ITU-T CRC.
![lrwpan crc diagram](./images/lrwpan_crc_diagram.png)
The algorithm for the CRC begins by setting all remainder registers, r0…r15, to zero. Next, we start from the LSB and shift the MHR and payload into the divider. The FCS is then the remainder register after the last bit of the data is shifted in. Lastly, the FCS is appended to the data field so that register r0 is transmitted first.
![lrwpan ppdu schematic](./images/lrwpan_ppdu_schematic.png)
The frame check sequence (FCS) is appended to the end of the PPDU as the MAC footer (MFR) in the diagram above. If the result of CRC checking is false, the [flag] is set to high, before triggering a RX_ERROR message.
The preamble for 15.4 is a 32-bit sequence of all zeros. The SFD is loosely analogous to the Access-Address (AA) of the BLE Baseband in that they both uniquely identify the start of the packet for the protocol used.
1.9. Bluetooth Low Energy (BLE) Baseband
![ble baseband](./images/ble_baseband.png)
Below is the BLE Uncoded Packet format. All elements of the packet either are or depend on data that the CPU must set (which is taken care of by the SW implementation of the Link Layer). These values are communicated to the packet assembler and disassembler through the controller via the command system over MMIO.
![ble ppdu schematic](./images/ble_ppdu_schematic.png)
The Preamble is an alternating series of 1s and 0s that depends on the LSB of the Access-Address (AA). The CPU need not provide any additional control signals for this part of the packet.
The Access-Address is a special value set by the SW Link Layer that determines whether a packet is valid or not. This value must be provided by the CPU and depends on past communications or may be set to some default value.
The PDU is the already encrypted content of the packet, the CPU must provide this in its entirety. Through the DMA controller, the packet assembler will retrieve this from main memory. The packet disassembler will deliver a PDU to the main memory once one is received.
The CRC (cyclic redundancy check) is derived from the Link Layer state (which must be provided by the CPU via MMIO register). In the receive chain, if the calculated CRC does not match the CRC found in the PDU, the [flag] is set to high.
![ble crc diagram](./images/ble_crc_diagram.png)
1.9.1. Whitening
In order to avoid long continuous sequences of 1s and 0s in the transmitted data, the entire packet goes through a process known as whitening.
![whitening diagram](./images/whitening_diagram.png)
Outgoing data on the TX chain is whitened and incoming data is also “de-whitened”
1.10. Unified FSK Modem
The modem sits between the digital baseband and the ADCs / DAC to analog RF. It is responsible for performing demodulation and modulation and clock and data recovery at a rate of 1Mbps for BLE or 2Mchip/s for LR-WPAN. Each cycle, the digital baseband either receives a new bit from the demodulator, or provides a new bit for transmission to the modulator.
1.10.1. TX Chain
![modem tx schematic](./images/modem_tx_schematic.png)
The digital baseband bit-stream process outputs individual bits into a FIFO that will be consumed by the modem for use in modulation. For BLE transmissions, the bitstream is modulated using Gaussian frequency shift keying (GFSK). The modulator modulates the outgoing bits using at a rate of 1Msym/s, with a modulation index of 0.5. For LR-WPAN transmissions, the chipstream directly drives the modulation LUT. The output of the modulation LUT is an 8-bit unsigned integer value that indicates the FSK modulation away from the maximum frequency at that channel tuning.
The 6-bit FSK modulation output, in conjunction with a 6 bit channel select value, are used to address into the Modulation LUT to retrieve input values for the VCO LO based on the channel index and modulation frequency offset. These decoding LUTs provide 8-bit values for LO coarse tuning, LO FSK, and the PLL division.
1.10.2. RX Chain
![modem rx schematic](./images/modem_rx_schematic.png)
After mixing, the analog I and Q signals go through ADCs to produce 8 bit output values. The ADCs are clocked on the negative edge of the digital system clock. On the falling system clock edge, the ADCs sample and latch the signals coming from analog RF. These sampled 8-bit values are then captured by rising-edge triggered flip-flops at the analog-digital boundary of the RX chain.
Image Rejection
After mixing with the LO and being sampled by the I/Q ADCs, the Q signal for the signal (F_LO+F_IF) ends up +90° shifted from I while the image (F_LO-F_IF) ends up -90° shifted from I. A Hilbert filter shifts positive frequencies by +90° and negative frequencies by -90°. By applying it to the I signal and adding to the Q signal, this causes constructive interference for the desired signal and destructive interference for the image, heavily attenuating it. Note these filters are fully configurable (up to their maximum length) if needed.
FSK Demodulation
After image rejection, the matched filters (the optimal non-coherent demodulator!) and envelope detection serve to discriminate between positive and negative frequency deviations. A matched filter performs a convolution of the input signal with a “template” which is simply samples of the desired frequency up to the length of a bit/chip period. Due to phase shift, we must have sine and cosine templates and sum the two. Since the filters generate high frequency noise, we perform “envelope detection” after the matched filters to remove it and get a clean signal giving the magnitude of the match. Comparing the magnitude of each gives us the decision for the deviation.
For an ADC clock of 32MHz, we need a 32-length filter for BLE and 16-length filter for LR-WPAN. For an IF of 2MHz, we need templates of 1.75MHz and 2.25MHz for BLE and 1.5MHz and 2.5MHz for LR-WPAN.
Clock and Data Recovery (CDR)
After FSK demodulation, we have an oversampled bitstream which must downsample to the appropriate bitrate. The goal of the CDR is to align the sampling window with the phase of the incoming bitstream.
Our design has 3 integrators - early, present, late - which each look at a window (of length equal to the bit period) of the incoming bitstream but are offset from each other by 1 cycle. We then have a counter that decrements every cycle. When the counter hits 0, we return a sampled bit that is the value of the strongest integrator (determined by majority and number of 1s and 0s). We then reset the counter to a value that will cause the winning integrator in the next bit period to be closer to the present integrator (either by extending or shortening the amount of time to the next sample time).
For LR-WPAN, the long length of the preamble and chip spreading make slow phase aligning CDRs a non-issue. For BLE, we only have the preamble of 8 symbols to align. For a 32MHz clock and BLE’s 1Mbps, we would be at most 16 cycles off in phase alignment. However, since our CDR always returns the integrator of greatest absolute value rather than the present one each time, it should confidently return the correct symbol despite a large phase shift and it still aligning to an incoming signal.
This idea can easily be extended to more integrators to align to phase shifts more quickly or control the granularity of phase shifts, but we found that 3 integrators and a 1 cycle shift between them worked well in simulation. If our clock is particularly off, the CDR will fail to account for both the phase shift and clock inaccuracy which would necessitate the extension.
Packet Detection
For BLE, the preamble is intended to lock in the AGC and CDR while the following access address is what determines the start of the packet and the byte alignment. The BLE packet detector searches for the access address after which it can confidently send (whitened) bytes over to the baseband. The baseband asserts an end-of-packet signal when it’s done consuming the bytes of the packet.
For LR-WPAN, the preamble again locks in the AGC and CDR while the SFD (0xA7) denotes the start of the packet. Since each 4-bit symbol (within each 8-bit byte) is sent out as a 32-chip sequence, we perform the chip sequence to symbol mapping based on Hamming distance before looking for the SFD. To minimize false matches while reducing hardware cost, we also match one byte of the preamble (searching for 0xA700) to determine the start of the packet. After that, the packet detector can again confidently send bytes to the baseband.
Automatic Gain Control (AGC)
To support high dynamic range and also keep our ADCs near saturation to maximize demodulation accuracy and SNR, we have an AGC for I and Q. It is a simple design, keeping track of the difference between the minimum and maximum values of the ADC for a given window (which should be long enough to see a sine wave minimum and maximum). If the value exceeds the desired value plus some tolerance, we increase the gain. If it’s below, we decrease the gain.
For stable output, keep the tolerance larger than the gain resolution. For fast locking to incoming signals (where the AGC will be at its maximum due to just seeing noise), have the decrement amount be larger than the increment amount.
DC Offset Compensation (DCO)
To remove the DC offset in the ADC output for I and Q, we have a DCO. It simply integrates the incoming signal (interpreted as a FixedPoint between -1 and ~1), applies a gain, and feeds that back into a LUT that will calibrate the VGA to remove the offset.
2. Example Radio Front-End (RFE)
2.1. Specification
The radio must be able to operate in the frequency range of 2.4G to 2.4835 GHz covering 70 1MHz RF channels. In this range, the receive chain should function over an input power range from -70dBm to -10dBm and achieve a BER of 0.1% (translates to an SNR of 12.5dB) in following in band test conditions when the input is at -67dBm, shown below.
Interference Channel | Ratio (dB) | Input Signal (dBm) | Interferer (dBm) |
---|---|---|---|
Co-channel |
11 |
-60 dBm |
-71 dBm |
Adj. 1 MHz |
0 |
-60 dBm |
-60 dBm |
Adj. 2 MHz |
-30 |
-60 dBm |
-30 dBm |
Adj. >3 MHz |
-40 |
-67 dBm |
-27 dBm |
Image |
-9 |
-67 dBm |
-58 dBm |
Image +/- 1 MHz |
-20 |
-67 dBm |
-47 dBm |
Interference Channel | Interferer (dBm) |
---|---|
30 MHz - 2000 MHz |
-10 dBm |
2000 MHz - 2399 MHz |
-27 dBm |
2484 MHz - 3000 MHz |
-27 dBm |
3000 MHz - 12.75 GHz |
-10 dBm |
2.2. Example On-Chip RFE Architecture
The example radio front-end architecture below uses a low-IF receiver architecture and a direct modulation transmitter architecture. This architecture is the on-chip RFE that was used during the development of this baseband-modem processor, so most of the analog tuning and configuration registers are specific to this architecture.
![example rfe diagram](./images/example_rfe_diagram.png)
The baseband-modem’s receive chain supports automatic gain control based on tuning the the VGA and VG-TIA gain stages. And its DC offset correction (DCOC) is based on tuning the current DAC at the input of the final VGA stage.
The baseband-modem’s transmit modulation implementation is specific to this direct modulation architecture, where the coarse/med/mod bits drive the capacitively tuned VCO.