feat(tdma): update tdma logic
This commit is contained in:
+103
-58
@@ -36,19 +36,32 @@ module PAPR #(
|
||||
);
|
||||
|
||||
localparam SUM_WIDTH = 32;
|
||||
localparam CNT_START = 16; // 32*4 / 8 * mag_valid signal is active high per 8 clk
|
||||
localparam CNT_END = 44; // 88*4 / 8
|
||||
localparam PULSE_PERIOD = 32;
|
||||
|
||||
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d1;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d2;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d3;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_reserved;
|
||||
|
||||
// accumulate ==> average ==> papr
|
||||
wire [MAG_WIDTH-1:0] vec_mag_1024;
|
||||
reg [ 7:0] cnt;
|
||||
|
||||
|
||||
wire [MAG_WIDTH-1:0] data_avg;
|
||||
reg [SUM_WIDTH-1:0] data_sum;
|
||||
assign data_avg = data_sum[SUM_WIDTH-1:10];
|
||||
|
||||
|
||||
reg mag_valid_d1;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d1;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d2;
|
||||
reg [MAG_WIDTH-1:0] vec_mag_d3;
|
||||
reg frame_sync_d1;
|
||||
|
||||
always @(posedge clk) begin
|
||||
mag_valid_d1 <= mag_valid;
|
||||
if (rst) begin
|
||||
vec_mag_d1 <= 'd0;
|
||||
vec_mag_d2 <= 'd0;
|
||||
vec_mag_d3 <= 'd0;
|
||||
vec_mag_d1 <= 0;
|
||||
vec_mag_d2 <= 0;
|
||||
vec_mag_d3 <= 0;
|
||||
end
|
||||
else if (mag_valid) begin
|
||||
vec_mag_d1 <= vec_mag;
|
||||
@@ -61,9 +74,7 @@ module PAPR #(
|
||||
vec_mag_d3 <= vec_mag_d3;
|
||||
end
|
||||
end
|
||||
// accumulate ==> average ==> papr
|
||||
wire [MAG_WIDTH-1:0] vec_mag_1024;
|
||||
reg [ 5:0] cnt;
|
||||
|
||||
|
||||
shift_reg #(
|
||||
.DATA_WIDTH(MAG_WIDTH),
|
||||
@@ -77,10 +88,9 @@ module PAPR #(
|
||||
);
|
||||
|
||||
|
||||
reg [SUM_WIDTH-1:0] data_sum;
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
data_sum <= 'd0;
|
||||
data_sum <= 0;
|
||||
end
|
||||
else begin
|
||||
if (mag_valid) begin
|
||||
@@ -92,59 +102,94 @@ module PAPR #(
|
||||
end
|
||||
end
|
||||
|
||||
wire [MAG_WIDTH-1:0] data_avg;
|
||||
assign data_avg = data_sum[SUM_WIDTH-1:10];
|
||||
|
||||
|
||||
|
||||
// FSM
|
||||
reg [2:0] cs = 0;
|
||||
reg [2:0] ns = 0;
|
||||
always @(posedge clk) begin
|
||||
cs <= ns;
|
||||
end
|
||||
|
||||
always @(*) begin
|
||||
ns = cs;
|
||||
case (cs)
|
||||
0: begin
|
||||
if (mag_valid && vec_mag_1024 != 'd0 && data_avg != 'd0 && ({3'd0, vec_mag_d2[MAG_WIDTH-1:3]} >= data_avg) && (vec_mag_d2 >= vec_mag_d1) && (vec_mag_d2 >= vec_mag_d3) && (vec_mag_d2 >= 22'h5000)) begin
|
||||
ns = 1;
|
||||
end
|
||||
end
|
||||
1: begin
|
||||
if (cnt == CNT_START - 1) begin
|
||||
ns = 2;
|
||||
end
|
||||
end
|
||||
2: begin
|
||||
if (vec_mag_reserved < {vec_mag[MAG_WIDTH-3:0], 2'b0}) begin
|
||||
ns = 0;
|
||||
end
|
||||
else if (cnt == CNT_END - 1) begin
|
||||
ns = 3;
|
||||
end
|
||||
end
|
||||
3: begin
|
||||
// generate pulse
|
||||
ns = 4;
|
||||
end
|
||||
4: begin
|
||||
if (cnt == PULSE_PERIOD - 1) begin
|
||||
ns = 0;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
frame_sync <= 1'd0;
|
||||
if (cs == 0 && ns == 1) begin
|
||||
vec_mag_reserved <= vec_mag_d2;
|
||||
end
|
||||
else if (vec_mag_1024 != 'd0 && data_avg != 'd0) begin
|
||||
// NOTE: 防止0均值的情况,比如,一开始信号很小,刚好接收到有信号,那么均值为0,峰值有值,那么一定会过门限。
|
||||
if (mag_valid_d1 && ({3'd0, vec_mag_d2[MAG_WIDTH-1:3]} >= data_avg) && (vec_mag_d2 >= vec_mag_d1) && (vec_mag_d2 >= vec_mag_d3) && (vec_mag_d2 >= 22'h5000)) begin
|
||||
frame_sync <= 1'd1;
|
||||
end
|
||||
else if (cnt == 6'b111111) begin
|
||||
frame_sync <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
frame_sync <= frame_sync;
|
||||
else if (cs == 0) begin
|
||||
vec_mag_reserved <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (cs == 1 || cs == 2) begin
|
||||
if (mag_valid) begin
|
||||
cnt <= cnt + 1;
|
||||
end
|
||||
end
|
||||
else if (cs == 4) begin
|
||||
cnt <= cnt + 1;
|
||||
end
|
||||
else if (cs == 0) begin
|
||||
cnt <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
frame_sync_pulse <= (cs == 3);
|
||||
|
||||
if (cs == 4) begin
|
||||
frame_sync <= 1;
|
||||
end
|
||||
else begin
|
||||
frame_sync <= frame_sync;
|
||||
frame_sync <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
frame_sync_d1 <= frame_sync;
|
||||
if (frame_sync && ~frame_sync_d1) begin
|
||||
frame_sync_pulse <= 1'd1;
|
||||
end
|
||||
else begin
|
||||
frame_sync_pulse <= 1'd0;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
cnt <= 6'd0;
|
||||
end
|
||||
else if (frame_sync && mag_valid_d1) begin
|
||||
cnt <= cnt + 6'd1;
|
||||
end
|
||||
else if (cnt == 6'b111111) begin
|
||||
cnt <= 6'd0;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
ila_frame_sync u_ila_frame_sync (
|
||||
.clk (clk), // input wire clk
|
||||
.probe0(vec_mag), // input wire [21:0] probe0
|
||||
.probe1(data_avg), // input wire [21:0] probe0
|
||||
.probe2(frame_sync) // input wire [0:0] probe2
|
||||
);
|
||||
// ila_frame_sync u_ila_frame_sync (
|
||||
// .clk (clk), // input wire clk
|
||||
// .probe0(vec_mag), // input wire [21:0] probe0
|
||||
// .probe1(data_avg), // input wire [21:0] probe0
|
||||
// .probe2(cs), // input wire [2:0] probe2
|
||||
// .probe3(cnt), // input wire [7:0] probe2
|
||||
// .probe4(frame_sync), // input wire [0:0] probe2
|
||||
// .probe5(vec_mag_reserved) // input wire [21:0] probe2
|
||||
// );
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user