10 Commits
v1.0 ... v1.1

15 changed files with 104 additions and 41 deletions

Binary file not shown.

View File

@@ -1,4 +1,4 @@
# 📡 PL Tx Subsystem (Pulse Generator)
# 📡 PL Tx Subsystem (Pulse & Continuous LFM Generator)
[🏠 Project Home](../README.md)
@@ -6,7 +6,7 @@
## 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**:
@@ -24,7 +24,7 @@ pulse_gen_ctrl (FSM)
tx_active
Phase Increment Counter
Phase Increment Logic
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
The chirp is generated using a second-order phase accumulator:
@@ -72,7 +105,7 @@ States:
## Timing Behavior
Within each PRI:
### Pulsed Mode
|<------ PRI ------>|
|<-- pulse -->| idle |
@@ -80,7 +113,31 @@ Within each PRI:
- tx_active = 1 → chirp output
- 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)
- Efficient DDS (adder-based)
- 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

@@ -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="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

@@ -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 Ref="capture_block" Type="Relative"/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Info location="14d75155-da33-4258-97c9-15567dccec3d" type="Reference"/>

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="capture_block" type="File"/>

Binary file not shown.

View File

@@ -24,26 +24,29 @@ NCOCountIncDT = numerictype(1,NCOAccumWL*2,NCOAccumWL);
%% Test signal parameters
% Pulse width
pulseWidth = 8.5e-6;
pulseWidth = 4e-6;
% Pulse start/end frequencies
pulseCentFreq = 125e6;
pulseBw = 50e6; % Pulse bandwidth
pulseCentFreq = 100e6;
pulseBw = 5e6; % Pulse bandwidth
% Number of pulses
numPulses = 4;
numPulses = 10;
% Pulse repetition interval
PRF = 20e3;
PRI = 1/PRF;
% CW mode (bypass pulse generation)
CwMode = true;
% Output gain
pulseGenGain = 1;
%% Software parameters
% Signal generator update rate
TsSW = 0.0025;
TsSW = 0.5e-3;
%% Simulation parameters
@@ -75,33 +78,4 @@ channelizerCoeffs = channelizer.coeffs.Numerator;
nFrames = nChan/SamplesPerCycle;
% Frame size after serializing x2
%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
%frameSize = SamplesPerCycle/2;