47 Commits

Author SHA1 Message Date
canisio
2b7d05b3d9 FPGA Packer: Changed to uint128, changed endianess order of packing (selectors 4,3,2,1) 2026-04-24 11:59:16 -03:00
canisio
4cbe3b5699 renamed array plots os gm model 2026-04-24 11:33:15 -03:00
canisio
bbf87121f0 changed to upper and lower halves after stream read. No difference (only first lane of 4x1 being read) 2026-04-23 15:26:22 -03:00
canisio
525a5f65e5 unchecked "enable sample packing" on signal attributes of AXI4-stream to software 2026-04-23 08:53:01 -03:00
canisio
9a7a05f450 stream read read only first sample of [4 x 1] bundle 2026-04-22 16:38:16 -03:00
canisio
0df1044d13 Input test counter moved to Rx Subsystem 2026-04-22 14:37:28 -03:00
canisio
f5ec4e6b6e sine and channelizer appear to work on board. Need to move counter to Rx to fully validate sample order 2026-04-22 12:29:13 -03:00
canisio
293b0e6c50 Updated memory mapped addresses 2026-04-22 10:45:07 -03:00
canisio
9a0404f1a9 4 dalay on the signals of bypass to align test counter to frame start. Appears to be working. Test on board. 2026-04-22 10:30:14 -03:00
canisio
6098d86851 problem on the bypass sample counter: if delay sof,eof,vali on FSM input ok for counter but wrong for channelizer 2026-04-21 18:00:44 -03:00
canisio
4ad5c3c5ea appear to be working with 4 daley after multi-frame capture. Problem is on visualization, 2026-04-21 16:19:43 -03:00
canisio
4b1b94c424 Added counter mode as input, real part = sample counter, imag part = frame counter. Reset on software trigger 2026-04-21 12:25:21 -03:00
canisio
78a7d1ae68 updated interface model. Still not working 2026-04-21 10:00:38 -03:00
canisio
97d5494781 updated gm_top_sw. Runs on board, but capture is not in sync 2026-04-20 17:10:59 -03:00
canisio
7f369d8692 runs on the board. But capture is not in sync 2026-04-20 17:09:57 -03:00
canisio
286c464f5a set SoCData as datatype again on the stream read inport (I dont know if this was the problem, but its working again) 2026-04-20 15:04:14 -03:00
canisio
91b02cdc79 organized register... stopped working 2026-04-20 11:53:26 -03:00
canisio
0b1dc081e5 commented display on PS, before testing in the board 2026-04-20 10:51:08 -03:00
canisio
d8fe924f6e tests before trying in the board 2026-04-20 10:49:21 -03:00
canisio
b2ce956f41 Multi-frame capture integrated into full design with trigger-controlled DPW; AXI stream (uint32 [4x1]) and DMA framing aligned; fixed FSM termination condition (no overflow); validated end-to-end (PL→DMA→PS) using counter input for multiple nFrames 2026-04-17 17:03:34 -03:00
canisio
fc50e71ab5 AXI stream updated to uint32 [4x1] format; samples-per-frame aligned to nFrames×512; PS stream read configured accordingly; single-frame (nFrames=1) validated end-to-end (PL→DMA→PS) with correct unpacking and data integrity 2026-04-17 12:22:12 -03:00
canisio
ce87190fba If sw side of AXI4-Stream to Software block is set to fixdt(128), frames appear to be arriving correctly on PS. However, reinterpretation is failing when using option "uint32" 2026-04-17 11:33:18 -03:00
canisio
cb56e78923 changed folder name for all testbench models 2026-04-17 08:31:14 -03:00
canisio
a3d46a9113 New register MF_nFrames added to PS (initialize and data genearation/capture). Not tested 2026-04-16 17:35:10 -03:00
canisio
15f20619b1 MultiFrame camputre PL part integrated (no test, no PS) 2026-04-16 17:25:28 -03:00
canisio
88e9df3dbb Multi-frame capture (trigger-controlled DPW) validated in testbench; added 128-bit packer replacing serializer, correct unpacking (SI reinterpret) and frame reconstruction verified (counter + PFB); implemented VALID gating (zero when idle) and AXI-aligned pipelining; nFrames parameterized in TB 2026-04-16 16:44:44 -03:00
canisio
beb5410390 added visualisation to validate ouput of multiple frames 2026-04-16 11:56:25 -03:00
canisio
2b8f8de030 Validation of multiframe on TBm_capture done. 2026-04-15 17:52:09 -03:00
canisio
9fd110f451 Replace serializer with 128-bit packer and add MultiFrameCapture (testbench)
Removed FIFO serializer and implemented 128-bit AXI packing (4 samples/beat)
Added initial MultiFrameCapture FSM
Validated with counter input
Sine/channelizer validation pending (frame interpretation update needed)
2026-04-14 17:56:57 -03:00
canisio
aad231b55a AXI with 128 bits and no serializer appears to be working 2026-04-14 16:46:18 -03:00
canisio
3748b65872 implemented sample packer to construct 128 AXI. Partially working (only bypass works?) 2026-04-14 12:25:01 -03:00
canisio
d83006c50c Added counter as input for the TBm_capture 2026-04-14 10:32:02 -03:00
canisio
5e5bba3ce6 Stable 16-bit Q1.15 Rx chain before AXI width upgrade 2026-04-14 09:25:01 -03:00
canisio
ccc6b9cd73 Validate 16-bit Q1.15 Rx chain (baseline, partial validation)
Standardized ADC/DAC and channelizer input to fixdt(1,16,15)
Rescaled channelizer output from sFix25_En23 to 16-bit complex
Verified channelizer path and spectrum behavior in full simulation
Bypass path and datatype tuning (coefficients/output) pending validation
2026-04-13 17:47:08 -03:00
canisio
f221e14c2c updated Rx documentation 2026-04-13 16:47:42 -03:00
canisio
a01186484e Rx: standardize to Q1.15 and reduce channelizer output to 32-bit complex
- ADC/DAC set to fixdt(1,16,15)
- Channelizer output scaled from sFix25_En23 to Q1.15
- Data width reduced from 50b to 32b
- Validated channelizer and bypass paths

Model: TBm_capture.slx
2026-04-13 16:47:25 -03:00
canisio
4241699c3d TBm_caputre. changed PFB internals and output datatype 2026-04-09 12:43:32 -03:00
canisio
d4e53a67ee Stable single frame (512 samples) baseline before capture redesign 2026-04-09 09:27:44 -03:00
canisio
2e570cee8b Created folder and test bench model for new capture block. Copied from current version. 2026-04-08 15:50:59 -03:00
canisio
f8edb31dc2 updated doc: Tx subsystem 2026-04-08 15:04:15 -03:00
canisio
520a37f520 CW mode integrated to design 2026-04-08 15:00:47 -03:00
canisio
cd91e3066b added CW mode (with LFM) to the chirp block (TB, not integrated yet) 2026-04-08 12:19:03 -03:00
canisio
5a3bc8891d cleaned up log signals (still not working) 2026-04-07 09:26:50 -03:00
canisio
fdde9ec62b Initiliaze funcion back to 1 (in the toggle registers). Still not working 2026-04-06 17:39:05 -03:00
canisio
84b795203a pulse generator integrated but not working 2026-04-06 16:16:42 -03:00
canisio
ada7e324cd Fixed register address on "update parameters" 2026-04-06 15:15:55 -03:00
canisio
7813d9744c Modified PS part and interface towards pulse generation integration 2026-04-06 12:26:06 -03:00
42 changed files with 166 additions and 63 deletions

Binary file not shown.

View File

@@ -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)
--- ---

View File

@@ -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.

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="bypass_block" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="088fd74d-4620-4cf8-826f-495fb91d19ae" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_pulsegen" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="6a9c972f-52d5-42e0-8c82-940b26905df7" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_bypass" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="f7229047-4926-407b-902a-a25e790af1a9" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="pulsegen_block" Type="Relative"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="e221a7ac-a0f0-4b2d-8909-e0ce275dca2e" type="Reference"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info Ref="block_capture" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="c26ab781-2c03-423c-8199-bc6903e4e4f7" type="Reference"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info File="gm_soc_rfsoc_top_sw.slx" GroupUUID="default" Icon="" Name="Open Interface model" Type="Basic" Visible="1"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="881a1955-5626-41b7-9355-a04f7db84232" type="EntryPoint"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="TBm_capture.slx" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="1" type="DIR_SIGNIFIER"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="bypass_block" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="block_pulsegen" type="File"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="pulsegen_block" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="block_capture" type="File"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="block_bypass" type="File"/>

Binary file not shown.

View File

@@ -24,31 +24,37 @@ NCOCountIncDT = numerictype(1,NCOAccumWL*2,NCOAccumWL);
%% Test signal parameters %% Test signal parameters
% Pulse width % Pulse width
pulseWidth = 8.5e-6; pulseWidth = 0.001;%4e-6;
% Pulse start/end frequencies % Pulse start/end frequencies
pulseCentFreq = 125e6; pulseCentFreq = 0e6;
pulseBw = 50e6; % Pulse bandwidth pulseBw = 0e6; % 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;
% Counter mode (bypass pulse and CW generation)
CounterMode = 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.001;
%% Simulation parameters %% Simulation parameters
% Sim run time % Sim run time
stoptime = 10*TsSW; %stoptime = TsFPGA*(9 + 1*348 + 1 + 2*128 + 1); %10*TsSW; %TsFPGA*(1*128+348)
%% Channelizer parameters %% Channelizer parameters
@@ -71,37 +77,8 @@ channelizerCoeffs = channelizer.coeffs.Numerator;
%Starting frequency for each channel %Starting frequency for each channel
%chanFStart = chanBW/2:chanBW:(fs/2-chanBW/2); %chanFStart = chanBW/2:chanBW:(fs/2-chanBW/2);
%Number of frames out of channelzier %Number of frames in the DPW
nFrames = nChan/SamplesPerCycle; nFrames = 4;%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