Skip to content

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
catkira committed Jul 18, 2023
1 parent a62fbf9 commit 469c5fa
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 58 deletions.
124 changes: 70 additions & 54 deletions hdl/PSS_detector.sv
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ module PSS_detector
parameter INITIAL_DETECTION_SHIFT = 3,
parameter INITIAL_CFO_MODE = 0,
parameter CIC_RATE = 2,
parameter HAS_CFO_CALC = 1,

localparam SAMPLE_RATE = 1920000,
localparam AXI_ADDRESS_WIDTH = 11
Expand Down Expand Up @@ -393,73 +394,85 @@ reg CFO_calc_valid_in;
reg CFO_calc_valid_out;
reg signed [CFO_DW - 1 : 0] CFO_angle;
reg signed [DDS_DW - 1 : 0] CFO_DDS_inc;
CFO_calc #(
.C_DW(C_DW),
.CFO_DW(CFO_DW),
.DDS_DW(DDS_DW)
)
CFO_calc_i(
.clk_i(clk_i),
.reset_ni(reset_int_n),
.C0_i(C0_in),
.C1_i(C1_in),
.valid_i(CFO_calc_valid_in),
if (HAS_CFO_CALC) begin
CFO_calc #(
.C_DW(C_DW),
.CFO_DW(CFO_DW),
.DDS_DW(DDS_DW)
)
CFO_calc_i(
.clk_i(clk_i),
.reset_ni(reset_int_n),
.C0_i(C0_in),
.C1_i(C1_in),
.valid_i(CFO_calc_valid_in),

.CFO_angle_o(CFO_angle),
.CFO_DDS_inc_o(CFO_DDS_inc),
.valid_o(CFO_calc_valid_out)
);
.CFO_angle_o(CFO_angle),
.CFO_DDS_inc_o(CFO_DDS_inc),
.valid_o(CFO_calc_valid_out)
);
end else begin
always_comb begin
CFO_calc_valid_out <= '0;
CFO_DDS_inc <= '0;
CFO_angle <= '0;
end
end

localparam [1 : 0] SEARCH = 0;
localparam [1 : 0] FIND = 1;
localparam [1 : 0] PAUSE = 2;
reg N_id_2_valid;

reg [1 : 0] CFO_state;
localparam [1 : 0] WAIT_FOR_PEAK = 0;
localparam [1 : 0] DISABLE_CFO_IN = 1;
localparam [1 : 0] WAIT_FOR_CFO = 2;

//-------------------------------------------------------------------------------
// FSM to control CFO_calc
// it is not sensitive to new incoming peaks while it waits for CFO_calc to finish
// this can cause a peak to be ignored if it follows close after another peak
//
// TODO: signal a valid N_id_2 only of the calculated CFO is below a certain threshold,
// i.e. +- 100 Hz, if it is above, wait for next SSB with corrected CFO
always @(posedge clk_i) begin
if (!reset_int_n) begin
CFO_state <= WAIT_FOR_PEAK;
CFO_angle_o <= '0;
CFO_DDS_inc_o <= '0;
CFO_valid_o <= '0;
end else begin
case (CFO_state)
WAIT_FOR_PEAK : begin
CFO_valid_o <= '0;
if (N_id_2_valid) begin
C0_in <= C0_f[N_id_2_o];
C1_in <= C1_f[N_id_2_o];
CFO_calc_valid_in <= 1;
CFO_state <= DISABLE_CFO_IN;
if (HAS_CFO_CALC) begin
reg [1 : 0] CFO_state;
localparam [1 : 0] WAIT_FOR_PEAK = 0;
localparam [1 : 0] DISABLE_CFO_IN = 1;
localparam [1 : 0] WAIT_FOR_CFO = 2;
always @(posedge clk_i) begin
if (!reset_int_n) begin
CFO_state <= WAIT_FOR_PEAK;
CFO_angle_o <= '0;
CFO_DDS_inc_o <= '0;
CFO_valid_o <= '0;
end else begin
case (CFO_state)
WAIT_FOR_PEAK : begin
CFO_valid_o <= '0;
if (N_id_2_valid) begin
C0_in <= C0_f[N_id_2_o];
C1_in <= C1_f[N_id_2_o];
CFO_calc_valid_in <= 1;
CFO_state <= DISABLE_CFO_IN;
end
end
end
DISABLE_CFO_IN : begin
CFO_calc_valid_in <= '0;
CFO_state <= WAIT_FOR_CFO;
end
WAIT_FOR_CFO : begin
if (CFO_calc_valid_out) begin
$display("PSS_detector: detected CFO angle is %f deg", $itor(CFO_angle) / $itor((2**(CFO_DW - 1) - 1)) * $itor(180));
$display("PSS_detector: detected CFO frequency is %f Hz", $itor(CFO_angle) * SAMPLE_RATE / 64 / (2**(CFO_DW - 1) - 1));
$display("PSS detector: detected CFO DDS_inc is %d", CFO_DDS_inc);
CFO_state <= WAIT_FOR_PEAK;
CFO_angle_o <= cfo_mode == CFO_MODE_AUTO ? CFO_angle : '0;
CFO_DDS_inc_o <= cfo_mode == CFO_MODE_AUTO ? CFO_DDS_inc : '0;
CFO_valid_o <= 1 && (cfo_mode == CFO_MODE_AUTO);
DISABLE_CFO_IN : begin
CFO_calc_valid_in <= '0;
CFO_state <= WAIT_FOR_CFO;
end
end
endcase
WAIT_FOR_CFO : begin
if (CFO_calc_valid_out) begin
$display("PSS_detector: detected CFO angle is %f deg", $itor(CFO_angle) / $itor((2**(CFO_DW - 1) - 1)) * $itor(180));
$display("PSS_detector: detected CFO frequency is %f Hz", $itor(CFO_angle) * SAMPLE_RATE / 64 / (2**(CFO_DW - 1) - 1));
$display("PSS detector: detected CFO DDS_inc is %d", CFO_DDS_inc);
CFO_state <= WAIT_FOR_PEAK;
CFO_angle_o <= cfo_mode == CFO_MODE_AUTO ? CFO_angle : '0;
CFO_DDS_inc_o <= cfo_mode == CFO_MODE_AUTO ? CFO_DDS_inc : '0;
CFO_valid_o <= 1 && (cfo_mode == CFO_MODE_AUTO);
end
end
endcase
end
end
end else begin
always_comb begin
CFO_valid_o <= '0;
CFO_DDS_inc_o <= '0;
CFO_angle_o <= '0;
end
end

Expand All @@ -473,6 +486,9 @@ end
//
// If USE_MODE is 0, the FSM is permanently in SEARCH mode
wire [1 : 0] mode_select;
localparam [1 : 0] SEARCH = 0;
localparam [1 : 0] FIND = 1;
localparam [1 : 0] PAUSE = 2;
assign mode_select = USE_MODE ? mode_i : SEARCH;
reg [1 : 0] N_id_2;

Expand Down
3 changes: 2 additions & 1 deletion hdl/receiver.sv
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,8 @@ PSS_detector #(
.VARIABLE_NOISE_LIMIT(VARIABLE_NOISE_LIMIT),
.INITIAL_DETECTION_SHIFT(INITIAL_DETECTION_SHIFT),
.INITIAL_CFO_MODE(INITIAL_CFO_MODE),
.CIC_RATE(CIC_RATE)
.CIC_RATE(CIC_RATE),
.HAS_CFO_CALC(HAS_CFO_COR)
)
PSS_detector_i(
.clk_i(clk_i),
Expand Down
7 changes: 4 additions & 3 deletions tests/test_receiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -659,9 +659,10 @@ def test_NFFT9_7680KSPS_recording(FILE, HALF_CP_ADVANCE, MULT_REUSE, RND_JITTER,
os.environ['SIM'] = 'verilator'
os.environ['PLOTS'] = '1'
os.environ['WAVES'] = '1'
if False:
if True:
test(IN_DW = 32, OUT_DW = 32, TAP_DW = 32, WINDOW_LEN = 8, CFO = 0, HALF_CP_ADVANCE = 1, USE_TAP_FILE = 1, LLR_DW = 8,
NFFT = 9, MULT_REUSE = 0, INITIAL_DETECTION_SHIFT = 3, INITIAL_CFO_MODE = 1, RND_JITTER = 0, FILE = '763450KHz_7680KSPS_low_gain')
NFFT = 9, MULT_REUSE = 0, INITIAL_DETECTION_SHIFT = 3, INITIAL_CFO_MODE = 1, RND_JITTER = 0,
FILE = '763450KHz_7680KSPS_low_gain', HAS_CFO_COR = 0)
else:
test(IN_DW = 32, OUT_DW = 32, TAP_DW = 32, WINDOW_LEN = 8, CFO = 0, HALF_CP_ADVANCE = 0, USE_TAP_FILE = 1, LLR_DW = 8,
NFFT = 8, MULT_REUSE = 1, INITIAL_DETECTION_SHIFT = 4, INITIAL_CFO_MODE = 1, RND_JITTER = 0)
NFFT = 8, MULT_REUSE = 1, INITIAL_DETECTION_SHIFT = 4, INITIAL_CFO_MODE = 1, RND_JITTER = 0)

0 comments on commit 469c5fa

Please sign in to comment.