Compare commits
13 Commits
v1.0
...
f221e14c2c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f221e14c2c | ||
|
|
a01186484e | ||
|
|
4241699c3d | ||
|
|
d4e53a67ee | ||
|
|
2e570cee8b | ||
|
|
f8edb31dc2 | ||
|
|
520a37f520 | ||
|
|
cd91e3066b | ||
|
|
5a3bc8891d | ||
|
|
fdde9ec62b | ||
|
|
84b795203a | ||
|
|
ada7e324cd | ||
|
|
7813d9744c |
BIN
capture_block/TBm_capture.slx
Normal file
BIN
capture_block/TBm_capture.slx
Normal file
Binary file not shown.
@@ -86,10 +86,12 @@ Implementation typically uses:
|
|||||||
|
|
||||||
### ADC Input
|
### ADC Input
|
||||||
- Sampling rate: 4096 MSPS
|
- Sampling rate: 4096 MSPS
|
||||||
|
- Data type: **fixdt(1,16,15)** (Q1.15 format)
|
||||||
|
|
||||||
### PFB Channelizer
|
### PFB Channelizer
|
||||||
- Decimation: 8
|
- Decimation: 8
|
||||||
- Effective bandwidth: 512 MHz
|
- Effective bandwidth: 512 MHz
|
||||||
|
- Input and internal scaling aligned to Q1.15 domain
|
||||||
|
|
||||||
### FFT
|
### FFT
|
||||||
- Size: 512
|
- Size: 512
|
||||||
@@ -103,10 +105,48 @@ Implementation typically uses:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Numeric Format and Scaling
|
||||||
|
|
||||||
|
### System Standardization
|
||||||
|
|
||||||
|
The signal chain was standardized to a **Q1.15 fixed-point format (fixdt(1,16,15))**:
|
||||||
|
|
||||||
|
- DAC output uses Q1.15
|
||||||
|
- ADC input is reinterpreted as Q1.15 (Same Stored Integer)
|
||||||
|
- Channelizer input operates in this normalized domain
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Channelizer Output Scaling
|
||||||
|
|
||||||
|
- Native channelizer output: **sFix25_En23**
|
||||||
|
- Rescaled and quantized to: **fixdt(1,16,15)**
|
||||||
|
|
||||||
|
This conversion:
|
||||||
|
|
||||||
|
- Preserves signal dynamic range
|
||||||
|
- Maximizes fractional precision
|
||||||
|
- Uses rounding and saturation
|
||||||
|
- Aligns with system-wide numeric format
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Data Width Reduction
|
||||||
|
|
||||||
|
- Previous format: **50 bits per complex sample** (25 bits real + 25 bits imag)
|
||||||
|
- New format: **32 bits per complex sample** (16 bits real + 16 bits imag)
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
|
||||||
|
- Reduced AXI bandwidth
|
||||||
|
- Reduced FIFO usage
|
||||||
|
- More efficient DMA transfers
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## AXI4-Stream Output
|
## AXI4-Stream Output
|
||||||
|
|
||||||
- Data type: uint64
|
- Data type: uint32 (packed complex: 16-bit real + 16-bit imag)
|
||||||
- Packed real/imag
|
|
||||||
- TLAST = frame boundary
|
- TLAST = frame boundary
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -114,7 +154,7 @@ Implementation typically uses:
|
|||||||
## Data Format
|
## Data Format
|
||||||
|
|
||||||
- Frame size: 512 samples
|
- Frame size: 512 samples
|
||||||
- Complex values packed into uint64
|
- Complex samples packed into 32-bit words
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -123,6 +163,7 @@ Implementation typically uses:
|
|||||||
- Fully streaming pipeline
|
- Fully streaming pipeline
|
||||||
- High throughput
|
- High throughput
|
||||||
- Deterministic latency
|
- Deterministic latency
|
||||||
|
- Consistent fixed-point scaling (Q1.15 end-to-end)
|
||||||
- Supports dual-mode operation (channelizer / bypass)
|
- Supports dual-mode operation (channelizer / bypass)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 📡 PL Tx Subsystem (Pulse Generator)
|
# 📡 PL Tx Subsystem (Pulse & Continuous LFM Generator)
|
||||||
|
|
||||||
[🏠 Project Home](../README.md)
|
[🏠 Project Home](../README.md)
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
The Tx subsystem implements a **pulse-based Linear Frequency Modulated (LFM) chirp generator** using a DDS/NCO architecture in the FPGA (PL).
|
The Tx subsystem implements a **pulse-based and continuous Linear Frequency Modulated (LFM) chirp generator** using a DDS/NCO architecture in the FPGA (PL).
|
||||||
|
|
||||||
The generator produces **complex baseband output**:
|
The generator produces **complex baseband output**:
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ pulse_gen_ctrl (FSM)
|
|||||||
↓
|
↓
|
||||||
tx_active
|
tx_active
|
||||||
↓
|
↓
|
||||||
Phase Increment Counter
|
Phase Increment Logic
|
||||||
↓
|
↓
|
||||||
NCO (DDS)
|
NCO (DDS)
|
||||||
↓
|
↓
|
||||||
@@ -32,6 +32,39 @@ Phase Increment Counter
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Operating Modes
|
||||||
|
|
||||||
|
The subsystem now supports multiple Tx modes:
|
||||||
|
|
||||||
|
### 1. Pulsed LFM (default)
|
||||||
|
|
||||||
|
- Chirp generated only during pulse window
|
||||||
|
- Phase resets at each pulse start
|
||||||
|
- Standard radar burst operation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. CW Mode (Continuous Wave)
|
||||||
|
|
||||||
|
- `tx_active = 1` continuously
|
||||||
|
- Generates a single-tone output
|
||||||
|
- Achieved by setting constant phase increment
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Continuous LFM (Workaround Implementation)
|
||||||
|
|
||||||
|
- `tx_active` forced HIGH continuously
|
||||||
|
- A **1-cycle LOW pulse** is inserted periodically
|
||||||
|
- This LOW→HIGH transition **resets the NCO**
|
||||||
|
|
||||||
|
Result:
|
||||||
|
- Continuous chirp
|
||||||
|
- Bounded bandwidth
|
||||||
|
- Periodic repetition of LFM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Chirp Generation Principle
|
## Chirp Generation Principle
|
||||||
|
|
||||||
The chirp is generated using a second-order phase accumulator:
|
The chirp is generated using a second-order phase accumulator:
|
||||||
@@ -72,7 +105,7 @@ States:
|
|||||||
|
|
||||||
## Timing Behavior
|
## Timing Behavior
|
||||||
|
|
||||||
Within each PRI:
|
### Pulsed Mode
|
||||||
|
|
||||||
|<------ PRI ------>|
|
|<------ PRI ------>|
|
||||||
|<-- pulse -->| idle |
|
|<-- pulse -->| idle |
|
||||||
@@ -80,7 +113,31 @@ Within each PRI:
|
|||||||
- tx_active = 1 → chirp output
|
- tx_active = 1 → chirp output
|
||||||
- tx_active = 0 → output zero
|
- tx_active = 0 → output zero
|
||||||
|
|
||||||
Chirp is reset at each pulse start.
|
---
|
||||||
|
|
||||||
|
### Continuous LFM Mode
|
||||||
|
|
||||||
|
tx_active behavior:
|
||||||
|
|
||||||
|
1 1 1 1 1 0 1 1 1 1 ...
|
||||||
|
|
||||||
|
- 1-cycle LOW inserted at end of chirp period
|
||||||
|
- Rising edge resets NCO
|
||||||
|
- Defines chirp repetition interval
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CW / Continuous LFM Implementation Details
|
||||||
|
|
||||||
|
- CW mode bypasses FSM output
|
||||||
|
- A dedicated counter generates periodic reset pulses
|
||||||
|
- Reset timing is based on `pulse_width_cycles`
|
||||||
|
|
||||||
|
Important:
|
||||||
|
|
||||||
|
- Reset pulse is exactly **1 clock cycle**
|
||||||
|
- Ensures deterministic NCO restart
|
||||||
|
- Decoupled from PRI/FSM timing
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -97,7 +154,19 @@ Chirp is reset at each pulse start.
|
|||||||
- Deterministic timing (128 MHz)
|
- Deterministic timing (128 MHz)
|
||||||
- Efficient DDS (adder-based)
|
- Efficient DDS (adder-based)
|
||||||
- Complex output (I/Q)
|
- Complex output (I/Q)
|
||||||
- Supports burst-mode radar operation
|
- Supports:
|
||||||
|
- Pulsed radar mode
|
||||||
|
- Continuous wave (CW)
|
||||||
|
- Continuous LFM (periodic chirp)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Design Notes
|
||||||
|
|
||||||
|
- FSM controls **timing (when to transmit)**
|
||||||
|
- NCO controls **frequency evolution**
|
||||||
|
- Continuous LFM implemented via **tx_active edge reuse**
|
||||||
|
- Minimal hardware overhead (no additional NCO logic)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="1" type="DIR_SIGNIFIER"/>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info>
|
||||||
|
<Category UUID="FileClassCategory">
|
||||||
|
<Label UUID="design"/>
|
||||||
|
</Category>
|
||||||
|
</Info>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="TBm_capture.slx" type="File"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info Ref="capture_block" Type="Relative"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="14d75155-da33-4258-97c9-15567dccec3d" type="Reference"/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info/>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Info location="capture_block" type="File"/>
|
||||||
Binary file not shown.
@@ -24,31 +24,34 @@ NCOCountIncDT = numerictype(1,NCOAccumWL*2,NCOAccumWL);
|
|||||||
%% Test signal parameters
|
%% Test signal parameters
|
||||||
|
|
||||||
% Pulse width
|
% Pulse width
|
||||||
pulseWidth = 8.5e-6;
|
pulseWidth = 4e-6;
|
||||||
|
|
||||||
% Pulse start/end frequencies
|
% Pulse start/end frequencies
|
||||||
pulseCentFreq = 125e6;
|
pulseCentFreq = 100e6;
|
||||||
pulseBw = 50e6; % Pulse bandwidth
|
pulseBw = 5e6; % Pulse bandwidth
|
||||||
|
|
||||||
% Number of pulses
|
% Number of pulses
|
||||||
numPulses = 4;
|
numPulses = 10;
|
||||||
|
|
||||||
% Pulse repetition interval
|
% Pulse repetition interval
|
||||||
PRF = 20e3;
|
PRF = 20e3;
|
||||||
PRI = 1/PRF;
|
PRI = 1/PRF;
|
||||||
|
|
||||||
|
% CW mode (bypass pulse generation)
|
||||||
|
CwMode = true;
|
||||||
|
|
||||||
% Output gain
|
% Output gain
|
||||||
pulseGenGain = 1;
|
pulseGenGain = 1;
|
||||||
|
|
||||||
%% Software parameters
|
%% Software parameters
|
||||||
|
|
||||||
% Signal generator update rate
|
% Signal generator update rate
|
||||||
TsSW = 0.0025;
|
TsSW = 0.5e-3;
|
||||||
|
|
||||||
%% Simulation parameters
|
%% Simulation parameters
|
||||||
|
|
||||||
% Sim run time
|
% Sim run time
|
||||||
stoptime = 10*TsSW;
|
stoptime = 10*TsSW; %TsFPGA*(1*128+348)
|
||||||
|
|
||||||
%% Channelizer parameters
|
%% Channelizer parameters
|
||||||
|
|
||||||
@@ -75,33 +78,4 @@ channelizerCoeffs = channelizer.coeffs.Numerator;
|
|||||||
nFrames = nChan/SamplesPerCycle;
|
nFrames = nChan/SamplesPerCycle;
|
||||||
|
|
||||||
% Frame size after serializing x2
|
% Frame size after serializing x2
|
||||||
%frameSize = SamplesPerCycle/2;
|
%frameSize = SamplesPerCycle/2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% function soc_rfsoc_init(mdlPath)
|
|
||||||
% % Initialization fcn for the model. It sets the model-wide params
|
|
||||||
% % which are derived based on sample rate.
|
|
||||||
%
|
|
||||||
% % 'FrameSize and 'NumBuffers' variables are set during model
|
|
||||||
% % PreLoadFcn callback into base workspace. These two variables should be
|
|
||||||
% % changed directly at the MATLAB command
|
|
||||||
%
|
|
||||||
% % FrameSize = evalin('base','FrameSize');
|
|
||||||
%
|
|
||||||
% dacSampleRate = get_param([mdlPath '/RF Data Converter'], 'dacSampleRate');
|
|
||||||
% dacSampleRate = evalin('base', dacSampleRate)*1e6;
|
|
||||||
% dacSamplesPerCycle = str2double(get_param([mdlPath '/RF Data Converter'], 'dacSamplesPerCycle'));
|
|
||||||
% dacInterpolationMode = str2double(get_param([mdlPath '/RF Data Converter'], 'interpolationMode'));
|
|
||||||
% streamClkFrequency = dacSampleRate/(dacSamplesPerCycle*dacInterpolationMode);
|
|
||||||
%
|
|
||||||
% SampleTime = 1/streamClkFrequency;
|
|
||||||
%
|
|
||||||
% % derived model-wide variables set into base workspace.
|
|
||||||
% assignin('base','FPGAClkRate', streamClkFrequency);
|
|
||||||
% assignin('base','TsFPGA', SampleTime);
|
|
||||||
% assignin('base','SamplesPerCycle', dacSamplesPerCycle);
|
|
||||||
% assignin('base','IntDecFactor', dacInterpolationMode);
|
|
||||||
% end
|
|
||||||
Reference in New Issue
Block a user