473 lines
12 KiB
Verilog
473 lines
12 KiB
Verilog
`timescale 1ns / 1ns
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
// Company:
|
||
// Engineer:
|
||
//
|
||
// Create Date: 2019/11/18 21:03:55
|
||
// Design Name:
|
||
// Module Name: TSync_Abs_new4
|
||
// Project Name:
|
||
// Target Devices:
|
||
// Tool Versions:
|
||
// Description:
|
||
//
|
||
// Dependencies:
|
||
//
|
||
// Revision:
|
||
// Revision 0.01 - File Created
|
||
// Additional Comments:
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
//4倍过采样不内插
|
||
//帧内不更新
|
||
|
||
module TSync_Abs_new4(
|
||
input clk,
|
||
input rst,
|
||
input framesync_Interpolation,
|
||
output reg framesync_out4 = 1'd0,
|
||
|
||
input [9:0] dataini,
|
||
input [9:0] datainq,
|
||
|
||
output reg TSyncout_nd = 1'd0,
|
||
output reg [9:0] TSyncout_i = 10'd0,
|
||
output reg [9:0] TSyncout_q = 10'd0,
|
||
|
||
//debug
|
||
output reg [1:0] cnt = 2'd0, //12.5
|
||
|
||
output reg [1:0] flag_clk4 = 2'd0 //12.5
|
||
|
||
|
||
);
|
||
|
||
//-------------------------------------状态机控制----------------------------------------------//
|
||
|
||
|
||
// reg [3:0] cnt = 4'd0;
|
||
reg nd_1 = 1'd0;
|
||
|
||
reg flag_framesync = 1'd0;
|
||
|
||
// reg [3:0] flag_clk = 4'd0;
|
||
// reg [1:0] flag_num = 2'd0;
|
||
|
||
|
||
|
||
always @(posedge clk)begin
|
||
if(rst)begin
|
||
cnt <= 2'd3;
|
||
nd_1 <= 1'd0;
|
||
|
||
TSyncout_nd <= 1'd0;
|
||
TSyncout_i <= 10'd0;
|
||
TSyncout_q <= 10'd0;
|
||
|
||
flag_framesync <= 1'd0;
|
||
framesync_out4 <= 1'd0;
|
||
end
|
||
else begin
|
||
cnt <= cnt + 2'd1;
|
||
|
||
if(cnt == 2'd3) nd_1 <= 1'd1;
|
||
else nd_1 <= 1'd0;
|
||
if(framesync_Interpolation) begin
|
||
if(cnt == flag_clk4) begin
|
||
framesync_out4 <= 1'd1;
|
||
TSyncout_nd <= 1'd1;
|
||
TSyncout_i <= dataini;
|
||
TSyncout_q <= datainq;
|
||
flag_framesync <= 1'd0;
|
||
end
|
||
else begin
|
||
framesync_out4 <= 1'd0;
|
||
TSyncout_nd <= 1'd0;
|
||
TSyncout_i <= 10'd0;
|
||
TSyncout_q <= 10'd0;
|
||
flag_framesync <= 1'd1;
|
||
end
|
||
end
|
||
else begin
|
||
framesync_out4 <= 1'd0;
|
||
flag_framesync <= 1'd0;
|
||
TSyncout_nd <= 1'd0;
|
||
TSyncout_i <= 10'd0;
|
||
TSyncout_q <= 10'd0;
|
||
end
|
||
|
||
// if(cnt == flag_clk4) begin
|
||
// TSyncout_nd <= 1'd1;
|
||
// TSyncout_i <= dataini;
|
||
// TSyncout_q <= datainq;
|
||
// end
|
||
// else begin
|
||
// TSyncout_nd <= 1'd0;
|
||
// end
|
||
|
||
end
|
||
end
|
||
|
||
|
||
//---------------------------------------求近似模值Abs,delay=6-------------------------------------//
|
||
wire [10:0] data_Abs;
|
||
ApproxAbs_v2 ApproxAbs_v2_tsync (
|
||
.clk (clk),
|
||
.ND (1'd1),
|
||
.Din_I (dataini),
|
||
.Din_Q (datainq),
|
||
.Dout (data_Abs),
|
||
.Rdy ()
|
||
);
|
||
|
||
|
||
|
||
reg nd_2 = 1'd0;
|
||
reg nd_3 = 1'd0;
|
||
reg nd_4 = 1'd0;
|
||
reg nd_5 = 1'd0;
|
||
reg nd_6 = 1'd0;
|
||
reg nd_7 = 1'd0;
|
||
|
||
always @(posedge clk)begin
|
||
nd_2 <= nd_1;
|
||
nd_3 <= nd_2;
|
||
nd_4 <= nd_3;
|
||
nd_5 <= nd_4;
|
||
|
||
nd_6 <= nd_5;
|
||
nd_7 <= nd_6;
|
||
end
|
||
|
||
|
||
|
||
//-------------------------------------累加,delay=1-------------------------------------------------//
|
||
reg [19:0] acc_01 = 20'd0;
|
||
reg [19:0] acc_02 = 20'd0;
|
||
reg [19:0] acc_03 = 20'd0;
|
||
reg [19:0] acc_04 = 20'd0;
|
||
|
||
reg [1:0] cnt_4 =2'd0;
|
||
reg nd_acc = 1'd0;
|
||
reg nd_flag = 1'd0;
|
||
|
||
reg flag_cnt_0 = 1'd0;
|
||
|
||
reg [5:0] cnt_64 = 6'd0;
|
||
reg [6:0] cnt_128 = 7'd0;
|
||
reg [7:0] cnt_256 = 8'd0;
|
||
reg [8:0] cnt_512 = 9'd0;
|
||
reg [9:0] cnt_1024 = 10'd0;
|
||
|
||
reg [2:0] state_tsync4 = 3'd0;
|
||
|
||
always @(posedge clk)begin
|
||
if(rst)begin
|
||
acc_01 <= 20'd0;
|
||
acc_02 <= 20'd0;
|
||
acc_03 <= 20'd0;
|
||
acc_04 <= 20'd0;
|
||
|
||
cnt_4 <= 2'd3;
|
||
nd_acc <= 1'd0;
|
||
nd_flag<= 1'd0;
|
||
|
||
cnt_64 <= 6'd0;
|
||
cnt_128 <= 7'd0;
|
||
cnt_256 <= 8'd0;
|
||
cnt_512 <= 9'd0;
|
||
cnt_1024 <= 10'd0;
|
||
|
||
flag_cnt_0 <= 1'd0;
|
||
|
||
state_tsync4 <= 3'd0;
|
||
end
|
||
else begin
|
||
if(nd_6) cnt_4 <= 4'd0;
|
||
else cnt_4 <= cnt_4 + 4'd1;
|
||
|
||
if (nd_6) nd_flag <= 1'd1;
|
||
else nd_flag <= nd_flag;
|
||
|
||
case(state_tsync4)
|
||
//等待第一次的数据幅值估计结果(与nd_7对齐)
|
||
3'd0:begin
|
||
if(nd_6) state_tsync4 <= 3'd1;
|
||
else state_tsync4 <= state_tsync4;
|
||
end
|
||
//此clk内nd_7、第一次的数据幅值估计结果同时到来,cnt_4结果为4'd0。
|
||
//累积,直到最后一个累积结束后转至下一状态
|
||
3'd1:begin
|
||
if(cnt_4==2'd3) begin
|
||
cnt_64 <=cnt_64 +6'd1;
|
||
cnt_128 <=cnt_128 +7'd1;
|
||
cnt_256 <=cnt_256 +8'd1;
|
||
cnt_512 <=cnt_512 +9'd1;
|
||
cnt_1024 <=cnt_1024 +10'd1;
|
||
|
||
if(cnt_512==9'd511) flag_cnt_0 <= 1'd1;
|
||
else flag_cnt_0 <= 1'd0;
|
||
end
|
||
else begin
|
||
cnt_64 <= cnt_64;
|
||
cnt_128 <= cnt_128 ;
|
||
cnt_256 <= cnt_256 ;
|
||
cnt_512 <= cnt_512 ;
|
||
cnt_1024 <= cnt_1024;
|
||
flag_cnt_0 <= 1'd0;
|
||
end
|
||
|
||
if(cnt_512==9'd0) begin
|
||
case(cnt_4)
|
||
2'd0:begin
|
||
acc_01 <= {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd1:begin
|
||
acc_02 <= {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd2:begin
|
||
acc_03 <= {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd3:begin
|
||
acc_04 <= {9'd0,data_Abs};
|
||
nd_acc <= 1'd1;
|
||
end
|
||
endcase
|
||
end
|
||
else begin
|
||
case(cnt_4)
|
||
2'd0:begin
|
||
acc_01 <= acc_01 + {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd1:begin
|
||
acc_02 <= acc_02 + {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd2:begin
|
||
acc_03 <= acc_03 + {9'd0,data_Abs};
|
||
nd_acc <= 1'd0;
|
||
end
|
||
2'd3:begin
|
||
acc_04 <= acc_04 + {9'd0,data_Abs};
|
||
nd_acc <= 1'd1;
|
||
end
|
||
endcase
|
||
end
|
||
|
||
if(cnt_512==9'd511&&cnt_4==2'd3) state_tsync4 <= 3'd2;
|
||
else state_tsync4 <= state_tsync4;
|
||
end
|
||
3'd2:begin
|
||
state_tsync4 <= state_tsync4;
|
||
flag_cnt_0 <= 1'd0;
|
||
end
|
||
default:state_tsync4 <= 3'd0;
|
||
endcase
|
||
end
|
||
end
|
||
|
||
|
||
|
||
//---------------------------------------排序找最大值,delay=3-------------------------------------------------//
|
||
|
||
reg [19:0] temp_1_01 = 20'd0;
|
||
reg [19:0] temp_1_02 = 20'd0;
|
||
|
||
reg [1:0] flag_clk_1_01 =2'd0;
|
||
reg [1:0] flag_clk_1_02 =2'd0;
|
||
|
||
reg nd_acc1 = 1'd0;
|
||
|
||
//ila用
|
||
reg [19:0] acc_01_reg = 20'd0;
|
||
reg [19:0] acc_02_reg = 20'd0;
|
||
reg [19:0] acc_03_reg = 20'd0;
|
||
reg [19:0] acc_04_reg = 20'd0;
|
||
|
||
always @(posedge clk)begin
|
||
if(rst)begin
|
||
temp_1_01 <= 20'd0;
|
||
temp_1_02 <= 20'd0;
|
||
|
||
flag_clk_1_01 <=2'd0;
|
||
flag_clk_1_02 <=2'd0;
|
||
|
||
nd_acc1 <= 1'd0;
|
||
|
||
//ila用
|
||
acc_01_reg <= 20'd0;
|
||
acc_02_reg <= 20'd0;
|
||
acc_03_reg <= 20'd0;
|
||
acc_04_reg <= 20'd0;
|
||
end
|
||
else begin
|
||
if(nd_acc&&flag_cnt_0) begin
|
||
nd_acc1 <= 1'd1;
|
||
|
||
//ila用
|
||
acc_01_reg <= acc_01;
|
||
acc_02_reg <= acc_02;
|
||
acc_03_reg <= acc_03;
|
||
acc_04_reg <= acc_04;
|
||
//ila用
|
||
|
||
if(acc_01>=acc_02) begin
|
||
temp_1_01 <= acc_01;
|
||
flag_clk_1_01 <= 2'd0;
|
||
end
|
||
else begin
|
||
temp_1_01 <= acc_02;
|
||
flag_clk_1_01 <= 2'd1;
|
||
end
|
||
|
||
if(acc_03>=acc_04) begin
|
||
temp_1_02 <= acc_03;
|
||
flag_clk_1_02 <= 2'd2;
|
||
end
|
||
else begin
|
||
temp_1_02 <= acc_04;
|
||
flag_clk_1_02 <= 2'd3;
|
||
end
|
||
end
|
||
else nd_acc1 <= 1'd0;
|
||
end
|
||
end
|
||
|
||
|
||
|
||
|
||
//----------------------------------------------------给采样标志,delay=1--------------------------------------//
|
||
|
||
reg nd_acc2 = 1'd0;
|
||
always @(posedge clk)begin
|
||
if(rst)begin
|
||
flag_clk4 <= 2'd0;
|
||
nd_acc2 <= 1'd0;
|
||
end
|
||
else begin
|
||
nd_acc2 <= nd_acc1;
|
||
if(nd_acc1) begin
|
||
if(temp_1_01>=temp_1_02) begin
|
||
flag_clk4 <= flag_clk_1_01;
|
||
end
|
||
else begin
|
||
flag_clk4 <= flag_clk_1_02;
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
|
||
|
||
//ila用
|
||
// reg [6:0] state_check = 7'd0;
|
||
// always @(posedge clk)begin
|
||
// if(rst)begin
|
||
// state_check <= 7'd0;
|
||
// flag_TSync_check<= 1'd0;
|
||
// cnt_tsync_shixu <= 4'd0;
|
||
// flag_tongdao <= 1'd0;
|
||
// acc_tsync <= 20'd0;
|
||
// num_tsync <= num_tsync;
|
||
// end
|
||
// else begin
|
||
// case(state_check)
|
||
// 7'd0:begin
|
||
// if(nd_acc4) begin
|
||
// flag_TSync_check<= 1'd0;
|
||
// state_check <= 7'd1;
|
||
// end
|
||
// else begin
|
||
// flag_TSync_check<= 1'd0;
|
||
// state_check <= state_check;
|
||
// end
|
||
// cnt_tsync_shixu <= 4'd0;
|
||
// flag_tongdao <= 1'd0;
|
||
// acc_tsync <= acc_tsync;
|
||
// num_tsync <= num_tsync;
|
||
// end
|
||
// 7'd1:begin
|
||
// if(flag_save) begin
|
||
// flag_TSync_check<= 1'd0;
|
||
// state_check <= 7'd2;
|
||
// end
|
||
// else begin
|
||
// flag_TSync_check<= 1'd0;
|
||
// state_check <= state_check;
|
||
// end
|
||
// cnt_tsync_shixu <= 4'd1 + cnt_tsync_shixu;
|
||
// flag_tongdao <= 1'd0;
|
||
// acc_tsync <= acc_tsync;
|
||
// num_tsync <= num_tsync;
|
||
// end
|
||
// 7'd2:begin
|
||
// if(cnt==2'd3) begin
|
||
// flag_TSync_check<= 1'd1;
|
||
// state_check <= 7'd3;
|
||
// end
|
||
// else begin
|
||
// flag_TSync_check<= 1'd0;
|
||
// state_check <= state_check;
|
||
// end
|
||
// cnt_tsync_shixu <= 4'd1 + cnt_tsync_shixu;
|
||
// flag_tongdao <= 1'd0;
|
||
// acc_tsync <= acc_tsync;
|
||
// num_tsync <= num_tsync;
|
||
// end
|
||
// 7'd03:begin acc_tsync <= acc_01_reg; num_tsync <= 6'd00; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd04; end
|
||
// 7'd04:begin acc_tsync <= acc_02_reg; num_tsync <= 6'd01; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd05; end
|
||
// 7'd05:begin acc_tsync <= acc_03_reg; num_tsync <= 6'd02; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd06; end
|
||
// 7'd06:begin acc_tsync <= acc_04_reg; num_tsync <= 6'd03; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd07; end
|
||
// 7'd07:begin acc_tsync <= acc_05_reg; num_tsync <= 6'd04; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd08; end
|
||
// 7'd08:begin acc_tsync <= acc_06_reg; num_tsync <= 6'd05; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd09; end
|
||
// 7'd09:begin acc_tsync <= acc_07_reg; num_tsync <= 6'd06; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd10; end
|
||
// 7'd10:begin acc_tsync <= acc_08_reg; num_tsync <= 6'd07; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd11; end
|
||
// 7'd11:begin acc_tsync <= acc_09_reg; num_tsync <= 6'd08; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd12; end
|
||
// 7'd12:begin acc_tsync <= acc_10_reg; num_tsync <= 6'd09; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd13; end
|
||
// 7'd13:begin acc_tsync <= acc_11_reg; num_tsync <= 6'd10; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd14; end
|
||
// 7'd14:begin acc_tsync <= acc_12_reg; num_tsync <= 6'd11; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd15; end
|
||
// 7'd15:begin acc_tsync <= acc_13_reg; num_tsync <= 6'd12; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd16; end
|
||
// 7'd16:begin acc_tsync <= acc_14_reg; num_tsync <= 6'd13; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd17; end
|
||
// 7'd17:begin acc_tsync <= acc_15_reg; num_tsync <= 6'd14; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd18; end
|
||
// 7'd18:begin acc_tsync <= acc_16_reg; num_tsync <= 6'd15; flag_tongdao <= 1'd1; flag_TSync_check<= 1'd0; cnt_tsync_shixu <= 4'd0; state_check <=7'd0; end
|
||
// endcase
|
||
// end
|
||
// end
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// integer handle01;
|
||
// integer handle02;
|
||
|
||
// reg enable = 0;
|
||
// initial begin
|
||
// handle01=$fopen("TSyncout_i.txt","w"); $fclose(handle01);
|
||
// handle02=$fopen("TSyncout_q.txt","w"); $fclose(handle02);
|
||
|
||
// #10;
|
||
// enable = 1;
|
||
// end
|
||
|
||
// always@(posedge clk)begin
|
||
// if(enable)begin
|
||
// if(TSyncout_nd)begin
|
||
// handle01=$fopen("TSyncout_i.txt","a+");$fwrite(handle01,"%d\n",$signed(TSyncout_i));$fclose(handle01);
|
||
// handle02=$fopen("TSyncout_q.txt","a+");$fwrite(handle02,"%d\n",$signed(TSyncout_q));$fclose(handle02);
|
||
// end
|
||
// end
|
||
// end
|
||
|
||
|
||
|
||
|
||
endmodule
|