Add the recv hdl file
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/11/14 18:02:13
|
||||
// Design Name:
|
||||
// Module Name: ApproxAbs_12bit
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module ApproxAbs_18bit(
|
||||
input clk,
|
||||
input ND,
|
||||
input [17:0] Din_I,
|
||||
input [17:0] Din_Q,
|
||||
|
||||
output reg [18:0] Dout,
|
||||
output reg Rdy
|
||||
);
|
||||
|
||||
|
||||
|
||||
// 第一级延迟:把输入变负值:
|
||||
reg [17:0] Din_I_neg;
|
||||
always @ (posedge clk) begin
|
||||
if (Din_I[17:0]==18'b10_0000_0000_0000_0000)
|
||||
Din_I_neg[17:0] <= 18'b01_1111_1111_1111_1111;
|
||||
else
|
||||
Din_I_neg[17:0] <= -Din_I[17:0];
|
||||
end
|
||||
|
||||
reg [17:0] Din_Q_neg;
|
||||
always @ (posedge clk) begin
|
||||
if (Din_Q[17:0]==18'b10_0000_0000_0000_0000)
|
||||
Din_Q_neg[17:0] <= 18'b01_1111_1111_1111_1111;
|
||||
else
|
||||
Din_Q_neg[17:0] <= -Din_Q[17:0];
|
||||
end
|
||||
|
||||
|
||||
// 第二级延迟:求绝对值:
|
||||
reg [17:0] Din_I_D1;
|
||||
reg [17:0] Din_Q_D1;
|
||||
always @ (posedge clk) begin
|
||||
Din_I_D1[17:0] <= Din_I[17:0];
|
||||
Din_Q_D1[17:0] <= Din_Q[17:0];
|
||||
end
|
||||
|
||||
reg [17:0] Abs_Din_I;
|
||||
reg [17:0] Abs_Din_Q;
|
||||
always @ (posedge clk) begin
|
||||
if(Din_I_D1[17]==1'b1)
|
||||
Abs_Din_I[17:0] <= Din_I_neg[17:0];
|
||||
else
|
||||
Abs_Din_I[17:0] <= Din_I_D1[17:0];
|
||||
if(Din_Q_D1[17]==1'b1)
|
||||
Abs_Din_Q[17:0] <= Din_Q_neg[17:0];
|
||||
else
|
||||
Abs_Din_Q[17:0] <= Din_Q_D1[17:0];
|
||||
end
|
||||
|
||||
|
||||
// 第三级延迟:确定I/Q两路绝对值的大小关系:
|
||||
reg [17:0] AbsIQ_max;
|
||||
reg [17:0] AbsIQ_min;
|
||||
always @ (posedge clk) begin
|
||||
if (Abs_Din_I[17:0]>=Abs_Din_Q[17:0]) begin
|
||||
AbsIQ_max[17:0] <= Abs_Din_I[17:0];
|
||||
AbsIQ_min[17:0] <= Abs_Din_Q[17:0];
|
||||
end
|
||||
else begin
|
||||
AbsIQ_max[17:0] <= Abs_Din_Q[17:0];
|
||||
AbsIQ_min[17:0] <= Abs_Din_I[17:0];
|
||||
end
|
||||
end
|
||||
|
||||
// 第四级延迟:MXQ选择的系数:7/8和1/2:
|
||||
reg [17:0] AbsIQ_max_7by8;
|
||||
reg [17:0] AbsIQ_min_1by2;
|
||||
always @ (posedge clk) begin
|
||||
AbsIQ_max_7by8[17:0] <= AbsIQ_max[17:0]-{3'b000,AbsIQ_max[17:3]};
|
||||
AbsIQ_min_1by2[17:0] <= {AbsIQ_min[17],AbsIQ_min[17:1]};
|
||||
end
|
||||
|
||||
// 第五级延迟:1bit位扩展求和:
|
||||
// (MXQ)中间将最大延迟一个clk赋给 Dout_Temp2,使 Dout_Temp2与 Dout_Temp在同一个clk下进行比较。
|
||||
reg [18:0] Dout_Temp;
|
||||
reg [18:0] Dout_Temp1;
|
||||
reg [18:0] Dout_Temp2;
|
||||
always @ (posedge clk) begin
|
||||
Dout_Temp[18:0] <= {1'b0,AbsIQ_max_7by8[17:0]} + {1'b0,AbsIQ_min_1by2[17:0]};
|
||||
Dout_Temp1[18:0] <= {1'b0,AbsIQ_max[17:0]};
|
||||
Dout_Temp2[18:0] <= Dout_Temp1[18:0];
|
||||
end
|
||||
|
||||
// (MXQ)第六级延迟:输出求和值与I/Q两路绝对值最大值比较之后的最大值:
|
||||
|
||||
always @ (posedge clk) begin
|
||||
if(Dout_Temp[18:0]>=Dout_Temp2[17:0])
|
||||
Dout[18:0] <= Dout_Temp[18:0];
|
||||
else
|
||||
Dout[18:0] <= Dout_Temp2[18:0];
|
||||
end
|
||||
|
||||
// 产生Rdy,与ND有六级延迟:
|
||||
reg Rdy_b5 = 1'b0;
|
||||
reg Rdy_b4 = 1'b0;
|
||||
reg Rdy_b3 = 1'b0;
|
||||
reg Rdy_b2 = 1'b0;
|
||||
reg Rdy_b1 = 1'b0;
|
||||
|
||||
always@(posedge clk) begin//(MXQ)必须加 posedge clk ,否则仿真有问题,内存溢出
|
||||
Rdy_b5 <= ND;
|
||||
Rdy_b4 <= Rdy_b5;
|
||||
Rdy_b3 <= Rdy_b4;
|
||||
Rdy_b2 <= Rdy_b3;
|
||||
Rdy_b1 <= Rdy_b2;
|
||||
Rdy <= Rdy_b1;
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,125 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 18:12 11/14/2019
|
||||
// Design Name:
|
||||
// Module Name: ApproxAbs_v1
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
// 1. 在ApproxAbs基础上,由MXQ仿真、修改得到。
|
||||
// 2. 主要修改有两处:A.如果Max比(7/8*max+1/2*min)更大,就输出max。这样更准确。
|
||||
// B.原版在生成Dout_valid的逻辑中,犯了always后面没有“@ (posedge clk)”的错误。
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// v2(2015/11/07):
|
||||
// 1. 更改输入为17bits,输出为18bits。
|
||||
// 2. 取消Din_valid和Dout_valid。改为ND和Rdy。
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
module ApproxAbs_v2 (
|
||||
input clk,
|
||||
input ND,
|
||||
input [9:0] Din_I,
|
||||
input [9:0] Din_Q,
|
||||
output reg [10:0] Dout = 11'd0,
|
||||
output reg Rdy = 1'b0
|
||||
);
|
||||
|
||||
|
||||
|
||||
// 第一级延迟:把输入变负值:
|
||||
reg [9:0] Din_I_neg;
|
||||
always @(posedge clk) begin
|
||||
if (Din_I[9:0] == 10'b1000_0000_00) Din_I_neg[9:0] <= 10'b0111_1111_11;
|
||||
else Din_I_neg[9:0] <= -Din_I[9:0];
|
||||
end
|
||||
|
||||
reg [9:0] Din_Q_neg;
|
||||
always @(posedge clk) begin
|
||||
if (Din_Q[9:0] == 10'b1000_0000_00) Din_Q_neg[9:0] <= 10'b0111_1111_11;
|
||||
else Din_Q_neg[9:0] <= -Din_Q[9:0];
|
||||
end
|
||||
|
||||
|
||||
// 第二级延迟:求绝对值:
|
||||
reg [9:0] Din_I_D1;
|
||||
reg [9:0] Din_Q_D1;
|
||||
always @(posedge clk) begin
|
||||
Din_I_D1[9:0] <= Din_I[9:0];
|
||||
Din_Q_D1[9:0] <= Din_Q[9:0];
|
||||
end
|
||||
|
||||
reg [9:0] Abs_Din_I;
|
||||
reg [9:0] Abs_Din_Q;
|
||||
always @(posedge clk) begin
|
||||
if (Din_I_D1[9] == 1'b1) Abs_Din_I[9:0] <= Din_I_neg[9:0];
|
||||
else Abs_Din_I[9:0] <= Din_I_D1[9:0];
|
||||
if (Din_Q_D1[9] == 1'b1) Abs_Din_Q[9:0] <= Din_Q_neg[9:0];
|
||||
else Abs_Din_Q[9:0] <= Din_Q_D1[9:0];
|
||||
end
|
||||
|
||||
|
||||
// 第三级延迟:确定I/Q两路绝对值的大小关系:
|
||||
reg [9:0] AbsIQ_max;
|
||||
reg [9:0] AbsIQ_min;
|
||||
always @(posedge clk) begin
|
||||
if (Abs_Din_I[9:0] >= Abs_Din_Q[9:0]) begin
|
||||
AbsIQ_max[9:0] <= Abs_Din_I[9:0];
|
||||
AbsIQ_min[9:0] <= Abs_Din_Q[9:0];
|
||||
end
|
||||
else begin
|
||||
AbsIQ_max[9:0] <= Abs_Din_Q[9:0];
|
||||
AbsIQ_min[9:0] <= Abs_Din_I[9:0];
|
||||
end
|
||||
end
|
||||
|
||||
// 第四级延迟:MXQ选择的系数:7/8和1/2:
|
||||
reg [9:0] AbsIQ_max_7by8;
|
||||
reg [9:0] AbsIQ_min_1by2;
|
||||
always @(posedge clk) begin
|
||||
AbsIQ_max_7by8[9:0] <= AbsIQ_max[9:0] - {3'b000, AbsIQ_max[9:3]};
|
||||
AbsIQ_min_1by2[9:0] <= {AbsIQ_min[9], AbsIQ_min[9:1]};
|
||||
end
|
||||
|
||||
// 第五级延迟:1bit位扩展求和:
|
||||
// (MXQ)中间将最大延迟一个clk赋给 Dout_Temp2,使 Dout_Temp2与 Dout_Temp在同一个clk下进行比较。
|
||||
reg [10:0] Dout_Temp;
|
||||
reg [10:0] Dout_Temp1;
|
||||
reg [10:0] Dout_Temp2;
|
||||
always @(posedge clk) begin
|
||||
Dout_Temp[10:0] <= {1'b0, AbsIQ_max_7by8[9:0]} + {1'b0, AbsIQ_min_1by2[9:0]};
|
||||
Dout_Temp1[10:0] <= {1'b0, AbsIQ_max[9:0]};
|
||||
Dout_Temp2[10:0] <= Dout_Temp1[10:0];
|
||||
end
|
||||
|
||||
// (MXQ)第六级延迟:输出求和值与I/Q两路绝对值最大值比较之后的最大值:
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (Dout_Temp[10:0] >= Dout_Temp2[9:0]) Dout[10:0] <= Dout_Temp[10:0];
|
||||
else Dout[10:0] <= Dout_Temp2[10:0];
|
||||
end
|
||||
|
||||
// 产生Rdy,与ND有六级延迟:
|
||||
reg Rdy_b5 = 1'b0;
|
||||
reg Rdy_b4 = 1'b0;
|
||||
reg Rdy_b3 = 1'b0;
|
||||
reg Rdy_b2 = 1'b0;
|
||||
reg Rdy_b1 = 1'b0;
|
||||
|
||||
always @(posedge clk) begin //(MXQ)必须加 posedge clk ,否则仿真有问题,内存溢出
|
||||
Rdy_b5 <= ND;
|
||||
Rdy_b4 <= Rdy_b5;
|
||||
Rdy_b3 <= Rdy_b4;
|
||||
Rdy_b2 <= Rdy_b3;
|
||||
Rdy_b1 <= Rdy_b2;
|
||||
Rdy <= Rdy_b1;
|
||||
end
|
||||
|
||||
endmodule
|
||||
+1192
File diff suppressed because it is too large
Load Diff
+552
@@ -0,0 +1,552 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2020/08/18 16:40:38
|
||||
// Design Name:
|
||||
// Module Name: DAGC_v2
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module DAGC_v2 (
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input mgc1_rdy,
|
||||
input framesync_d0,
|
||||
|
||||
input [1:0] vio_powertest_h,
|
||||
input [1:0] vio_powertest_l,
|
||||
|
||||
input [9:0] matchfilterout_i,
|
||||
input [9:0] matchfilterout_q,
|
||||
|
||||
output reg [9:0] DAGC_out_i = 10'd0,
|
||||
output reg [9:0] DAGC_out_q = 10'd0,
|
||||
|
||||
//检测用
|
||||
output reg flag_agch = 1'd0,
|
||||
output reg flag_agcl = 1'd0,
|
||||
output reg flag_agc_power = 1'd0,
|
||||
output reg [12:0] agc_ref = 13'd0,
|
||||
output reg [12:0] agc_check = 13'd0,
|
||||
output reg dagc_rdy,
|
||||
output reg mgc_rdy,
|
||||
output reg rst_dagc
|
||||
);
|
||||
|
||||
|
||||
//近似求模值方法,做4096累积平均
|
||||
|
||||
//-------------------------------------数据缓存----------------------------//
|
||||
reg wea_1 = 1'd0;
|
||||
reg [11:0] addrin_1 = 12'd0;
|
||||
reg [ 9:0] din_1i = 10'd0;
|
||||
reg [11:0] addrout_1 = 12'd0;
|
||||
wire [ 9:0] dout_1i;
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------给数据、打缓存的状态机-------------------------------------//
|
||||
reg ND = 1'd0;
|
||||
reg [ 9:0] Din_I = 10'd0;
|
||||
reg [ 9:0] Din_Q = 10'd0;
|
||||
reg [ 5:0] cnt_50 = 6'd0;
|
||||
reg [ 2:0] state_storage = 3'd0;
|
||||
|
||||
|
||||
wire [ 9:0] mf_i;
|
||||
wire [ 9:0] mf_q;
|
||||
wire empty;
|
||||
wire full;
|
||||
reg rd_en = 1'b0;
|
||||
wire [13:0] data_count;
|
||||
fifo_dagc fifo_dagc (
|
||||
.clk (clk),
|
||||
.srst (rst),
|
||||
.din ({matchfilterout_q, matchfilterout_i}),
|
||||
.wr_en (mgc1_rdy),
|
||||
.full (empty),
|
||||
.rd_en (rd_en),
|
||||
.empty (full),
|
||||
.dout ({mf_q, mf_i}),
|
||||
.data_count(data_count)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------求近似模值的模块----------------------------//
|
||||
wire [10:0] Dout;
|
||||
wire [ 0:0] Rdy_abs;
|
||||
ApproxAbs_v2 ApproxAbs_v2_djy (
|
||||
.clk (clk),
|
||||
.ND (mgc1_rdy),
|
||||
.Din_I(matchfilterout_i),
|
||||
.Din_Q(matchfilterout_q),
|
||||
.Dout (Dout),
|
||||
.Rdy (Rdy_abs)
|
||||
);
|
||||
|
||||
reg framesync_d1;
|
||||
reg framesync_d2;
|
||||
reg framesync_d3;
|
||||
reg framesync_d4;
|
||||
reg framesync_d5;
|
||||
reg framesync;
|
||||
|
||||
always @(posedge clk) begin //(MXQ)必须加 posedge clk ,否则仿真有问题,内存溢出
|
||||
framesync_d1 <= framesync_d0; //与ApproxAbs_v2_djy同步
|
||||
framesync_d2 <= framesync_d1;
|
||||
framesync_d3 <= framesync_d2;
|
||||
framesync_d4 <= framesync_d3;
|
||||
framesync_d5 <= framesync_d4;
|
||||
framesync <= framesync_d5;
|
||||
end
|
||||
|
||||
|
||||
//-------------------------------------LUT----------------------------//
|
||||
reg [10:0] addr_lut = 11'd0;
|
||||
wire [13:0] dout_lut;
|
||||
DAGC_LUT_rom DAGC_LUT_rom (
|
||||
.clka (clk), // input clka
|
||||
.addra(addr_lut), // input [10 : 0] addra
|
||||
.douta(dout_lut) // output [13 : 0] douta
|
||||
);
|
||||
|
||||
reg dagc_rdy_d0;
|
||||
reg dagc_rdy_d1;
|
||||
reg dagc_rdy_d2;
|
||||
reg dagc_rdy_d3;
|
||||
reg dagc_rdy_d4;
|
||||
reg mgc_rdy_d0;
|
||||
reg mgc_rdy_d1;
|
||||
reg mgc_rdy_d2;
|
||||
reg mgc_rdy_d3;
|
||||
reg mgc_rdy_d4;
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
dagc_rdy_d1 <= 1'b0;
|
||||
dagc_rdy_d2 <= 1'b0;
|
||||
dagc_rdy_d3 <= 1'b0;
|
||||
dagc_rdy_d4 <= 1'b0;
|
||||
dagc_rdy <= 1'b0;
|
||||
mgc_rdy_d1 <= 1'b0;
|
||||
mgc_rdy_d2 <= 1'b0;
|
||||
mgc_rdy_d3 <= 1'b0;
|
||||
mgc_rdy_d4 <= 1'b0;
|
||||
mgc_rdy <= 1'b0;
|
||||
|
||||
end
|
||||
else begin
|
||||
dagc_rdy_d1 <= dagc_rdy_d0;
|
||||
dagc_rdy_d2 <= dagc_rdy_d1;
|
||||
dagc_rdy_d3 <= dagc_rdy_d2;
|
||||
dagc_rdy_d4 <= dagc_rdy_d3;
|
||||
dagc_rdy <= dagc_rdy_d4;
|
||||
mgc_rdy_d1 <= mgc_rdy_d0;
|
||||
mgc_rdy_d2 <= mgc_rdy_d1;
|
||||
mgc_rdy_d3 <= mgc_rdy_d2;
|
||||
mgc_rdy_d4 <= mgc_rdy_d3;
|
||||
mgc_rdy <= mgc_rdy_d4;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
//-------------------------------------求均值、查表、给补偿指令的状态机----------------------------//
|
||||
reg [ 3:0] state_agc = 4'd0;
|
||||
reg [11:0] cnt_4096_3 = 12'd0;
|
||||
reg [22:0] agc_ref_temp = 23'd0;
|
||||
reg [14:0] agc_ref_h = 15'd0;
|
||||
reg [12:0] agc_ref_l = 13'd0;
|
||||
|
||||
reg flag_ram_1 = 1'd0;
|
||||
reg flag_ram_2 = 1'd0;
|
||||
reg [14:0] cnt_databag = 15'd0;
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
state_agc <= 4'd0;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd0;
|
||||
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
flag_agc_power <= 1'd0;
|
||||
|
||||
agc_ref <= agc_ref;
|
||||
agc_ref_temp <= 23'd0;
|
||||
agc_check <= agc_check;
|
||||
agc_ref_h <= 15'd0;
|
||||
agc_ref_l <= 13'd0;
|
||||
|
||||
addr_lut <= 11'd0;
|
||||
flag_ram_1 <= 1'd0;
|
||||
flag_ram_2 <= 1'd0;
|
||||
dagc_rdy_d0 <= 1'b0;
|
||||
rd_en <= 1'b0;
|
||||
mgc_rdy_d0 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
case (state_agc)
|
||||
4'd0: begin
|
||||
if (Rdy_abs) begin //状态0进入第一次估计
|
||||
state_agc <= 4'd1;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
cnt_4096_3 <= 12'd1;
|
||||
cnt_databag <= 15'd1;
|
||||
end
|
||||
else begin
|
||||
state_agc <= state_agc;
|
||||
agc_ref_temp <= 23'd0;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd0;
|
||||
end
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
flag_agc_power <= 1'd0;
|
||||
|
||||
agc_ref <= 13'd0;
|
||||
agc_check <= 13'd0;
|
||||
agc_ref_h <= 15'd0;
|
||||
agc_ref_l <= 13'd0;
|
||||
|
||||
addr_lut <= 11'd0;
|
||||
flag_ram_1 <= 1'd0;
|
||||
flag_ram_2 <= 1'd0;
|
||||
|
||||
end
|
||||
|
||||
4'd1: begin
|
||||
if (cnt_4096_3 == 12'd4095) begin
|
||||
state_agc <= 4'd2;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
else begin
|
||||
state_agc <= state_agc;
|
||||
cnt_4096_3 <= 12'd01 + cnt_4096_3;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
agc_ref_temp <= agc_ref_temp + {12'd0, Dout};
|
||||
flag_agc_power <= 1'd0;
|
||||
end
|
||||
|
||||
4'd2: begin
|
||||
if (framesync == 1'b1) begin //判断是否有帧同步如果有进入有效数据计算段
|
||||
state_agc <= 4'd3;
|
||||
end
|
||||
else begin
|
||||
state_agc <= 4'd10;
|
||||
end
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
agc_ref <= agc_ref_temp[22:10];
|
||||
agc_check <= agc_ref_temp[22:10];
|
||||
flag_agc_power <= 1'd1;
|
||||
|
||||
end
|
||||
|
||||
4'd3: begin
|
||||
if (cnt_databag == 15'd13695) begin
|
||||
cnt_databag <= 15'd0;
|
||||
state_agc <= 4'd4;
|
||||
cnt_4096_3 <= 12'd1;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
end
|
||||
else begin
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
state_agc <= state_agc;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
end
|
||||
flag_agc_power <= 1'd0;
|
||||
case (vio_powertest_h)
|
||||
2'd0: agc_ref_h <= {2'd0, agc_ref} + {4'd0, agc_ref[12:2]};
|
||||
2'd1: agc_ref_h <= {2'd0, agc_ref} + {3'd0, agc_ref[12:1]};
|
||||
2'd2: agc_ref_h <= {1'd0, agc_ref, 1'd0};
|
||||
2'd3: agc_ref_h <= {agc_ref, 2'd0};
|
||||
endcase
|
||||
case (vio_powertest_l)
|
||||
2'd0: agc_ref_l <= agc_ref - {3'd0, agc_ref[12:3]};
|
||||
2'd1: agc_ref_l <= agc_ref - {2'd0, agc_ref[12:2]};
|
||||
2'd2: agc_ref_l <= {1'd0, agc_ref[12:1]};
|
||||
2'd3: agc_ref_l <= {2'd0, agc_ref[12:2]};
|
||||
endcase
|
||||
|
||||
//查表地址
|
||||
if (agc_check <= 13'd11) addr_lut <= 11'd0;
|
||||
else begin
|
||||
if (agc_check >= 13'd2037) addr_lut <= 11'd2026;
|
||||
else addr_lut <= agc_check[10:0] - 11'd11;
|
||||
end
|
||||
flag_ram_1 <= 1'd1;
|
||||
flag_ram_2 <= 1'd0;
|
||||
rd_en <= 1'b1;
|
||||
dagc_rdy_d0 <= 1'b1;
|
||||
end
|
||||
|
||||
4'd4: begin
|
||||
if (cnt_4096_3 == 12'd4095) begin
|
||||
state_agc <= 4'd5;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
else begin
|
||||
state_agc <= state_agc;
|
||||
cnt_4096_3 <= 12'd01 + cnt_4096_3;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
agc_ref_temp <= agc_ref_temp + {12'd0, Dout};
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
flag_agc_power <= 1'd0;
|
||||
|
||||
flag_ram_1 <= 1'd0;
|
||||
flag_ram_2 <= 1'd0;
|
||||
end
|
||||
|
||||
4'd5: begin
|
||||
state_agc <= 4'd6;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
agc_check <= agc_ref_temp[22:10];
|
||||
flag_agc_power <= 1'd1;
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
|
||||
4'd6: begin
|
||||
if (cnt_databag == 15'd13823) begin
|
||||
cnt_databag <= 15'd0;
|
||||
state_agc <= 4'd7;
|
||||
cnt_4096_3 <= 12'd1;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
end
|
||||
else begin
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
state_agc <= state_agc;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
end
|
||||
flag_agc_power <= 1'd0;
|
||||
if ({2'd0, agc_check} > agc_ref_h) begin
|
||||
flag_agch <= 1'd1;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
if (agc_check < agc_ref_l) begin
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd1;
|
||||
end
|
||||
else begin
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
end
|
||||
//查表地址
|
||||
if (agc_check <= 13'd11) addr_lut <= 11'd0;
|
||||
else begin
|
||||
if (agc_check >= 13'd2037) addr_lut <= 11'd2026;
|
||||
else addr_lut <= agc_check[10:0] - 11'd11;
|
||||
end
|
||||
flag_ram_1 <= 1'd0;
|
||||
flag_ram_2 <= 1'd1;
|
||||
end
|
||||
|
||||
4'd7: begin
|
||||
if (cnt_4096_3 == 12'd4095) begin
|
||||
state_agc <= 4'd8;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
else begin
|
||||
state_agc <= state_agc;
|
||||
cnt_4096_3 <= 12'd01 + cnt_4096_3;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
end
|
||||
agc_ref_temp <= agc_ref_temp + {12'd0, Dout};
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
flag_agc_power <= 1'd0;
|
||||
|
||||
flag_ram_1 <= 1'd0;
|
||||
flag_ram_2 <= 1'd0;
|
||||
end
|
||||
|
||||
4'd8: begin
|
||||
state_agc <= 4'd9;
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
agc_check <= agc_ref_temp[22:10];
|
||||
flag_agc_power <= 1'd1;
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
|
||||
4'd9: begin
|
||||
if (cnt_databag == 15'd13823) begin
|
||||
cnt_databag <= 15'd0;
|
||||
state_agc <= 4'd4;
|
||||
cnt_4096_3 <= 12'd1;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
end
|
||||
else begin
|
||||
cnt_databag <= 15'd1 + cnt_databag;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
state_agc <= state_agc;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
end
|
||||
flag_agc_power <= 1'd0;
|
||||
if ({2'd0, agc_check} > agc_ref_h) begin
|
||||
flag_agch <= 1'd1;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
if (agc_check < agc_ref_l) begin
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd1;
|
||||
end
|
||||
else begin
|
||||
flag_agch <= 1'd0;
|
||||
flag_agcl <= 1'd0;
|
||||
end
|
||||
end
|
||||
|
||||
//查表地址
|
||||
if (agc_check <= 13'd11) addr_lut <= 11'd0;
|
||||
else begin
|
||||
if (agc_check >= 13'd2037) addr_lut <= 11'd2026;
|
||||
else addr_lut <= agc_check[10:0] - 11'd11;
|
||||
end
|
||||
flag_ram_1 <= 1'd1;
|
||||
flag_ram_2 <= 1'd0;
|
||||
end
|
||||
4'd10: begin
|
||||
if (framesync == 1'b1) begin
|
||||
state_agc <= 4'd1;
|
||||
agc_ref_temp <= {12'd0, Dout};
|
||||
cnt_4096_3 <= 12'd1;
|
||||
cnt_databag <= 15'd1;
|
||||
end
|
||||
else begin
|
||||
state_agc <= state_agc;
|
||||
cnt_databag <= 15'd0;
|
||||
cnt_4096_3 <= 12'd0;
|
||||
flag_agc_power <= 1'd0;
|
||||
agc_ref_temp <= agc_ref_temp;
|
||||
case (vio_powertest_h)
|
||||
2'd0: agc_ref_h <= {2'd0, agc_ref} + {4'd0, agc_ref[12:2]};
|
||||
2'd1: agc_ref_h <= {2'd0, agc_ref} + {3'd0, agc_ref[12:1]};
|
||||
2'd2: agc_ref_h <= {1'd0, agc_ref, 1'd0};
|
||||
2'd3: agc_ref_h <= {agc_ref, 2'd0};
|
||||
endcase
|
||||
case (vio_powertest_l)
|
||||
2'd0: agc_ref_l <= agc_ref - {3'd0, agc_ref[12:3]};
|
||||
2'd1: agc_ref_l <= agc_ref - {2'd0, agc_ref[12:2]};
|
||||
2'd2: agc_ref_l <= {1'd0, agc_ref[12:1]};
|
||||
2'd3: agc_ref_l <= {2'd0, agc_ref[12:2]};
|
||||
endcase
|
||||
|
||||
//查表地址
|
||||
if (agc_check <= 13'd11) addr_lut <= 11'd0;
|
||||
else begin
|
||||
if (agc_check >= 13'd2037) addr_lut <= 11'd2026;
|
||||
else addr_lut <= agc_check[10:0] - 11'd11;
|
||||
end
|
||||
flag_ram_1 <= 1'd1;
|
||||
flag_ram_2 <= 1'd0;
|
||||
rd_en <= 1'b1;
|
||||
mgc_rdy_d0 <= 1'b1;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
reg [13:0] agcdata0 = 14'd0;
|
||||
reg [13:0] agcdata1 = 14'd0;
|
||||
always @(posedge clk) begin
|
||||
agcdata0 <= dout_lut;
|
||||
agcdata1 <= agcdata0;
|
||||
end
|
||||
//-------------------------------------补偿用的乘法器----------------------------//
|
||||
wire [23:0] mulout_i;
|
||||
DAGC_mul_10bit12 DAGC_mul_10bit12_i (
|
||||
.CLK(clk), // input clk
|
||||
.A (mf_i), // input [9 : 0] a
|
||||
.B (agcdata0), // input [13 : 0] b
|
||||
.P (mulout_i) // output [23 : 0] p
|
||||
);
|
||||
|
||||
wire [23:0] mulout_q;
|
||||
DAGC_mul_10bit12 DAGC_mul_10bit12_q (
|
||||
.CLK(clk), // input clk
|
||||
.A (mf_q), // input [9 : 0] a
|
||||
.B (agcdata0), // input [13 : 0] b
|
||||
.P (mulout_q) // output [23 : 0] p
|
||||
);
|
||||
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (mulout_i[23:17] == 7'b111_1111 || mulout_i[23:17] == 7'b000_0000) DAGC_out_i <= mulout_i[17:8];
|
||||
else DAGC_out_i <= (mulout_i[23]) ? 10'b1000_0000_01 : 10'b0111_1111_11;
|
||||
|
||||
if (mulout_q[23:17] == 7'b111_1111 || mulout_q[23:17] == 7'b000_0000) DAGC_out_q <= mulout_q[17:8];
|
||||
else DAGC_out_q <= (mulout_q[23]) ? 10'b1000_0000_01 : 10'b0111_1111_11;
|
||||
end
|
||||
|
||||
/*ila_dagc ila_dagc(
|
||||
.clk(clk),
|
||||
.probe0(mgc1_rdy),
|
||||
.probe1(empty),
|
||||
.probe2(full),
|
||||
.probe3(rd_en),
|
||||
.probe4(DAGC_out_i),
|
||||
.probe5(DAGC_out_q),
|
||||
.probe6(state_agc),
|
||||
.probe7(dagc_rdy),
|
||||
.probe8(mgc_rdy),
|
||||
.probe9(data_count)
|
||||
|
||||
);*/
|
||||
|
||||
reg [19:0] cnt_rst = 20'd0;
|
||||
always @(posedge clk) begin
|
||||
if (dagc_rdy_d0 && !dagc_rdy_d1) begin
|
||||
cnt_rst <= 20'd0;
|
||||
rst_dagc <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (cnt_rst == 20'd580620) begin
|
||||
rst_dagc <= 1'b1;
|
||||
cnt_rst <= cnt_rst + 20'd1;
|
||||
end
|
||||
else if (cnt_rst == 20'd580621) begin
|
||||
rst_dagc <= 1'b0;
|
||||
cnt_rst <= cnt_rst;
|
||||
end
|
||||
else begin
|
||||
cnt_rst <= cnt_rst + 20'd1;
|
||||
rst_dagc <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,211 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/08/03 14:12:18
|
||||
// Design Name:
|
||||
// Module Name: DDS_compensate
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module DDS_compensate(
|
||||
clk,
|
||||
rst,
|
||||
din_nd, // 输入数据
|
||||
din_i,
|
||||
din_q,
|
||||
acq_nd, // 捕获信息
|
||||
dfreq_word_nd, // 频偏NCO信息
|
||||
dfreq_word,
|
||||
framesync_success, // 帧同步标志,用于切码
|
||||
// rs_idx_nd, //数据段信息速率,在帧同步标志后、勤务段最后一个数据前给出,!但并不表示从rs_idx_nd有效起输入就是数据段的数据了
|
||||
// rs_idx,
|
||||
|
||||
demod_trunc_i,
|
||||
demod_trunc_q,
|
||||
demod_trunc_nd,
|
||||
Demod_ovrflw
|
||||
|
||||
);
|
||||
input clk;
|
||||
input rst;
|
||||
input din_nd;
|
||||
input [11:0] din_i,din_q;
|
||||
input acq_nd;
|
||||
|
||||
input dfreq_word_nd;
|
||||
input [13:0] dfreq_word; //-- 解调频偏
|
||||
input framesync_success;
|
||||
|
||||
//-- 8个可变数据速率,从0~7分别代表30k~3840k
|
||||
wire rs_idx_nd =1'b0;
|
||||
wire [2:0] rs_idx;
|
||||
assign rs_idx =3'b000;
|
||||
output [11:0] demod_trunc_i,demod_trunc_q;
|
||||
output demod_trunc_nd ;
|
||||
output Demod_ovrflw;
|
||||
wire [4:0] acq_freindex; //-- 捕获频偏
|
||||
assign acq_freindex =5'd0;
|
||||
//----------------------------- DDS For FreqShift --------------------------------
|
||||
//-- 注意这里DDS产生的是偏移频率,下面补偿的时候要与DDS输出的【共轭】相复乘
|
||||
localparam DDS_width = 24; //25bits in fact
|
||||
|
||||
reg dds_rst = 0; // DDS starts after acquisition
|
||||
reg [DDS_width:0] dds_start_freq = 0;
|
||||
reg dds_update = 0; // identifier of updated deltafrequency & its rate
|
||||
reg [DDS_width:0] dds_update_df = 0;
|
||||
reg [DDS_width:0] dds_phase = 0;
|
||||
reg [DDS_width:0] dds_freq = 0; // 相位累积量,残余频偏和变化率控制
|
||||
/*wire [13:0] freq_abs;
|
||||
reg freq_plus;
|
||||
assign freq_abs=(dfreq_word[13]==1'd1)? -dfreq_word:dfreq_word;
|
||||
always @ (posedge clk) begin
|
||||
if(rst) begin
|
||||
freq_plus <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if(dfreq_word_nd) begin
|
||||
freq_plus <= dfreq_word[13];
|
||||
end
|
||||
else begin
|
||||
freq_plus <= freq_plus;
|
||||
end
|
||||
end
|
||||
end
|
||||
*/
|
||||
|
||||
always @(posedge clk)
|
||||
if (rst || acq_nd)
|
||||
dds_rst <= 1;
|
||||
else
|
||||
dds_rst <= 0;
|
||||
|
||||
always @(posedge clk)
|
||||
if (!rst && acq_nd)
|
||||
dds_start_freq <= {{8{acq_freindex[4]}},acq_freindex[4:0],{(DDS_width-12){1'b0}}};
|
||||
else
|
||||
dds_start_freq <= dds_start_freq;
|
||||
always @(posedge clk)
|
||||
if (!rst && dfreq_word_nd) begin
|
||||
dds_update <= 1;
|
||||
dds_update_df <= {{(DDS_width-13){dfreq_word[13]}},dfreq_word[13:0]};
|
||||
end
|
||||
else
|
||||
dds_update <= 0;
|
||||
|
||||
always @(posedge clk)
|
||||
if (rst || dds_rst)
|
||||
dds_phase <= 0;
|
||||
else if (din_nd)
|
||||
dds_phase <= dds_phase + dds_freq;
|
||||
else
|
||||
dds_phase <= dds_phase;
|
||||
|
||||
wire [DDS_width:0] updata_s;
|
||||
AdderSigned_25_25_2dly DDS_DFreq_Update1 (
|
||||
//.A(dds_freq), // input wire [24 : 0] A
|
||||
.A(25'd0),
|
||||
.B(dds_update_df), // input wire [24 : 0] B
|
||||
.CLK(clk), // input wire CLK
|
||||
.S(updata_s) // output wire [24 : 0] S
|
||||
);
|
||||
|
||||
//--- delay ---
|
||||
reg dds_update_d1 = 0,dds_update_d2 = 0;
|
||||
reg din_nd_d1 = 0,din_nd_d2 = 0;
|
||||
always @(posedge clk)
|
||||
if (rst) begin
|
||||
dds_update_d1 <= 0;
|
||||
dds_update_d2 <= 0;
|
||||
din_nd_d1 <= 0;
|
||||
din_nd_d2 <= 0;
|
||||
end
|
||||
else begin
|
||||
dds_update_d1 <= dds_update;
|
||||
dds_update_d2 <= dds_update_d1;
|
||||
din_nd_d1 <= din_nd;
|
||||
din_nd_d2 <= din_nd_d1;
|
||||
end
|
||||
always @(posedge clk)
|
||||
if (rst)
|
||||
dds_freq <= 0;
|
||||
else if (dds_rst)
|
||||
dds_freq <= dds_start_freq;
|
||||
else if (dds_update_d2)
|
||||
dds_freq <= updata_s;
|
||||
else
|
||||
dds_freq <= dds_freq;
|
||||
|
||||
reg [12:0] cos_addr = 0,sin_addr = -13'd2048;
|
||||
wire [11:0] cos_dout,sin_dout;
|
||||
always @(posedge clk)
|
||||
if (rst) begin
|
||||
cos_addr <= 0;
|
||||
sin_addr <= -13'd2048;
|
||||
end
|
||||
else begin
|
||||
cos_addr <= dds_phase[DDS_width:DDS_width-12];
|
||||
sin_addr <= dds_phase[DDS_width:DDS_width-12] - 13'd2048;
|
||||
end
|
||||
COSLUT_8192 DDS_12bit_8192 (
|
||||
.clka(clk), // input wire clka
|
||||
.addra(cos_addr), // input wire [12 : 0] addra
|
||||
.douta(cos_dout), // output wire [11 : 0] douta
|
||||
.clkb(clk), // input wire clkb
|
||||
.addrb(sin_addr), // input wire [12 : 0] addrb
|
||||
.doutb(sin_dout) // output wire [11 : 0] doutb
|
||||
);
|
||||
|
||||
//------------------------------- Compensate ------------------------------
|
||||
wire [24:0] demod_i,demod_q;
|
||||
wire [13:0] DemodMult_pad;
|
||||
//wire [11:0] demod_trunc_i,demod_trunc_q;
|
||||
wire demod_nd; //排除第一个,这两个信号和din_nd是同步的
|
||||
//wire demod_trunc_nd;
|
||||
wire Demod_ovrflw_i,Demod_ovrflw_q;
|
||||
//wire Demod_ovrflw ;
|
||||
assign Demod_ovrflw = Demod_ovrflw_i || Demod_ovrflw_q;
|
||||
/*wire [11:0] sin_din;
|
||||
wire [11:0] cos_din;
|
||||
assign sin_din=(freq_plus==1'd1)? sin_dout:-sin_dout;
|
||||
assign cos_din = cos_dout;*/
|
||||
ComplexMult12x12_4dly MultFreq (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_a_tvalid(din_nd), // input wire s_axis_a_tvalid
|
||||
.s_axis_a_tdata({4'd0,din_q,4'd0,din_i}), // input wire [31 : 0] s_axis_a_tdata
|
||||
.s_axis_b_tvalid(din_nd), // input wire s_axis_b_tvalid
|
||||
.s_axis_b_tdata({4'd0,-sin_dout,4'd0,cos_dout}), // input wire [15 : 0] s_axis_b_tdata
|
||||
.m_axis_dout_tvalid(demod_nd), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata({DemodMult_pad[13:7],demod_q,DemodMult_pad[6:0],demod_i}) // output wire [47 : 0] m_axis_dout_tdata
|
||||
);
|
||||
trunc_25to12_2dly Trunc_demod_i (
|
||||
.clk(clk),
|
||||
.din_nd(demod_nd),
|
||||
.din(demod_i),
|
||||
.ctrl(),
|
||||
.dout_nd(demod_trunc_nd),
|
||||
.dout(demod_trunc_i),
|
||||
.ovrflw(Demod_ovrflw_i)
|
||||
);
|
||||
trunc_25to12_2dly Trunc_demod_q (
|
||||
.clk(clk),
|
||||
.din_nd(demod_nd),
|
||||
.din(demod_q),
|
||||
.ctrl(),
|
||||
.dout_nd(),
|
||||
.dout(demod_trunc_q),
|
||||
.ovrflw(Demod_ovrflw_q)
|
||||
);
|
||||
endmodule
|
||||
+149
@@ -0,0 +1,149 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 16:01:14 07/21/2018
|
||||
// Design Name:
|
||||
// Module Name: IQmerge
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
module IQmerge(
|
||||
input clk,
|
||||
input clk2,
|
||||
input rst,
|
||||
input nd,
|
||||
input framesync,
|
||||
input [9:0] dini,
|
||||
input [9:0] dinq,
|
||||
|
||||
output reg rdy = 1'b0,
|
||||
output reg ldpcsyncin = 1'b0,
|
||||
output [7:0] dout
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
reg [9:0] addra = 10'd0;
|
||||
reg [15:0] dina = 16'd0;
|
||||
reg [10:0] addrb = 11'd0;
|
||||
RAM_IQmerge RAM_IQmerge (
|
||||
.clka(clk), // input clka
|
||||
.wea(1'b1), // input [0 : 0] wea
|
||||
.addra(addra), // input [9 : 0] addra
|
||||
.dina(dina), // input [15 : 0] dina
|
||||
.clkb(clk2), // input clkb
|
||||
.addrb(addrb), // input [10 : 0] addrb
|
||||
.doutb(dout) // output [7 : 0] doutb
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
reg [9:0] addradelay = 10'd0;
|
||||
reg [8:0] bagcount = 9'd0;
|
||||
reg [1:0] writevalid = 2'd0;
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
addra <= 10'd0;
|
||||
addradelay <= 10'd0;
|
||||
dina <= 16'd0;
|
||||
writevalid <= 2'd0;
|
||||
bagcount <= 9'd0;
|
||||
end else begin
|
||||
case(writevalid)
|
||||
2'd0:begin
|
||||
if(framesync)begin
|
||||
writevalid <= 2'd1;
|
||||
end else begin
|
||||
writevalid <= 2'd0;
|
||||
end
|
||||
bagcount <= 9'd0;
|
||||
end
|
||||
2'd1:begin
|
||||
if(nd)begin
|
||||
addradelay <= addradelay + 10'd1;
|
||||
dina <= {dinq[9:2],dini[9:2]};
|
||||
addra <= addradelay;
|
||||
if(addradelay == 10'd1023)begin
|
||||
writevalid <= 2'd2;
|
||||
end else begin
|
||||
writevalid <= 2'd1;
|
||||
end
|
||||
end else begin
|
||||
addradelay <= addradelay;
|
||||
addra <= addra;
|
||||
dina <= dina;
|
||||
writevalid <= 2'd1;
|
||||
end
|
||||
end
|
||||
2'd2:begin
|
||||
bagcount <= bagcount + 9'd1;
|
||||
if(bagcount == 9'd104)begin
|
||||
writevalid <= 2'd0;
|
||||
end else begin
|
||||
writevalid <= 2'd1;
|
||||
end
|
||||
end
|
||||
default:writevalid <= 2'd0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
reg readvalid = 1'b0;
|
||||
always @(posedge clk2)begin
|
||||
if(rst)begin
|
||||
addrb <= 11'd0;
|
||||
readvalid <= 1'b0;
|
||||
ldpcsyncin <= 1'b0;
|
||||
end else begin
|
||||
if(!readvalid)begin
|
||||
addrb <= 11'd0;
|
||||
if(addra == 10'd1000)begin
|
||||
ldpcsyncin <= 1'b1;
|
||||
readvalid <= 1'b1;
|
||||
end else begin
|
||||
ldpcsyncin <= 1'b0;
|
||||
readvalid <= 1'b0;
|
||||
end
|
||||
end else begin
|
||||
ldpcsyncin <= 1'b0;
|
||||
addrb <= addrb + 11'd1;
|
||||
if(addrb == 11'd2047)begin
|
||||
readvalid <= 1'b0;
|
||||
end else begin
|
||||
readvalid <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clk2)begin
|
||||
rdy <= readvalid;
|
||||
end
|
||||
|
||||
/*ila_IQmerge ila_IQmerge(
|
||||
.clk(clk2),
|
||||
.probe0(clk),
|
||||
.probe1(writevalid),
|
||||
.probe2(dini[9:2]),
|
||||
.probe3(dinq[9:2]),
|
||||
.probe4(dout),
|
||||
.probe5(framesync)
|
||||
);*/
|
||||
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,71 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/11/18 21:06:38
|
||||
// Design Name:
|
||||
// Module Name: Interp_half
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module Interp_half(
|
||||
input clk,
|
||||
input [9:0] din_p1,
|
||||
input [9:0] din_t0,
|
||||
input [9:0] din_n1,
|
||||
input [9:0] din_n2,
|
||||
|
||||
output reg [9:0] dout
|
||||
|
||||
);
|
||||
|
||||
wire [13:0] multquartert0;
|
||||
wire [13:0] multquartern1;
|
||||
CN1_half CT0_half (.CLK(clk), .A(din_t0), .P(multquartert0));
|
||||
CN1_half CN1_half (.CLK(clk), .A(din_n1), .P(multquartern1));
|
||||
|
||||
reg [9:0] multquarterp1 = 10'd0;
|
||||
reg [9:0] multquartern2 = 10'd0;
|
||||
always @(posedge clk)begin
|
||||
multquarterp1 <= din_p1;
|
||||
multquartern2 <= din_n2;
|
||||
end
|
||||
|
||||
reg [14:0] sumquarter1 = 15'd0;
|
||||
reg [14:0] sumquarter2 = 15'd0;
|
||||
always @(posedge clk)begin
|
||||
sumquarter1 <= {multquartert0[13],multquartert0}-{{5{multquarterp1[9]}},multquarterp1};
|
||||
sumquarter2 <= {multquartern1[13],multquartern1}-{{5{multquartern2[9]}},multquartern2};
|
||||
end
|
||||
|
||||
|
||||
reg [15:0] sumquarter3 = 16'd0;
|
||||
always @(posedge clk)begin
|
||||
sumquarter3 <= {sumquarter2[14],sumquarter2}+{sumquarter1[14],sumquarter1};
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(sumquarter3[15:13]==3'b111||sumquarter3[15:13]==3'b000)begin
|
||||
dout <= sumquarter3[13:4];
|
||||
end else begin
|
||||
dout <= (sumquarter3[15]==1'b1) ? 10'b10_0000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/11/18 21:06:38
|
||||
// Design Name:
|
||||
// Module Name: Interp_quarter
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module Interp_quarter(
|
||||
input clk,
|
||||
input [9:0] din_p1,
|
||||
input [9:0] din_t0,
|
||||
input [9:0] din_n1,
|
||||
input [9:0] din_n2,
|
||||
|
||||
output reg [9:0] dout
|
||||
|
||||
);
|
||||
|
||||
wire [13:0] multquartern2;
|
||||
wire [15:0] multquartern1;
|
||||
wire [16:0] multquartert0;
|
||||
wire [13:0] multquarterp1;
|
||||
CN2 CN2_quarter (.CLK(clk), .A(din_p1), .P(multquartern2));
|
||||
CN1 CN1_quarter (.CLK(clk), .A(din_t0), .P(multquartern1));
|
||||
CT0 CT0_quarter (.CLK(clk), .A(din_n1), .P(multquartert0));
|
||||
CP1 CP1_quarter (.CLK(clk), .A(din_n2), .P(multquarterp1));
|
||||
|
||||
|
||||
|
||||
reg [16:0] sumquarter1 = 17'd0;
|
||||
reg [17:0] sumquarter2 = 18'd0;
|
||||
always @(posedge clk)begin
|
||||
sumquarter1 <= {{3{multquartern2[13]}},multquartern2}+{multquartern1[15],multquartern1};
|
||||
sumquarter2 <= {{4{multquarterp1[13]}},multquarterp1}+{multquartert0[16],multquartert0};
|
||||
end
|
||||
|
||||
|
||||
reg [18:0] sumquarter3 = 19'd0;
|
||||
always @(posedge clk)begin
|
||||
sumquarter3 <= {{2{sumquarter1[16]}},sumquarter1}+{sumquarter2[17],sumquarter2};
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(sumquarter3[18:16]==3'b111||sumquarter3[18:16]==3'b000)begin
|
||||
dout <= sumquarter3[16:7];
|
||||
end else begin
|
||||
dout <= (sumquarter3[18]==1'b1) ? 10'b10_0000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/11/18 21:03:55
|
||||
// Design Name:
|
||||
// Module Name: Interpolation
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module Interpolation(
|
||||
input clk,
|
||||
input [9:0] dini,
|
||||
input [9:0] dinq,
|
||||
|
||||
input framesync,
|
||||
output reg framesync_Interpolation = 1'd0,
|
||||
|
||||
output reg [9:0] doutiA = 10'd0,
|
||||
output reg [9:0] doutqA = 10'd0,
|
||||
output [9:0] doutiB,
|
||||
output [9:0] doutqB,
|
||||
output [9:0] doutiC,
|
||||
output [9:0] doutqC,
|
||||
output [9:0] doutiD,
|
||||
output [9:0] doutqD
|
||||
);
|
||||
|
||||
reg [9:0] dini_p1 = 10'd0;
|
||||
reg [9:0] dini_t0 = 10'd0;
|
||||
reg [9:0] dini_n1 = 10'd0;
|
||||
reg [9:0] dini_n2 = 10'd0;
|
||||
reg [9:0] dini_n3 = 10'd0;
|
||||
reg [9:0] dini_n4 = 10'd0;
|
||||
|
||||
|
||||
reg [9:0] dinq_p1 = 10'd0;
|
||||
reg [9:0] dinq_t0 = 10'd0;
|
||||
reg [9:0] dinq_n1 = 10'd0;
|
||||
reg [9:0] dinq_n2 = 10'd0;
|
||||
reg [9:0] dinq_n3 = 10'd0;
|
||||
reg [9:0] dinq_n4 = 10'd0;
|
||||
|
||||
reg [0:0] framesync_p1 = 1'd0;
|
||||
reg [0:0] framesync_t0 = 1'd0;
|
||||
reg [0:0] framesync_n1 = 1'd0;
|
||||
reg [0:0] framesync_n2 = 1'd0;
|
||||
reg [0:0] framesync_n3 = 1'd0;
|
||||
reg [0:0] framesync_n4 = 1'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
dini_p1 <= dini;
|
||||
dini_t0 <= dini_p1;
|
||||
dini_n1 <= dini_t0;
|
||||
dini_n2 <= dini_n1;
|
||||
dini_n3 <= dini_n2;
|
||||
dini_n4 <= dini_n3;
|
||||
doutiA <= dini_n4;
|
||||
|
||||
dinq_p1 <= dinq;
|
||||
dinq_t0 <= dinq_p1;
|
||||
dinq_n1 <= dinq_t0;
|
||||
dinq_n2 <= dinq_n1;
|
||||
dinq_n3 <= dinq_n2;
|
||||
dinq_n4 <= dinq_n3;
|
||||
doutqA <= dinq_n4;
|
||||
|
||||
framesync_p1 <= framesync;
|
||||
framesync_t0 <= framesync_p1;
|
||||
framesync_n1 <= framesync_t0;
|
||||
framesync_n2 <= framesync_n1;
|
||||
framesync_n3 <= framesync_n2;
|
||||
framesync_n4 <= framesync_n3;
|
||||
framesync_Interpolation <= framesync_n4;
|
||||
end
|
||||
|
||||
|
||||
|
||||
Interp_quarter Interp_quarteri (.clk(clk), .din_p1(dini_p1), .din_t0(dini_t0), .din_n1(dini_n1), .din_n2(dini_n2), .dout(doutiB));
|
||||
Interp_quarter Interp_quarterq (.clk(clk), .din_p1(dinq_p1), .din_t0(dinq_t0), .din_n1(dinq_n1), .din_n2(dinq_n2), .dout(doutqB));
|
||||
|
||||
Interp_half Interp_halfi (.clk(clk), .din_p1(dini_p1), .din_t0(dini_t0), .din_n1(dini_n1), .din_n2(dini_n2), .dout(doutiC));
|
||||
Interp_half Interp_halfq (.clk(clk), .din_p1(dinq_p1), .din_t0(dinq_t0), .din_n1(dinq_n1), .din_n2(dinq_n2), .dout(doutqC));
|
||||
|
||||
Interp_quarter Interp_quarteri3 (.clk(clk), .din_p1(dini_n2), .din_t0(dini_n1), .din_n1(dini_t0), .din_n2(dini_p1), .dout(doutiD));
|
||||
Interp_quarter Interp_quarterq3 (.clk(clk), .din_p1(dinq_n2), .din_t0(dinq_n1), .din_n1(dinq_t0), .din_n2(dinq_p1), .dout(doutqD));
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/12/20 15:37:19
|
||||
// Design Name:
|
||||
// Module Name: Noise_Estimate
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module Noise_Estimate(
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input nd_pilot2,
|
||||
input [9:0] pilot_noisei,
|
||||
input [9:0] pilot_noiseq,
|
||||
|
||||
output reg nd_EstNoise = 1'd0,
|
||||
output reg [27:0] EstNoise_i = 28'd0,
|
||||
output reg [27:0] EstNoise_q = 28'd0 //应当为0
|
||||
|
||||
);
|
||||
|
||||
//----------------------------------------共轭相乘,延时为6clk-----------------------------------//
|
||||
reg [9:0] noisei = 10'd0;
|
||||
reg [9:0] noiseq = 10'd0;
|
||||
reg [9:0] noiseqh = 10'd0;
|
||||
reg nd_noise_d0 = 1'd0;
|
||||
reg nd_noise_d1 = 1'd0;
|
||||
reg nd_noise_d2 = 1'd0;
|
||||
reg nd_noise_d3 = 1'd0;
|
||||
reg nd_noise_d4 = 1'd0;
|
||||
reg nd_noise_d5 = 1'd0;
|
||||
reg nd_noise_d6 = 1'd0;
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
noisei <= 10'd0;
|
||||
noiseq <= 10'd0;
|
||||
noiseqh <= 10'd0;
|
||||
nd_noise_d0 <= 1'd0;
|
||||
nd_noise_d1 <= 1'd0;
|
||||
nd_noise_d2 <= 1'd0;
|
||||
nd_noise_d3 <= 1'd0;
|
||||
nd_noise_d4 <= 1'd0;
|
||||
nd_noise_d5 <= 1'd0;
|
||||
nd_noise_d6 <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
noisei <= pilot_noisei;
|
||||
noiseq <= pilot_noiseq;
|
||||
if(pilot_noiseq==10'd512) noiseqh <= 10'd511;
|
||||
else noiseqh <= -pilot_noiseq;
|
||||
nd_noise_d0 <= nd_pilot2;
|
||||
nd_noise_d1 <= nd_noise_d0;
|
||||
nd_noise_d2 <= nd_noise_d1;
|
||||
nd_noise_d3 <= nd_noise_d2;
|
||||
nd_noise_d4 <= nd_noise_d3;
|
||||
nd_noise_d5 <= nd_noise_d4;
|
||||
nd_noise_d6 <= nd_noise_d5;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
wire m_axis_dout_tvalid;
|
||||
wire [47:0] m_axis_dout_tdata;
|
||||
ComMul_EstNoise ComMul_EstNoise (
|
||||
.aclk (clk), // input wire aclk
|
||||
.s_axis_a_tvalid (1'd1), // input wire s_axis_a_tvalid
|
||||
.s_axis_a_tdata ({6'd0,noiseq,6'd0,noisei}), // input wire [31 : 0] s_axis_a_tdata
|
||||
.s_axis_b_tvalid (1'd1), // input wire s_axis_b_tvalid
|
||||
.s_axis_b_tdata ({6'd0,noiseqh,6'd0,noisei}), // input wire [31 : 0] s_axis_b_tdata
|
||||
.m_axis_dout_tvalid (m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata (m_axis_dout_tdata) // output wire [47 : 0] m_axis_dout_tdata
|
||||
);
|
||||
|
||||
wire [19:0] ComMul_Noisei;
|
||||
wire [19:0] ComMul_Noiseq;
|
||||
|
||||
assign ComMul_Noiseq = m_axis_dout_tdata[43:24];
|
||||
assign ComMul_Noisei = m_axis_dout_tdata[19:0];
|
||||
|
||||
|
||||
//--------------------------------------------累加求和,状态机控制----------------------------------------//
|
||||
reg state_noise = 1'd0;
|
||||
reg [27:0] add_Noisei = 28'd0;
|
||||
reg [27:0] add_Noiseq = 28'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
add_Noisei <= 28'd0;
|
||||
add_Noiseq <= 28'd0;
|
||||
nd_EstNoise <= 1'd0;
|
||||
EstNoise_i <= 28'd0;
|
||||
EstNoise_q <= 28'd0;
|
||||
state_noise <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_noise)
|
||||
//帧间复位结束后,等待nd_noise_d6拉高,拉高持续256clk,期间数据全部累加
|
||||
//nd_noise_d6拉低说明256clk的累加结束,给一次噪声估计结果,伴随nd
|
||||
1'd0:begin
|
||||
if(nd_noise_d6) begin
|
||||
add_Noisei <= {{8{ComMul_Noisei[19]}},ComMul_Noisei};
|
||||
add_Noiseq <= {{8{ComMul_Noiseq[19]}},ComMul_Noiseq};
|
||||
nd_EstNoise <= 1'd0;
|
||||
EstNoise_i <= EstNoise_i;
|
||||
EstNoise_q <= EstNoise_q;
|
||||
state_noise <= state_noise + 1'd1;
|
||||
end
|
||||
else begin
|
||||
add_Noisei <= 28'd0;
|
||||
add_Noiseq <= 28'd0;
|
||||
nd_EstNoise <= 1'd0;
|
||||
EstNoise_i <= EstNoise_i;
|
||||
EstNoise_q <= EstNoise_q;
|
||||
state_noise <= state_noise;
|
||||
end
|
||||
end
|
||||
1'd1:begin
|
||||
if(nd_noise_d6==1'd0) begin
|
||||
add_Noisei <= add_Noisei;
|
||||
add_Noiseq <= add_Noiseq;
|
||||
nd_EstNoise <= 1'd1;
|
||||
EstNoise_i <= add_Noisei;
|
||||
EstNoise_q <= add_Noiseq;
|
||||
state_noise <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
add_Noisei <= add_Noisei + {{8{ComMul_Noisei[19]}},ComMul_Noisei};
|
||||
add_Noiseq <= add_Noiseq + {{8{ComMul_Noiseq[19]}},ComMul_Noiseq};
|
||||
nd_EstNoise <= 1'd0;
|
||||
EstNoise_i <= EstNoise_i;
|
||||
EstNoise_q <= EstNoise_q;
|
||||
state_noise <= state_noise;
|
||||
end
|
||||
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------除data_length=256,再乘2-----------------------------------//
|
||||
//----------------------------------------除49,再除2-----------------------------------//
|
||||
//根据量化方案,此处不再做除法,相当于噪声估计结果放大了256*49倍
|
||||
//FullSystem_v5.m
|
||||
|
||||
// integer handle01;
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
// handle01=$fopen("ComMul_Noisei.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("ComMul_Noiseq.txt","w"); $fclose(handle02);
|
||||
|
||||
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
// if(nd_noise_d6)begin
|
||||
// handle01=$fopen("ComMul_Noisei.txt","a+");$fwrite(handle01,"%d\n",$signed(ComMul_Noisei));$fclose(handle01);
|
||||
// handle02=$fopen("ComMul_Noiseq.txt","a+");$fwrite(handle02,"%d\n",$signed(ComMul_Noiseq));$fclose(handle02);
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
|
||||
|
||||
endmodule
|
||||
+550
@@ -0,0 +1,550 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 17:42 11/14/2019
|
||||
// Design Name:
|
||||
// Module Name: RecvTop
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
module RecvTop (
|
||||
input clk,
|
||||
input clk2,
|
||||
input clk_60M_mac,
|
||||
input rst,
|
||||
input rst2,
|
||||
|
||||
input [11:0] dini,
|
||||
input [11:0] dinq,
|
||||
|
||||
//视频数据存储,shx
|
||||
input [13:0] recv_addr_new_0,
|
||||
input [13:0] recv_addr_new_1,
|
||||
input [13:0] recv_addr_new_2,
|
||||
input [13:0] recv_addr_new_3,
|
||||
output [ 7:0] recv_data_new_0,
|
||||
output [ 7:0] recv_data_new_1,
|
||||
output [ 7:0] recv_data_new_2,
|
||||
output [ 7:0] recv_data_new_3,
|
||||
output [16:0] RAMaddra_write_0,
|
||||
output [16:0] RAMaddra_write_1,
|
||||
output [16:0] RAMaddra_write_2,
|
||||
output [16:0] RAMaddra_write_3,
|
||||
output [16:0] RAMaddra_new_0,
|
||||
output [16:0] RAMaddra_new_1,
|
||||
output [16:0] RAMaddra_new_2,
|
||||
output [16:0] RAMaddra_new_3,
|
||||
output flag_stop, //给shx,拉高8个clk表示当前时帧有效数据接收完毕
|
||||
output [16:0] addr_stop, //给shx,拉高8个clk,与flag_stop对齐,指示位置与最后1bit有效数据的位置对齐
|
||||
|
||||
//vio
|
||||
// input DC_move_able, //为1的时候启用去直流,为0的时候不启用
|
||||
// input [1:0] vio_powertest_h, //DAGC
|
||||
// input [1:0] vio_powertest_l, //DAGC
|
||||
// input DAGC_enab, //为1的时候启用DAGC,为0的时候不启用DAGC
|
||||
// input vio_tsync_inter16, //为1的时候启用内插,从16倍过采样中挑一路
|
||||
// input EQUenable_vio, //为1时启用均衡
|
||||
// input [7:0] Zerozone_vio, //零域估计,默认值为8'd29
|
||||
input [6:0] vio_stopbit, //寻找停止位,默认值为7'd60
|
||||
|
||||
//9361、射频增益控制
|
||||
output [7:0] data_9361,
|
||||
output [9:0] addr_9361,
|
||||
output enab_9361,
|
||||
output D1_12dB,
|
||||
output D2_6dB,
|
||||
output D3_18dB,
|
||||
output D4_12dB,
|
||||
|
||||
//debug
|
||||
//trigger
|
||||
output rst_TimeSync,
|
||||
output rst_freq,
|
||||
output DAGC_rdy,
|
||||
output framesync, //帧同步峰
|
||||
output framesync_delay, //帧同步峰,与频率补偿输出对应
|
||||
output framesync_tsync, //帧同步标志,与TSync输出对应
|
||||
output IntpARdy, //TSync输出nd
|
||||
output nd_SC_FDE_dout, //SC_FDE输出nd
|
||||
output framerdy, //一帧译码结果存储完毕标志
|
||||
output reg flag_bercount = 1'd0,
|
||||
output reg flag_badframe = 1'd0,
|
||||
output reg flag_ber = 1'd0,
|
||||
//各模块输出,星座图
|
||||
output [11:0] dc_removal_dout_i, //MGC_adaptation、去直流输出
|
||||
output [11:0] dc_removal_dout_q,
|
||||
output [ 9:0] matchfilterout_i, //MF输出
|
||||
output [ 9:0] matchfilterout_q,
|
||||
output [ 9:0] DAGC_out_i, //DAGC输出
|
||||
output [ 9:0] DAGC_out_q,
|
||||
output [ 9:0] freqdataout_i, //频率补偿输出
|
||||
output [ 9:0] freqdataout_q,
|
||||
output [ 9:0] IntpOuti, //TSync输出
|
||||
output [ 9:0] IntpOutq,
|
||||
output [ 9:0] SC_FDE_douti, //SC_FDE输出
|
||||
output [ 9:0] SC_FDE_doutq,
|
||||
//MGC_adaptation
|
||||
output [24:0] mean_temp,
|
||||
output [12:0] acc_mean,
|
||||
output [ 4:0] state_mgc,
|
||||
output mgc1_rdy,
|
||||
output flag_state_mgc,
|
||||
output [ 2:0] state_rst,
|
||||
output flag_overflow,
|
||||
output flag_small,
|
||||
//DC
|
||||
output [11:0] dc_value_i,
|
||||
output [11:0] dc_value_q,
|
||||
output flag_dc,
|
||||
//DAGC
|
||||
output flag_agch,
|
||||
output flag_agcl,
|
||||
output flag_agc_power,
|
||||
output [12:0] agc_ref,
|
||||
output [12:0] agc_check,
|
||||
//power test
|
||||
output flag_powerabsh,
|
||||
output flag_powerabsl,
|
||||
output flag_abs_power,
|
||||
output [10:0] abs_ref,
|
||||
output [10:0] abs_check,
|
||||
//TSync
|
||||
output [ 3:0] flag_clk_4bit, //位同步选取通道结果
|
||||
//SC_FDE,溢出标志
|
||||
output flagoverflow_fftpilot_26to14, //第1个fft结果截位,即导频fft结果的截位,26截到14
|
||||
output flagoverflow_ChnZF_26to18, //第2个fft结果截位,即ZF信道估计结果的截位,26截到18
|
||||
output flagoverflow_comdiv_34to20i, //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
|
||||
output flagoverflow_comdiv_34to20q, //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
|
||||
output flagoverflow_ifftzero_29to17i, //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
output flagoverflow_ifftzero_29to17q, //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
output flagoverflow_MMSEdiv_divisor_31to28, //第2个除法器,即MMSE除法的分母截位,31截到28
|
||||
output flagoverflow_divmmse_34to11, //第2个除法器结果截位,即MMSE信道估计结果的截位,34截到11
|
||||
output flagoverflow_ifftindata_28to20i, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output flagoverflow_ifftindata_28to20q, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output flagoverflow_fftdata_26to16i, //数据段ow的fft输出截位,26截到16
|
||||
output flagoverflow_fftdata_26to16q, //数据段ow的fft输出截位,26截到16
|
||||
output flagoverflow_FDE_dataout_29to10i, //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
output flagoverflow_FDE_dataout_29to10q, //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
output reg flagoverflow = 1'd0, //总溢出标志
|
||||
output Pilot_rdy_hide1_d1,
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
output [63:0] recvNetData,
|
||||
output recvNetDataNd,
|
||||
input debug_loss
|
||||
// input [ 7:0] MAC_idNum
|
||||
// input [ 7:0] video_id01,
|
||||
// input [ 7:0] video_id02,
|
||||
// input [ 7:0] video_id03
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
||||
MGC_adaptation MGC_adaptation (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
.dini(dini),
|
||||
.dinq(dinq),
|
||||
|
||||
.data_9361(data_9361),
|
||||
.addr_9361(addr_9361),
|
||||
.enab_9361(enab_9361),
|
||||
.D1_12dB (D1_12dB),
|
||||
.D2_6dB (D2_6dB),
|
||||
.D3_18dB (D3_18dB),
|
||||
.D4_12dB (D4_12dB),
|
||||
|
||||
.mgc1_rdy(mgc1_rdy)
|
||||
);
|
||||
|
||||
|
||||
wire MF_rdy;
|
||||
wire MF_rst;
|
||||
|
||||
|
||||
|
||||
MF_Top MF_Top (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// .rst (rst),
|
||||
|
||||
.dini (dini),
|
||||
.dinq (dinq),
|
||||
.start(mgc1_rdy),
|
||||
|
||||
.matchfilterout_i(matchfilterout_i),
|
||||
.matchfilterout_q(matchfilterout_q),
|
||||
.MF_rdy (MF_rdy),
|
||||
.MF_rst (MF_rst)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//帧同步模块
|
||||
|
||||
assign FrameSync_dini = (DAGC_enab) ? DAGC_out_i : matchfilterout_i;
|
||||
assign FrameSync_dinq = (DAGC_enab) ? DAGC_out_q : matchfilterout_q;
|
||||
// wire framesync;
|
||||
wire Sync_rdy;
|
||||
wire Pilot_rdy;
|
||||
|
||||
wire [9:0] FrameSync_douti;
|
||||
wire [9:0] FrameSync_doutq;
|
||||
|
||||
|
||||
SCFDE_recv_FrameSync SCFDE_recv_FrameSync_inst (
|
||||
.clk (clk),
|
||||
.rst (MF_rst),
|
||||
.rst_ready (~MF_rdy),
|
||||
.datain_i (matchfilterout_i),
|
||||
.datain_q (matchfilterout_q),
|
||||
.Sync_i (FrameSync_douti),
|
||||
.Sync_q (FrameSync_doutq),
|
||||
.Sync_rdy (Sync_rdy), // 帧同步找到了过门限峰值
|
||||
.Pilot_rdy (Pilot_rdy),// 开始取导频的标志位 not used
|
||||
.flag_sync (framesync), // high level flag
|
||||
.Pilot_rdy_hide1_d1(Pilot_rdy_hide1_d1) // not used
|
||||
);
|
||||
|
||||
//
|
||||
reg [20:0] cnt_lost;
|
||||
reg framelost;
|
||||
always @(posedge clk) begin
|
||||
if (Pilot_rdy_hide1_d1) begin
|
||||
cnt_lost <= 21'd0;
|
||||
framelost <= 1'b0;
|
||||
end else begin
|
||||
if (cnt_lost >= 21'd750000) begin
|
||||
;
|
||||
cnt_lost <= 21'd0;
|
||||
framelost <= 1'b1;
|
||||
end else begin
|
||||
cnt_lost <= 21'd1 + cnt_lost;
|
||||
framelost <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
// wire [9:0] DAGC_out_i;
|
||||
// wire [9:0] DAGC_out_q;
|
||||
// wire flag_agch;
|
||||
// wire flag_agcl;
|
||||
// wire flag_agc_power;
|
||||
// wire [12:0] agc_ref;
|
||||
// wire [12:0] agc_check;
|
||||
wire dagc_rdy;
|
||||
wire mgc_rdy;
|
||||
wire rst_dagc;
|
||||
DAGC_v2 DAGC_v2 (
|
||||
.clk (clk),
|
||||
.rst (~mgc1_rdy),
|
||||
.mgc1_rdy (MF_rdy),
|
||||
.framesync_d0 (framesync),
|
||||
.vio_powertest_h (2'b00),
|
||||
.vio_powertest_l (2'b00),
|
||||
.matchfilterout_i(FrameSync_douti),
|
||||
.matchfilterout_q(FrameSync_doutq),
|
||||
|
||||
.DAGC_out_i(DAGC_out_i),
|
||||
.DAGC_out_q(DAGC_out_q),
|
||||
|
||||
.flag_agch (flag_agch),
|
||||
.flag_agcl (flag_agcl),
|
||||
.flag_agc_power(flag_agc_power),
|
||||
.agc_ref (agc_ref),
|
||||
.agc_check (agc_check),
|
||||
.dagc_rdy (dagc_rdy),
|
||||
.mgc_rdy (mgc_rdy),
|
||||
.rst_dagc (rst_dagc)
|
||||
);
|
||||
|
||||
|
||||
//载波频偏补偿
|
||||
// wire [9:0] freqdataout_i;
|
||||
// wire [9:0] freqdataout_q;
|
||||
// wire framesync_delay;
|
||||
wire data_save; //debug用,暂不需使用
|
||||
// wire rst_freq;
|
||||
|
||||
freqestm freqestm (
|
||||
.clk (clk),
|
||||
.rst (MF_rst),
|
||||
.mgc_rdy (mgc_rdy),
|
||||
.framesync (dagc_rdy),
|
||||
.datain_i (DAGC_out_i),
|
||||
.datain_q (DAGC_out_q),
|
||||
.dataout_i (freqdataout_i),
|
||||
.dataout_q (freqdataout_q),
|
||||
.framesync_delay(framesync_delay),
|
||||
.data_save (data_save),
|
||||
.rst_freq (rst_freq)
|
||||
|
||||
);
|
||||
|
||||
//位同步
|
||||
wire [1:0] cnt_tsync;
|
||||
// wire framesync_tsync; //帧同步标志
|
||||
TimeSync_top TimeSync_top (
|
||||
.clk (clk),
|
||||
.rst (Pilot_rdy_hide1_d1),
|
||||
.dini (freqdataout_i),
|
||||
.dinq (freqdataout_q),
|
||||
.rdy (IntpARdy),
|
||||
.douti (IntpOuti),
|
||||
.doutq (IntpOutq),
|
||||
.vio_tsync_inter16(vio_tsync_inter16),
|
||||
.framesync (framesync_delay), //帧同步标志
|
||||
.framesync_tsync (framesync_tsync), //帧同步标志
|
||||
//debug
|
||||
.cnt_tsync (cnt_tsync),
|
||||
.flag_clk_4bit (flag_clk_4bit)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// SC-FDE
|
||||
|
||||
SC_FDE_TOP SC_FDE_TOP_djy (
|
||||
.clk(clk),
|
||||
.rst(Pilot_rdy_hide1_d1),
|
||||
|
||||
.EQUenable_vio(EQUenable_vio), //为1时启用均衡
|
||||
.Zerozone_vio (Zerozone_vio), //零域估计,默认值为8'd29
|
||||
|
||||
.flag_ow_left (framesync_tsync), //在一帧内,与第一个数据段的pilot的ow第一个nd对齐
|
||||
.nd (IntpARdy),
|
||||
.dini (IntpOuti),
|
||||
.dinq (IntpOutq),
|
||||
.nd_SC_FDE_dout (nd_SC_FDE_dout),
|
||||
.SC_FDE_douti (SC_FDE_douti),
|
||||
.SC_FDE_doutq (SC_FDE_doutq),
|
||||
// debug,溢出标志
|
||||
.flagoverflow_fftpilot_26to14 (flagoverflow_fftpilot_26to14),
|
||||
.flagoverflow_ChnZF_26to18 (flagoverflow_ChnZF_26to18),
|
||||
.flagoverflow_comdiv_34to20i (flagoverflow_comdiv_34to20i),
|
||||
.flagoverflow_comdiv_34to20q (flagoverflow_comdiv_34to20q),
|
||||
.flagoverflow_ifftzero_29to17i (flagoverflow_ifftzero_29to17i),
|
||||
.flagoverflow_ifftzero_29to17q (flagoverflow_ifftzero_29to17q),
|
||||
.flagoverflow_MMSEdiv_divisor_31to28(flagoverflow_MMSEdiv_divisor_31to28),
|
||||
.flagoverflow_divmmse_34to11 (flagoverflow_divmmse_34to11),
|
||||
.flagoverflow_ifftindata_28to20i (flagoverflow_ifftindata_28to20i),
|
||||
.flagoverflow_ifftindata_28to20q (flagoverflow_ifftindata_28to20q),
|
||||
.flagoverflow_fftdata_26to16i (flagoverflow_fftdata_26to16i),
|
||||
.flagoverflow_fftdata_26to16q (flagoverflow_fftdata_26to16q),
|
||||
.flagoverflow_FDE_dataout_29to10i (flagoverflow_FDE_dataout_29to10i),
|
||||
.flagoverflow_FDE_dataout_29to10q (flagoverflow_FDE_dataout_29to10q)
|
||||
);
|
||||
|
||||
|
||||
wire phase_adjust_rdy;
|
||||
wire [9:0] phase_adjust_douti;
|
||||
wire [9:0] phase_adjust_doutq;
|
||||
phase_adjust phase_adjust (
|
||||
.clk (clk),
|
||||
.rst (Pilot_rdy_hide1_d1),
|
||||
.din_i (SC_FDE_douti),
|
||||
.din_q (SC_FDE_doutq),
|
||||
.nd (nd_SC_FDE_dout),
|
||||
.framesync(framesync_tsync),
|
||||
.rdy (phase_adjust_rdy),
|
||||
.dout_i (phase_adjust_douti),
|
||||
.dout_q (phase_adjust_doutq)
|
||||
);
|
||||
|
||||
wire IQmergerdy;
|
||||
wire ldpcsyncin;
|
||||
wire [7:0] IQmergedout;
|
||||
|
||||
IQmerge IQmerge (
|
||||
.clk (clk),
|
||||
.clk2 (clk2),
|
||||
.rst (rst2 || Pilot_rdy_hide1_d1),
|
||||
.nd (phase_adjust_rdy),
|
||||
.framesync (framesync_tsync),
|
||||
.dini (phase_adjust_douti),
|
||||
.dinq (phase_adjust_doutq),
|
||||
.rdy (IQmergerdy),
|
||||
.ldpcsyncin(ldpcsyncin),
|
||||
.dout (IQmergedout)
|
||||
);
|
||||
|
||||
wire LDPC_SyncOut;
|
||||
wire LDPC_Rdy;
|
||||
wire LDPC_Dout;
|
||||
wire [8:0] good_frames;
|
||||
wire [8:0] bad_frames;
|
||||
wire [8:0] total_frames;
|
||||
CCSDS_LDPC_DEC_K1024_R12_TOPP LDPC_decode (
|
||||
.clk (clk2),
|
||||
.Rst (rst2 || Pilot_rdy_hide1_d1),
|
||||
.FrameSync (ldpcsyncin),
|
||||
.Nd (IQmergerdy),
|
||||
.Din (IQmergedout),
|
||||
.LDPC_SyncOut(LDPC_SyncOut),
|
||||
.Rdy (LDPC_Rdy),
|
||||
.LDPC_Dout (LDPC_Dout),
|
||||
.good_frames (good_frames),
|
||||
.bad_frames (bad_frames),
|
||||
.total_frames(total_frames)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wire flag_notbyte; //为1时说明得到的有效数据不以字节为单位
|
||||
wire [ 1:0] state_ram;
|
||||
wire berstart_1d;
|
||||
wire bercompare;
|
||||
wire [16:0] bercount;
|
||||
wire [16:0] bercount_max;
|
||||
wire [16:0] ROMaddra_d2;
|
||||
wire RAMdout_d1;
|
||||
wire validnd_new_new;
|
||||
wire [63:0] stop_temp_new;
|
||||
wire flag_stop_0; //给shx,拉高1个clk表示当前时帧有效数据接收完毕
|
||||
wire [16:0] addr_stop_0;
|
||||
wire [ 2:0] cnt_8;
|
||||
wire state_8;
|
||||
wire rdy_scramble;
|
||||
wire dout_scramble;
|
||||
wire [16:0] RAMaddra; //比较误码率
|
||||
wire [16:0] ROMaddra; //比较误码率
|
||||
wire nd_ber;
|
||||
|
||||
FrameMerge FrameMerge (
|
||||
.clk (clk2),
|
||||
.rst (Pilot_rdy_hide1_d1),
|
||||
.rst2(rst2),
|
||||
.sync(LDPC_SyncOut),
|
||||
.nd (LDPC_Rdy),
|
||||
.din (LDPC_Dout),
|
||||
|
||||
.vio_stopbit(vio_stopbit),
|
||||
|
||||
.frameIDnd(Pilot_rdy_hide1_d1),
|
||||
.clk2 (clk_60M_mac),
|
||||
.framerdy (framerdy),
|
||||
|
||||
.recv_addr_new_0 (recv_addr_new_0),
|
||||
.recv_addr_new_1 (recv_addr_new_1),
|
||||
.recv_addr_new_2 (recv_addr_new_2),
|
||||
.recv_addr_new_3 (recv_addr_new_3),
|
||||
.recv_data_new_0 (recv_data_new_0),
|
||||
.recv_data_new_1 (recv_data_new_1),
|
||||
.recv_data_new_2 (recv_data_new_2),
|
||||
.recv_data_new_3 (recv_data_new_3),
|
||||
.RAMaddra_write_0(RAMaddra_write_0),
|
||||
.RAMaddra_write_1(RAMaddra_write_1),
|
||||
.RAMaddra_write_2(RAMaddra_write_2),
|
||||
.RAMaddra_write_3(RAMaddra_write_3),
|
||||
.RAMaddra_new_0 (RAMaddra_new_0),
|
||||
.RAMaddra_new_1 (RAMaddra_new_1),
|
||||
.RAMaddra_new_2 (RAMaddra_new_2),
|
||||
.RAMaddra_new_3 (RAMaddra_new_3),
|
||||
|
||||
.flag_notbyte(flag_notbyte),
|
||||
.state_ram (state_ram),
|
||||
.flag_stop (flag_stop), //给shx,拉高8个clk表示当前时帧有效数据接收完毕
|
||||
.addr_stop (addr_stop), //给shx,拉高8个clk,与flag_stop对齐,指示位置与最后1bit有效数据的位置对齐
|
||||
//debug
|
||||
.berstart_1d (berstart_1d),
|
||||
.bercompare (bercompare),
|
||||
.bercount (bercount),
|
||||
.bercount_max(bercount_max),
|
||||
.ROMaddra_d2 (ROMaddra_d2),
|
||||
.RAMdout_d1 (RAMdout_d1),
|
||||
|
||||
.validnd_new_new(validnd_new_new),
|
||||
|
||||
.stop_temp_new(stop_temp_new),
|
||||
|
||||
.flag_stop_0(flag_stop_0),
|
||||
.addr_stop_0(addr_stop_0),
|
||||
.cnt_8 (cnt_8),
|
||||
.state_8 (state_8),
|
||||
|
||||
.rdy_scramble (rdy_scramble),
|
||||
.dout_scramble(dout_scramble),
|
||||
|
||||
.RAMaddra (RAMaddra),
|
||||
.ROMaddra (ROMaddra),
|
||||
.nd_ber (nd_ber),
|
||||
.recvNetData (recvNetData),
|
||||
.recvNetDataNd(recvNetDataNd)
|
||||
// .MAC_idNum (MAC_idNum)
|
||||
// .video_id01 (8'd0),
|
||||
// .video_id02 (8'd0),
|
||||
// .video_id03 (8'd0)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/*ila_recvtop ila_recvtop(
|
||||
.clk(clk),
|
||||
.probe0(framesync),
|
||||
.probe1(framesync_delay),
|
||||
.probe2(phase_adjust_rdy),
|
||||
.probe3(nd_SC_FDE_dout),
|
||||
.probe4(IQmergerdy),
|
||||
.probe5(IQmergedout),
|
||||
.probe6(LDPC_Rdy),
|
||||
.probe7(LDPC_Dout),
|
||||
.probe8(SC_FDE_douti),
|
||||
.probe9(SC_FDE_doutq),
|
||||
.probe10(total_frames),
|
||||
.probe11(good_frames),
|
||||
.probe12(dini),
|
||||
.probe13(dinq),
|
||||
.probe14(phase_adjust_douti),
|
||||
.probe15(phase_adjust_doutq),
|
||||
.probe16(D1_12dB),
|
||||
.probe17(D2_6dB),
|
||||
.probe18(D3_18dB),
|
||||
.probe19(D4_12dB)
|
||||
|
||||
);*/
|
||||
ila_recvtest ila_recvtest (
|
||||
.clk (clk),
|
||||
.probe0(framesync),
|
||||
.probe1(framesync_delay),
|
||||
.probe2(D1_12dB),
|
||||
.probe3(D2_6dB),
|
||||
.probe4(D3_18dB),
|
||||
.probe5(D4_12dB),
|
||||
.probe6(mgc1_rdy),
|
||||
.probe7(rst),
|
||||
.probe8(dini),
|
||||
.probe9(dinq)
|
||||
);
|
||||
/*ila_decode ila_decode(
|
||||
.clk(clk2),
|
||||
.probe0(IQmergerdy),
|
||||
.probe1(IQmergedout),
|
||||
.probe2(LDPC_Dout),
|
||||
.probe3(LDPC_Rdy),
|
||||
.probe4(framerdy),
|
||||
.probe5(total_frames),
|
||||
.probe6(good_frames)
|
||||
);*/
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,684 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/12/18 16:00:24
|
||||
// Design Name:
|
||||
// Module Name: SC_FDE_TOP
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module SC_FDE_TOP(
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input EQUenable_vio, //为1时启用均衡
|
||||
|
||||
input [7:0] Zerozone_vio, //零域估计,默认值为8'd29
|
||||
|
||||
input flag_ow_left, //在一帧内,与第一个数据段的pilot的ow第一个nd对齐
|
||||
input nd,
|
||||
input [9:0] dini,
|
||||
input [9:0] dinq,
|
||||
|
||||
output nd_SC_FDE_dout,
|
||||
output [9:0] SC_FDE_douti,
|
||||
output [9:0] SC_FDE_doutq,
|
||||
|
||||
// debug,溢出标志
|
||||
output flagoverflow_fftpilot_26to14, //第1个fft结果截位,即导频fft结果的截位,26截到14
|
||||
output flagoverflow_ChnZF_26to18, //第2个fft结果截位,即ZF信道估计结果的截位,26截到18
|
||||
output flagoverflow_comdiv_34to20i, //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
|
||||
output flagoverflow_comdiv_34to20q, //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
|
||||
output flagoverflow_ifftzero_29to17i, //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
output flagoverflow_ifftzero_29to17q, //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
output flagoverflow_MMSEdiv_divisor_31to28, //第2个除法器,即MMSE除法的分母截位,31截到28
|
||||
output flagoverflow_divmmse_34to11, //第2个除法器结果截位,即MMSE信道估计结果的截位,34截到11
|
||||
|
||||
output flagoverflow_ifftindata_28to20i, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output flagoverflow_ifftindata_28to20q, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output flagoverflow_fftdata_26to16i, //数据段ow的fft输出截位,26截到16
|
||||
output flagoverflow_fftdata_26to16q, //数据段ow的fft输出截位,26截到16
|
||||
output flagoverflow_FDE_dataout_29to10i, //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
output flagoverflow_FDE_dataout_29to10q //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
);
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------导频和数据ow的缓存--------------------------------------------//
|
||||
//----------------------还负责计算正负导频头的和与差。流水得到结果用于信道估计----------------------------//
|
||||
//数据的fifo,4个
|
||||
wire [9:0] din_data1i;
|
||||
wire [9:0] din_data1q;
|
||||
wire wr_en_data1;
|
||||
wire [9:0] din_data2i;
|
||||
wire [9:0] din_data2q;
|
||||
wire wr_en_data2;
|
||||
wire flag_dataow; //拉高1clk,说明一段数据ow存储完毕,后端可开始连续读取
|
||||
wire flag_ChnEstFFT_done; //信道估计两次fft输入完毕后拉高1clk(Chn_Estimate给出)
|
||||
//正负导频段的加减结果
|
||||
wire nd_pilot2;
|
||||
wire [9:0] pilot_datai;
|
||||
wire [9:0] pilot_dataq;
|
||||
wire [9:0] pilot_noisei;
|
||||
wire [9:0] pilot_noiseq;
|
||||
|
||||
data_ow data_ow_djy (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
.flag_ow_left (flag_ow_left),
|
||||
.nd (nd),
|
||||
.dini (dini),
|
||||
.dinq (dinq),
|
||||
|
||||
.din_data1i (din_data1i),
|
||||
.din_data1q (din_data1q),
|
||||
.wr_en_data1 (wr_en_data1),
|
||||
.din_data2i (din_data2i),
|
||||
.din_data2q (din_data2q),
|
||||
.wr_en_data2 (wr_en_data2),
|
||||
.flag_dataow (flag_dataow), //拉高1clk,说明一段数据ow存储完毕,后端可开始连续读取
|
||||
|
||||
.nd_pilot2 (nd_pilot2),
|
||||
.pilot_datai (pilot_datai),
|
||||
.pilot_dataq (pilot_dataq),
|
||||
.pilot_noisei (pilot_noisei),
|
||||
.pilot_noiseq (pilot_noiseq)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------data数据ow的fifo,4个--------------------------------------------//
|
||||
wire rd_en_data1;
|
||||
wire [9:0] dout_data1i;
|
||||
wire full_data1i;
|
||||
wire empty_data1i;
|
||||
fifo_ow256 fifo_data_ow1i (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_data1i), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_data1), // input wire wr_en
|
||||
.rd_en (rd_en_data1), // input wire rd_en
|
||||
.dout (dout_data1i), // output wire [9 : 0] dout
|
||||
.full (full_data1i), // output wire full
|
||||
.empty (empty_data1i) // output wire empty
|
||||
);
|
||||
|
||||
wire [9:0] dout_data1q;
|
||||
wire full_data1q;
|
||||
wire empty_data1q;
|
||||
fifo_ow256 fifo_data_ow1q (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_data1q), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_data1), // input wire wr_en
|
||||
.rd_en (rd_en_data1), // input wire rd_en
|
||||
.dout (dout_data1q), // output wire [9 : 0] dout
|
||||
.full (full_data1q), // output wire full
|
||||
.empty (empty_data1q) // output wire empty
|
||||
);
|
||||
|
||||
wire rd_en_data2;
|
||||
wire [9:0] dout_data2i;
|
||||
wire full_data2i;
|
||||
wire empty_data2i;
|
||||
fifo_ow256 fifo_data_ow2i (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_data2i), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_data2), // input wire wr_en
|
||||
.rd_en (rd_en_data2), // input wire rd_en
|
||||
.dout (dout_data2i), // output wire [9 : 0] dout
|
||||
.full (full_data2i), // output wire full
|
||||
.empty (empty_data2i) // output wire empty
|
||||
);
|
||||
|
||||
wire [9:0] dout_data2q;
|
||||
wire full_data2q;
|
||||
wire empty_data2q;
|
||||
fifo_ow256 fifo_data_ow2q (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_data2q), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_data2), // input wire wr_en
|
||||
.rd_en (rd_en_data2), // input wire rd_en
|
||||
.dout (dout_data2q), // output wire [9 : 0] dout
|
||||
.full (full_data2q), // output wire full
|
||||
.empty (empty_data2q) // output wire empty
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------噪声估计--------------------------------------------------//
|
||||
//--------------------------------------------噪声估计结果放大了256*49倍-----------------------------------------//
|
||||
//噪声估计结果
|
||||
wire nd_EstNoise;
|
||||
wire [27:0] EstNoise_i;
|
||||
wire [27:0] EstNoise_q;
|
||||
|
||||
Noise_Estimate Noise_Estimate_djy (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
|
||||
.nd_pilot2 (nd_pilot2),
|
||||
.pilot_noisei (pilot_noisei),
|
||||
.pilot_noiseq (pilot_noiseq),
|
||||
|
||||
.nd_EstNoise (nd_EstNoise),
|
||||
.EstNoise_i (EstNoise_i),
|
||||
.EstNoise_q (EstNoise_q)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//------------------------------------------fft核,及其输入输出控制器------------------------------------------//
|
||||
reg fft_config_tvalid = 1'd0;
|
||||
wire fft_config_tready;
|
||||
reg [16:0] fft_in_i = 17'd0;
|
||||
reg [16:0] fft_in_q = 17'd0;
|
||||
reg fft_in_nd = 1'd0;
|
||||
wire fft_in_tready;
|
||||
wire[63:0] fft_out_tdata;
|
||||
wire[25:0] fft_out_i;
|
||||
wire[25:0] fft_out_q;
|
||||
wire fft_out_nd;
|
||||
wire[7:0] fft_index;
|
||||
|
||||
assign fft_out_i = fft_out_tdata[25:0];
|
||||
assign fft_out_q = fft_out_tdata[57:32];
|
||||
|
||||
wire m_axis_data_tlast;
|
||||
wire event_frame_started;
|
||||
wire event_tlast_unexpected;
|
||||
wire event_tlast_missing;
|
||||
wire event_status_channel_halt;
|
||||
wire event_data_in_channel_halt;
|
||||
wire event_data_out_channel_halt;
|
||||
|
||||
fft_256 fft_256 (
|
||||
.aclk (clk), // input wire aclk
|
||||
.aresetn (~rst), // input wire aresetn低有效复位,每次帧结束后复位8clk,满足核要求
|
||||
.s_axis_config_tdata (8'd1), // input wire [7 : 0] s_axis_config_tdata
|
||||
.s_axis_config_tvalid (fft_config_tvalid), // input wire s_axis_config_tvalid
|
||||
.s_axis_config_tready (fft_config_tready), // output wire s_axis_config_tready
|
||||
|
||||
.s_axis_data_tdata ({7'd0,fft_in_q,7'd0,fft_in_i}), // input wire [47 : 0] s_axis_data_tdata
|
||||
.s_axis_data_tvalid (fft_in_nd), // input wire s_axis_data_tvalid
|
||||
.s_axis_data_tready (fft_in_tready), // output wire s_axis_data_tready
|
||||
.s_axis_data_tlast (1'd0), // input wire s_axis_data_tlastn不用给这个信号
|
||||
|
||||
.m_axis_data_tdata (fft_out_tdata), // output wire [63 : 0] m_axis_data_tdata
|
||||
.m_axis_data_tuser (fft_index), // output wire [7 : 0] m_axis_data_tuser
|
||||
.m_axis_data_tvalid (fft_out_nd), // output wire m_axis_data_tvalid
|
||||
.m_axis_data_tready (1'd1), // input wire m_axis_data_tready
|
||||
.m_axis_data_tlast (m_axis_data_tlast), // output wire m_axis_data_tlast
|
||||
|
||||
.event_frame_started (event_frame_started), // output wire event_frame_started
|
||||
.event_tlast_unexpected (event_tlast_unexpected), // output wire event_tlast_unexpected
|
||||
.event_tlast_missing (event_tlast_missing), // output wire event_tlast_missing
|
||||
.event_status_channel_halt (event_status_channel_halt), // output wire event_status_channel_halt
|
||||
.event_data_in_channel_halt (event_data_in_channel_halt), // output wire event_data_in_channel_halt
|
||||
.event_data_out_channel_halt (event_data_out_channel_halt) // output wire event_data_out_channel_halt
|
||||
);
|
||||
|
||||
|
||||
reg [1:0] state_fft = 2'd0;
|
||||
wire nd_pilotfft;
|
||||
wire [16:0] fft_in_i_pilot;
|
||||
wire [16:0] fft_in_q_pilot;
|
||||
wire nd_datafft;
|
||||
wire [16:0] fft_in_i_data;
|
||||
wire [16:0] fft_in_q_data;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
fft_config_tvalid <= 1'd0;
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
state_fft <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_fft)
|
||||
//帧间复位结束后,先等待fft_config_tvalid拉高,说明fft核允许配置,先写入一次fft配置
|
||||
2'd0:begin
|
||||
if(fft_config_tready) begin
|
||||
fft_config_tvalid <= 1'd1;
|
||||
fft_in_nd <= 1'd0;
|
||||
state_fft <= state_fft + 2'd1;
|
||||
end
|
||||
else begin
|
||||
fft_config_tvalid <= 1'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
state_fft <= state_fft;
|
||||
end
|
||||
end
|
||||
//每帧一开始fft核输入交给信道估计模块,直到flag_ChnEstFFT_done到来,说明信道估计两次fft输入完毕(Chn_Estimate给出)
|
||||
2'd1:begin
|
||||
fft_config_tvalid <= 1'd0;
|
||||
if(flag_ChnEstFFT_done) begin
|
||||
fft_in_i <= fft_in_i_data;
|
||||
fft_in_q <= fft_in_q_data;
|
||||
fft_in_nd <= nd_datafft;
|
||||
state_fft <= state_fft + 2'd1;
|
||||
end
|
||||
else begin
|
||||
fft_in_i <= fft_in_i_pilot;
|
||||
fft_in_q <= fft_in_q_pilot;
|
||||
fft_in_nd <= nd_pilotfft;
|
||||
state_fft <= state_fft;
|
||||
end
|
||||
end
|
||||
//nd_pilot2拉高,说明下一个征服导频头处理完毕,fft输入控制权交还信道估计模块
|
||||
2'd2:begin
|
||||
fft_config_tvalid <= 1'd0;
|
||||
if(nd_pilot2) begin
|
||||
fft_in_i <= fft_in_i_pilot;
|
||||
fft_in_q <= fft_in_q_pilot;
|
||||
fft_in_nd <= nd_pilotfft;
|
||||
state_fft <= 2'd1;
|
||||
end
|
||||
else begin
|
||||
fft_in_i <= fft_in_i_data;
|
||||
fft_in_q <= fft_in_q_data;
|
||||
fft_in_nd <= nd_datafft;
|
||||
state_fft <= state_fft;
|
||||
end
|
||||
end
|
||||
default:state_fft <= 2'd0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//------------------------------------------ifft核,及其输入输出控制器------------------------------------------//
|
||||
reg ifft_config_tvalid = 1'd0;
|
||||
wire ifft_config_tready;
|
||||
reg [19:0] ifft_in_i = 20'd0;
|
||||
reg [19:0] ifft_in_q = 20'd0;
|
||||
reg ifft_in_nd = 1'd0;
|
||||
wire ifft_in_tready;
|
||||
wire[63:0] ifft_out_tdata;
|
||||
wire[28:0] ifft_out_i;
|
||||
wire[28:0] ifft_out_q;
|
||||
wire ifft_out_nd;
|
||||
wire[7:0] ifft_index;
|
||||
|
||||
assign ifft_out_i = ifft_out_tdata[28:0];
|
||||
assign ifft_out_q = ifft_out_tdata[60:32];
|
||||
|
||||
wire m_axis_data_tlast_ifft;
|
||||
wire event_frame_started_ifft;
|
||||
wire event_tlast_unexpected_ifft;
|
||||
wire event_tlast_missing_ifft;
|
||||
wire event_status_channel_halt_ifft;
|
||||
wire event_data_in_channel_halt_ifft;
|
||||
wire event_data_out_channel_halt_ifft;
|
||||
|
||||
ifft_256 ifft_256 (
|
||||
.aclk (clk), // input wire aclk
|
||||
.aresetn (~rst), // input wire aresetn
|
||||
|
||||
.s_axis_config_tdata (8'd0), // input wire [7 : 0] s_axis_config_tdata
|
||||
.s_axis_config_tvalid (ifft_config_tvalid), // input wire s_axis_config_tvalid
|
||||
.s_axis_config_tready (ifft_config_tready), // output wire s_axis_config_tready
|
||||
|
||||
.s_axis_data_tdata ({4'd0,ifft_in_q,4'd0,ifft_in_i}), // input wire [47 : 0] s_axis_data_tdata
|
||||
.s_axis_data_tvalid (ifft_in_nd), // input wire s_axis_data_tvalid
|
||||
.s_axis_data_tready (ifft_in_tready), // output wire s_axis_data_tready
|
||||
.s_axis_data_tlast (1'd0), // input wire s_axis_data_tlast
|
||||
|
||||
.m_axis_data_tdata (ifft_out_tdata), // output wire [63 : 0] m_axis_data_tdata
|
||||
.m_axis_data_tuser (ifft_index), // output wire [7 : 0] m_axis_data_tuser
|
||||
.m_axis_data_tvalid (ifft_out_nd), // output wire m_axis_data_tvalid
|
||||
.m_axis_data_tready (1'd1), // input wire m_axis_data_tready
|
||||
.m_axis_data_tlast (m_axis_data_tlast_ifft), // output wire m_axis_data_tlast
|
||||
|
||||
.event_frame_started (event_frame_started_ifft), // output wire event_frame_started
|
||||
.event_tlast_unexpected (event_tlast_unexpected_ifft), // output wire event_tlast_unexpected
|
||||
.event_tlast_missing (event_tlast_missing_ifft), // output wire event_tlast_missing
|
||||
.event_status_channel_halt (event_status_channel_halt_ifft), // output wire event_status_channel_halt
|
||||
.event_data_in_channel_halt (event_data_in_channel_halt_ifft), // output wire event_data_in_channel_halt
|
||||
.event_data_out_channel_halt (event_data_out_channel_halt_ifft) // output wire event_data_out_channel_halt
|
||||
);
|
||||
|
||||
|
||||
reg [1:0] state_ifft = 2'd0;
|
||||
wire nd_pilotifft;
|
||||
wire [19:0] ifft_in_i_pilot;
|
||||
wire [19:0] ifft_in_q_pilot;
|
||||
wire nd_dataifft;
|
||||
wire [19:0] ifft_in_i_data;
|
||||
wire [19:0] ifft_in_q_data;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
ifft_config_tvalid <= 1'd0;
|
||||
ifft_in_i <= 20'd0;
|
||||
ifft_in_q <= 20'd0;
|
||||
ifft_in_nd <= 1'd0;
|
||||
state_ifft <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_ifft)
|
||||
//帧间复位结束后,先等待ifft_config_tvalid拉高,说明ifft核允许配置,先写入一次ifft配置
|
||||
2'd0:begin
|
||||
if(ifft_config_tready) begin
|
||||
ifft_config_tvalid <= 1'd1;
|
||||
ifft_in_nd <= 1'd0;
|
||||
state_ifft <= state_ifft + 2'd1;
|
||||
end
|
||||
else begin
|
||||
ifft_config_tvalid <= 1'd0;
|
||||
ifft_in_nd <= 1'd0;
|
||||
state_ifft <= state_ifft;
|
||||
end
|
||||
end
|
||||
//每帧一开始ifft核输入交给信道估计模块,直到flag_ChnEstFFT_done到来,说明信道估计两次fft输入完毕(Chn_Estimate给出)
|
||||
2'd1:begin
|
||||
ifft_config_tvalid <= 1'd0;
|
||||
if(flag_ChnEstFFT_done) begin
|
||||
ifft_in_i <= ifft_in_i_data;
|
||||
ifft_in_q <= ifft_in_q_data;
|
||||
ifft_in_nd <= nd_dataifft;
|
||||
state_ifft <= state_ifft + 2'd1;
|
||||
end
|
||||
else begin
|
||||
ifft_in_i <= ifft_in_i_pilot;
|
||||
ifft_in_q <= ifft_in_q_pilot;
|
||||
ifft_in_nd <= nd_pilotifft;
|
||||
state_ifft <= state_ifft;
|
||||
end
|
||||
end
|
||||
//nd_pilot2拉高,说明下一个征服导频头处理完毕,ifft输入控制权交还信道估计模块
|
||||
2'd2:begin
|
||||
ifft_config_tvalid <= 1'd0;
|
||||
if(nd_pilot2) begin
|
||||
ifft_in_i <= ifft_in_i_pilot;
|
||||
ifft_in_q <= ifft_in_q_pilot;
|
||||
ifft_in_nd <= nd_pilotifft;
|
||||
state_ifft <= 2'd1;
|
||||
end
|
||||
else begin
|
||||
ifft_in_i <= ifft_in_i_data;
|
||||
ifft_in_q <= ifft_in_q_data;
|
||||
ifft_in_nd <= nd_dataifft;
|
||||
state_ifft <= state_ifft;
|
||||
end
|
||||
end
|
||||
default:state_ifft <= 2'd0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------MMSE信道估计结果RAM--------------------------------------------------//
|
||||
wire write_MMSE_wea;
|
||||
wire [7:0] addrin_MMSE;
|
||||
wire [7:0] addrout_MMSE;
|
||||
wire [21:0] din_MMSE;
|
||||
wire [21:0] dout_MMSE;
|
||||
|
||||
RAM_ChnEst_MMSE RAM_ChnEst_MMSE (
|
||||
.clka (clk), // input wire clka
|
||||
.wea (write_MMSE_wea), // input wire [0 : 0] wea
|
||||
.addra (addrin_MMSE), // input wire [7 : 0] addra
|
||||
.dina (din_MMSE), // input wire [21 : 0] dina
|
||||
.clkb (clk), // input wire clkb
|
||||
.addrb (addrout_MMSE), // input wire [7 : 0] addrb
|
||||
.doutb (dout_MMSE) // output wire [21 : 0] doutb
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------MMSE信道估计模块--------------------------------------------------//
|
||||
Chn_Estimate Chn_Estimate_djy (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
//零域估计,默认值为8'd29
|
||||
.Zerozone_vio (Zerozone_vio),
|
||||
//增强导频序列
|
||||
.nd_pilot2 (nd_pilot2),
|
||||
.pilot_datai (pilot_datai),
|
||||
.pilot_dataq (pilot_dataq),
|
||||
//噪声估计结果
|
||||
.nd_EstNoise (nd_EstNoise),
|
||||
.EstNoise_i (EstNoise_i),
|
||||
.EstNoise_q (EstNoise_q),
|
||||
//fft核
|
||||
.fft_out_i (fft_out_i),
|
||||
.fft_out_q (fft_out_q),
|
||||
.fft_out_nd (fft_out_nd),
|
||||
.fft_index (fft_index),
|
||||
.fft_in_i (fft_in_i_pilot),
|
||||
.fft_in_q (fft_in_q_pilot),
|
||||
.fft_in_nd (nd_pilotfft),
|
||||
//ifft核
|
||||
.ifft_out_i (ifft_out_i),
|
||||
.ifft_out_q (ifft_out_q),
|
||||
.ifft_out_nd (ifft_out_nd),
|
||||
.ifft_index (ifft_index),
|
||||
.ifft_in_i (ifft_in_i_pilot),
|
||||
.ifft_in_q (ifft_in_q_pilot),
|
||||
.ifft_in_nd (nd_pilotifft),
|
||||
//信道估计两次fft输入完毕后拉高1clk
|
||||
.flag_ChnEstFFT_done (flag_ChnEstFFT_done), //信道估计两次fft输入完毕后拉高1clk
|
||||
//MMSE信道估计结果RAM
|
||||
.write_MMSE_wea (write_MMSE_wea),
|
||||
.addrin_MMSE (addrin_MMSE),
|
||||
.din_MMSE (din_MMSE),
|
||||
//debug,溢出标志
|
||||
.flagoverflow_fftpilot_26to14 (flagoverflow_fftpilot_26to14), //第1个fft结果截位,即导频fft结果的截位,26截到14
|
||||
.flagoverflow_ChnZF_26to18 (flagoverflow_ChnZF_26to18), //第2个fft结果截位,即ZF信道估计结果的截位,26截到18
|
||||
.flagoverflow_comdiv_34to20i (flagoverflow_comdiv_34to20i), //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到20
|
||||
.flagoverflow_comdiv_34to20q (flagoverflow_comdiv_34to20q), //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到20
|
||||
.flagoverflow_ifftzero_29to17i (flagoverflow_ifftzero_29to17i), //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
.flagoverflow_ifftzero_29to17q (flagoverflow_ifftzero_29to17q), //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
|
||||
.flagoverflow_MMSEdiv_divisor_31to28(flagoverflow_MMSEdiv_divisor_31to28), //第2个除法器,即MMSE除法的分母截位,31截到28
|
||||
.flagoverflow_divmmse_34to11 (flagoverflow_divmmse_34to11) //第2个除法器结果截位,即MMSE信道估计结果的截位,34截到11
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//------------------------------------------------------------均衡模块-------------------------------------------------------//
|
||||
|
||||
data_equalizer data_equalizer_djy (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
.EQUenable_vio (EQUenable_vio),
|
||||
//进程flag
|
||||
.nd_pilot2 (nd_pilot2),
|
||||
.flag_ChnEstFFT_done(flag_ChnEstFFT_done), //信道估计两次fft输入完毕后拉高1clk(Chn_Estimate给出)
|
||||
//数据的fifo,4个
|
||||
.dout_data1i (dout_data1i),
|
||||
.dout_data1q (dout_data1q),
|
||||
.rd_en_data1 (rd_en_data1),
|
||||
.dout_data2i (dout_data2i),
|
||||
.dout_data2q (dout_data2q),
|
||||
.rd_en_data2 (rd_en_data2),
|
||||
.flag_dataow (flag_dataow), //拉高1clk,说明一段数据ow存储完毕,后端可开始连续读取
|
||||
//fft核
|
||||
.fft_out_i (fft_out_i),
|
||||
.fft_out_q (fft_out_q),
|
||||
.fft_out_nd (fft_out_nd),
|
||||
.fft_index (fft_index),
|
||||
.fft_in_i (fft_in_i_data),
|
||||
.fft_in_q (fft_in_q_data),
|
||||
.fft_in_nd (nd_datafft),
|
||||
//ifft核
|
||||
.ifft_out_i (ifft_out_i),
|
||||
.ifft_out_q (ifft_out_q),
|
||||
.ifft_out_nd (ifft_out_nd),
|
||||
.ifft_index (ifft_index),
|
||||
.ifft_in_i (ifft_in_i_data),
|
||||
.ifft_in_q (ifft_in_q_data),
|
||||
.ifft_in_nd (nd_dataifft),
|
||||
//MMSE信道估计结果RAM
|
||||
.addrout_MMSE (addrout_MMSE),
|
||||
.dout_MMSE (dout_MMSE),
|
||||
//均衡结果输出
|
||||
.nd_SC_FDE_dout (nd_SC_FDE_dout),
|
||||
.SC_FDE_douti (SC_FDE_douti),
|
||||
.SC_FDE_doutq (SC_FDE_doutq),
|
||||
//debug,溢出标志
|
||||
.flagoverflow_ifftindata_28to20i (flagoverflow_ifftindata_28to20i), //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
.flagoverflow_ifftindata_28to20q (flagoverflow_ifftindata_28to20q), //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
.flagoverflow_fftdata_26to16i (flagoverflow_fftdata_26to16i), //数据段ow的fft输出截位,26截到16
|
||||
.flagoverflow_fftdata_26to16q (flagoverflow_fftdata_26to16q), //数据段ow的fft输出截位,26截到16
|
||||
.flagoverflow_FDE_dataout_29to10i (flagoverflow_FDE_dataout_29to10i), //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
.flagoverflow_FDE_dataout_29to10q (flagoverflow_FDE_dataout_29to10q) //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------写测试文件---------------------------------------------------------------------//
|
||||
//----------------------------------------验证data_ow----------------------------------//
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
// integer handle05;
|
||||
// integer handle06;
|
||||
// integer handle07;
|
||||
// integer handle08;
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
// handle01=$fopen("pilot_datai.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("pilot_dataq.txt","w"); $fclose(handle02);
|
||||
// handle03=$fopen("pilot_noisei.txt","w"); $fclose(handle03);
|
||||
// handle04=$fopen("pilot_noiseq.txt","w"); $fclose(handle04);
|
||||
|
||||
// handle05=$fopen("din_data1i.txt","w"); $fclose(handle05);
|
||||
// handle06=$fopen("din_data1q.txt","w"); $fclose(handle06);
|
||||
// handle07=$fopen("din_data2i.txt","w"); $fclose(handle07);
|
||||
// handle08=$fopen("din_data2q.txt","w"); $fclose(handle08);
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
// if(nd_pilot2)begin
|
||||
// handle01=$fopen("pilot_datai.txt","a+");$fwrite(handle01,"%d\n",$signed(pilot_datai));$fclose(handle01);
|
||||
// handle02=$fopen("pilot_dataq.txt","a+");$fwrite(handle02,"%d\n",$signed(pilot_dataq));$fclose(handle02);
|
||||
// handle03=$fopen("pilot_noisei.txt","a+");$fwrite(handle03,"%d\n",$signed(pilot_noisei));$fclose(handle03);
|
||||
// handle04=$fopen("pilot_noiseq.txt","a+");$fwrite(handle04,"%d\n",$signed(pilot_noiseq));$fclose(handle04);
|
||||
// end
|
||||
// if(wr_en_data1)begin
|
||||
// handle05=$fopen("din_data1i.txt","a+");$fwrite(handle05,"%d\n",$signed(din_data1i));$fclose(handle05);
|
||||
// handle06=$fopen("din_data1q.txt","a+");$fwrite(handle06,"%d\n",$signed(din_data1q));$fclose(handle06);
|
||||
// end
|
||||
// if(wr_en_data2)begin
|
||||
// handle07=$fopen("din_data2i.txt","a+");$fwrite(handle07,"%d\n",$signed(din_data2i));$fclose(handle07);
|
||||
// handle08=$fopen("din_data2q.txt","a+");$fwrite(handle08,"%d\n",$signed(din_data2q));$fclose(handle08);
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------验证data_ow----------------------------------//
|
||||
// integer handle01;
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
// integer handle05;
|
||||
// integer handle06;
|
||||
// integer handle07;
|
||||
// integer handle08;
|
||||
// integer handle09;
|
||||
// integer handle10;
|
||||
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
// handle01=$fopen("fft_out_i.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("fft_out_q.txt","w"); $fclose(handle02);
|
||||
// handle03=$fopen("ifft_out_i.txt","w"); $fclose(handle03);
|
||||
// handle04=$fopen("ifft_out_q.txt","w"); $fclose(handle04);
|
||||
// handle05=$fopen("fft_in_i.txt","w"); $fclose(handle05);
|
||||
// handle06=$fopen("fft_in_q.txt","w"); $fclose(handle06);
|
||||
// handle07=$fopen("ifft_in_i.txt","w"); $fclose(handle07);
|
||||
// handle08=$fopen("ifft_in_q.txt","w"); $fclose(handle08);
|
||||
// handle09=$fopen("SC_FDE_douti.txt","w"); $fclose(handle09);
|
||||
// handle10=$fopen("SC_FDE_doutq.txt","w"); $fclose(handle10);
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
// if(fft_out_nd)begin
|
||||
// handle01=$fopen("fft_out_i.txt","a+");$fwrite(handle01,"%d\n",$signed(fft_out_i));$fclose(handle01);
|
||||
// handle02=$fopen("fft_out_q.txt","a+");$fwrite(handle02,"%d\n",$signed(fft_out_q));$fclose(handle02);
|
||||
// end
|
||||
// if(ifft_out_nd)begin
|
||||
// handle03=$fopen("ifft_out_i.txt","a+");$fwrite(handle03,"%d\n",$signed(ifft_out_i));$fclose(handle03);
|
||||
// handle04=$fopen("ifft_out_q.txt","a+");$fwrite(handle04,"%d\n",$signed(ifft_out_q));$fclose(handle04);
|
||||
// end
|
||||
// if(fft_in_nd)begin
|
||||
// handle05=$fopen("fft_in_i.txt","a+");$fwrite(handle05,"%d\n",$signed(fft_in_i));$fclose(handle05);
|
||||
// handle06=$fopen("fft_in_q.txt","a+");$fwrite(handle06,"%d\n",$signed(fft_in_q));$fclose(handle06);
|
||||
// end
|
||||
// if(ifft_in_nd)begin
|
||||
// handle07=$fopen("ifft_in_i.txt","a+");$fwrite(handle07,"%d\n",$signed(ifft_in_i));$fclose(handle07);
|
||||
// handle08=$fopen("ifft_in_q.txt","a+");$fwrite(handle08,"%d\n",$signed(ifft_in_q));$fclose(handle08);
|
||||
// end
|
||||
// if(nd_SC_FDE_dout)begin
|
||||
// handle09=$fopen("SC_FDE_douti.txt","a+");$fwrite(handle09,"%d\n",$signed(SC_FDE_douti));$fclose(handle09);
|
||||
// handle10=$fopen("SC_FDE_doutq.txt","a+");$fwrite(handle10,"%d\n",$signed(SC_FDE_doutq));$fclose(handle10);
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,889 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/11/18 21:03:55
|
||||
// Design Name:
|
||||
// Module Name: TSync_Abs_new16
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//4倍过采样内插至16
|
||||
//帧内不更新
|
||||
|
||||
module TSync_Abs_new16(
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input framesync_Interpolation,
|
||||
output reg framesync_out16 = 1'd0,
|
||||
|
||||
input [9:0] datain1_i,
|
||||
input [9:0] datain1_q,
|
||||
input [9:0] datain2_i,
|
||||
input [9:0] datain2_q,
|
||||
input [9:0] datain3_i,
|
||||
input [9:0] datain3_q,
|
||||
input [9:0] datain4_i,
|
||||
input [9:0] datain4_q,
|
||||
|
||||
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_clk16 = 2'd0, //12.5
|
||||
output reg [1:0] flag_num16 = 2'd0
|
||||
|
||||
|
||||
);
|
||||
|
||||
//-------------------------------------状态机控制----------------------------------------------//
|
||||
|
||||
|
||||
// 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_out16 <= 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_clk16) begin
|
||||
framesync_out16 <= 1'd1;
|
||||
TSyncout_nd <= 1'd1;
|
||||
case(flag_num16)
|
||||
2'd0:begin
|
||||
TSyncout_i <= datain1_i;
|
||||
TSyncout_q <= datain1_q;
|
||||
end
|
||||
2'd1:begin
|
||||
TSyncout_i <= datain2_i;
|
||||
TSyncout_q <= datain2_q;
|
||||
end
|
||||
2'd2:begin
|
||||
TSyncout_i <= datain3_i;
|
||||
TSyncout_q <= datain3_q;
|
||||
end
|
||||
2'd3:begin
|
||||
TSyncout_i <= datain4_i;
|
||||
TSyncout_q <= datain4_q;
|
||||
end
|
||||
endcase
|
||||
flag_framesync <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
framesync_out16 <= 1'd0;
|
||||
TSyncout_nd <= 1'd0;
|
||||
flag_framesync <= 1'd1;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
framesync_out16 <= 1'd0;
|
||||
flag_framesync <= 1'd0;
|
||||
TSyncout_nd <= 1'd0;
|
||||
TSyncout_i <= 10'd0;
|
||||
TSyncout_q <= 10'd0;
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//---------------------------------------求近似模值Abs,delay=6-------------------------------------//
|
||||
wire [10:0] data_1;
|
||||
ApproxAbs_v2 ApproxAbs_v2_tsync1 (
|
||||
.clk (clk),
|
||||
.ND (1'd1),
|
||||
.Din_I (datain1_i),
|
||||
.Din_Q (datain1_q),
|
||||
.Dout (data_1),
|
||||
.Rdy ()
|
||||
);
|
||||
|
||||
wire [10:0] data_2;
|
||||
ApproxAbs_v2 ApproxAbs_v2_tsync2 (
|
||||
.clk (clk),
|
||||
.ND (1'd1),
|
||||
.Din_I (datain2_i),
|
||||
.Din_Q (datain2_q),
|
||||
.Dout (data_2),
|
||||
.Rdy ()
|
||||
);
|
||||
|
||||
wire [10:0] data_3;
|
||||
ApproxAbs_v2 ApproxAbs_v2_tsync3 (
|
||||
.clk (clk),
|
||||
.ND (1'd1),
|
||||
.Din_I (datain3_i),
|
||||
.Din_Q (datain3_q),
|
||||
.Dout (data_3),
|
||||
.Rdy ()
|
||||
);
|
||||
|
||||
wire [10:0] data_4;
|
||||
ApproxAbs_v2 ApproxAbs_v2_tsync4 (
|
||||
.clk (clk),
|
||||
.ND (1'd1),
|
||||
.Din_I (datain4_i),
|
||||
.Din_Q (datain4_q),
|
||||
.Dout (data_4),
|
||||
.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 [19:0] acc_05 = 20'd0;
|
||||
reg [19:0] acc_06 = 20'd0;
|
||||
reg [19:0] acc_07 = 20'd0;
|
||||
reg [19:0] acc_08 = 20'd0;
|
||||
reg [19:0] acc_09 = 20'd0;
|
||||
reg [19:0] acc_10 = 20'd0;
|
||||
reg [19:0] acc_11 = 20'd0;
|
||||
reg [19:0] acc_12 = 20'd0;
|
||||
reg [19:0] acc_13 = 20'd0;
|
||||
reg [19:0] acc_14 = 20'd0;
|
||||
reg [19:0] acc_15 = 20'd0;
|
||||
reg [19:0] acc_16 = 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;
|
||||
acc_05 <= 20'd0;
|
||||
acc_06 <= 20'd0;
|
||||
acc_07 <= 20'd0;
|
||||
acc_08 <= 20'd0;
|
||||
acc_09 <= 20'd0;
|
||||
acc_10 <= 20'd0;
|
||||
acc_11 <= 20'd0;
|
||||
acc_12 <= 20'd0;
|
||||
acc_13 <= 20'd0;
|
||||
acc_14 <= 20'd0;
|
||||
acc_15 <= 20'd0;
|
||||
acc_16 <= 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_1};
|
||||
acc_02 <= {9'd0,data_2};
|
||||
acc_03 <= {9'd0,data_3};
|
||||
acc_04 <= {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd1:begin
|
||||
acc_05 <= {9'd0,data_1};
|
||||
acc_06 <= {9'd0,data_2};
|
||||
acc_07 <= {9'd0,data_3};
|
||||
acc_08 <= {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd2:begin
|
||||
acc_09 <= {9'd0,data_1};
|
||||
acc_10 <= {9'd0,data_2};
|
||||
acc_11 <= {9'd0,data_3};
|
||||
acc_12 <= {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd3:begin
|
||||
acc_13 <= {9'd0,data_1};
|
||||
acc_14 <= {9'd0,data_2};
|
||||
acc_15 <= {9'd0,data_3};
|
||||
acc_16 <= {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd1;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
case(cnt_4)
|
||||
2'd0:begin
|
||||
acc_01 <= acc_01 + {9'd0,data_1};
|
||||
acc_02 <= acc_02 + {9'd0,data_2};
|
||||
acc_03 <= acc_03 + {9'd0,data_3};
|
||||
acc_04 <= acc_04 + {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd1:begin
|
||||
acc_05 <= acc_05 + {9'd0,data_1};
|
||||
acc_06 <= acc_06 + {9'd0,data_2};
|
||||
acc_07 <= acc_07 + {9'd0,data_3};
|
||||
acc_08 <= acc_08 + {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd2:begin
|
||||
acc_09 <= acc_09 + {9'd0,data_1};
|
||||
acc_10 <= acc_10 + {9'd0,data_2};
|
||||
acc_11 <= acc_11 + {9'd0,data_3};
|
||||
acc_12 <= acc_12 + {9'd0,data_4};
|
||||
|
||||
nd_acc <= 1'd0;
|
||||
end
|
||||
2'd3:begin
|
||||
acc_13 <= acc_13 + {9'd0,data_1};
|
||||
acc_14 <= acc_14 + {9'd0,data_2};
|
||||
acc_15 <= acc_15 + {9'd0,data_3};
|
||||
acc_16 <= acc_16 + {9'd0,data_4};
|
||||
|
||||
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 [19:0] temp_1_03 = 20'd0;
|
||||
reg [19:0] temp_1_04 = 20'd0;
|
||||
reg [19:0] temp_1_05 = 20'd0;
|
||||
reg [19:0] temp_1_06 = 20'd0;
|
||||
reg [19:0] temp_1_07 = 20'd0;
|
||||
reg [19:0] temp_1_08 = 20'd0;
|
||||
|
||||
reg [1:0] flag_clk_1_01 =2'd0;
|
||||
reg [1:0] flag_clk_1_02 =2'd0;
|
||||
reg [1:0] flag_clk_1_03 =2'd0;
|
||||
reg [1:0] flag_clk_1_04 =2'd0;
|
||||
reg [1:0] flag_clk_1_05 =2'd0;
|
||||
reg [1:0] flag_clk_1_06 =2'd0;
|
||||
reg [1:0] flag_clk_1_07 =2'd0;
|
||||
reg [1:0] flag_clk_1_08 =2'd0;
|
||||
|
||||
reg [1:0] flag_num_1_01 =2'd0;
|
||||
reg [1:0] flag_num_1_02 =2'd0;
|
||||
reg [1:0] flag_num_1_03 =2'd0;
|
||||
reg [1:0] flag_num_1_04 =2'd0;
|
||||
reg [1:0] flag_num_1_05 =2'd0;
|
||||
reg [1:0] flag_num_1_06 =2'd0;
|
||||
reg [1:0] flag_num_1_07 =2'd0;
|
||||
reg [1:0] flag_num_1_08 =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;
|
||||
reg [19:0] acc_05_reg = 20'd0;
|
||||
reg [19:0] acc_06_reg = 20'd0;
|
||||
reg [19:0] acc_07_reg = 20'd0;
|
||||
reg [19:0] acc_08_reg = 20'd0;
|
||||
reg [19:0] acc_09_reg = 20'd0;
|
||||
reg [19:0] acc_10_reg = 20'd0;
|
||||
reg [19:0] acc_11_reg = 20'd0;
|
||||
reg [19:0] acc_12_reg = 20'd0;
|
||||
reg [19:0] acc_13_reg = 20'd0;
|
||||
reg [19:0] acc_14_reg = 20'd0;
|
||||
reg [19:0] acc_15_reg = 20'd0;
|
||||
reg [19:0] acc_16_reg = 20'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
temp_1_01 <= 20'd0;
|
||||
temp_1_02 <= 20'd0;
|
||||
temp_1_03 <= 20'd0;
|
||||
temp_1_04 <= 20'd0;
|
||||
temp_1_05 <= 20'd0;
|
||||
temp_1_06 <= 20'd0;
|
||||
temp_1_07 <= 20'd0;
|
||||
temp_1_08 <= 20'd0;
|
||||
|
||||
flag_clk_1_01 <=2'd0;
|
||||
flag_clk_1_02 <=2'd0;
|
||||
flag_clk_1_03 <=2'd0;
|
||||
flag_clk_1_04 <=2'd0;
|
||||
flag_clk_1_05 <=2'd0;
|
||||
flag_clk_1_06 <=2'd0;
|
||||
flag_clk_1_07 <=2'd0;
|
||||
flag_clk_1_08 <=2'd0;
|
||||
|
||||
flag_num_1_01 <=2'd0;
|
||||
flag_num_1_02 <=2'd0;
|
||||
flag_num_1_03 <=2'd0;
|
||||
flag_num_1_04 <=2'd0;
|
||||
flag_num_1_05 <=2'd0;
|
||||
flag_num_1_06 <=2'd0;
|
||||
flag_num_1_07 <=2'd0;
|
||||
flag_num_1_08 <=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;
|
||||
acc_05_reg <= 20'd0;
|
||||
acc_06_reg <= 20'd0;
|
||||
acc_07_reg <= 20'd0;
|
||||
acc_08_reg <= 20'd0;
|
||||
acc_09_reg <= 20'd0;
|
||||
acc_10_reg <= 20'd0;
|
||||
acc_11_reg <= 20'd0;
|
||||
acc_12_reg <= 20'd0;
|
||||
acc_13_reg <= 20'd0;
|
||||
acc_14_reg <= 20'd0;
|
||||
acc_15_reg <= 20'd0;
|
||||
acc_16_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;
|
||||
acc_05_reg <= acc_05;
|
||||
acc_06_reg <= acc_06;
|
||||
acc_07_reg <= acc_07;
|
||||
acc_08_reg <= acc_08;
|
||||
acc_09_reg <= acc_09;
|
||||
acc_10_reg <= acc_10;
|
||||
acc_11_reg <= acc_11;
|
||||
acc_12_reg <= acc_12;
|
||||
acc_13_reg <= acc_13;
|
||||
acc_14_reg <= acc_14;
|
||||
acc_15_reg <= acc_15;
|
||||
acc_16_reg <= acc_16;
|
||||
//ila用
|
||||
|
||||
if(acc_01>=acc_02) begin
|
||||
temp_1_01 <= acc_01;
|
||||
flag_clk_1_01 <= 2'd0;
|
||||
flag_num_1_01 <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
temp_1_01 <= acc_02;
|
||||
flag_clk_1_01 <= 2'd0;
|
||||
flag_num_1_01 <= 2'd1;
|
||||
end
|
||||
|
||||
if(acc_03>=acc_04) begin
|
||||
temp_1_02 <= acc_03;
|
||||
flag_clk_1_02 <= 2'd0;
|
||||
flag_num_1_02 <= 2'd2;
|
||||
end
|
||||
else begin
|
||||
temp_1_02 <= acc_04;
|
||||
flag_clk_1_02 <= 2'd0;
|
||||
flag_num_1_02 <= 2'd3;
|
||||
end
|
||||
|
||||
if(acc_05>=acc_06) begin
|
||||
temp_1_03 <= acc_05;
|
||||
flag_clk_1_03 <= 2'd1;
|
||||
flag_num_1_03 <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
temp_1_03 <= acc_06;
|
||||
flag_clk_1_03 <= 2'd1;
|
||||
flag_num_1_03 <= 2'd1;
|
||||
end
|
||||
|
||||
if(acc_07>=acc_08) begin
|
||||
temp_1_04 <= acc_07;
|
||||
flag_clk_1_04 <= 2'd1;
|
||||
flag_num_1_04 <= 2'd2;
|
||||
end
|
||||
else begin
|
||||
temp_1_04 <= acc_08;
|
||||
flag_clk_1_04 <= 2'd1;
|
||||
flag_num_1_04 <= 2'd3;
|
||||
end
|
||||
|
||||
if(acc_09>=acc_10) begin
|
||||
temp_1_05 <= acc_09;
|
||||
flag_clk_1_05 <= 2'd2;
|
||||
flag_num_1_05 <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
temp_1_05 <= acc_10;
|
||||
flag_clk_1_05 <= 2'd2;
|
||||
flag_num_1_05 <= 2'd1;
|
||||
end
|
||||
|
||||
if(acc_11>=acc_12) begin
|
||||
temp_1_06 <= acc_11;
|
||||
flag_clk_1_06 <= 2'd2;
|
||||
flag_num_1_06 <= 2'd2;
|
||||
end
|
||||
else begin
|
||||
temp_1_06 <= acc_12;
|
||||
flag_clk_1_06 <= 2'd2;
|
||||
flag_num_1_06 <= 2'd3;
|
||||
end
|
||||
|
||||
if(acc_13>=acc_14) begin
|
||||
temp_1_07 <= acc_13;
|
||||
flag_clk_1_07 <= 2'd3;
|
||||
flag_num_1_07 <= 2'd0;
|
||||
end
|
||||
else begin
|
||||
temp_1_07 <= acc_14;
|
||||
flag_clk_1_07 <= 2'd3;
|
||||
flag_num_1_07 <= 2'd1;
|
||||
end
|
||||
|
||||
if(acc_15>=acc_16) begin
|
||||
temp_1_08 <= acc_15;
|
||||
flag_clk_1_08 <= 2'd3;
|
||||
flag_num_1_08 <= 2'd2;
|
||||
end
|
||||
else begin
|
||||
temp_1_08 <= acc_16;
|
||||
flag_clk_1_08 <= 2'd3;
|
||||
flag_num_1_08 <= 2'd3;
|
||||
end
|
||||
end
|
||||
else nd_acc1 <= 1'd0;
|
||||
end
|
||||
end
|
||||
|
||||
reg [19:0] temp_2_01 = 20'd0;
|
||||
reg [19:0] temp_2_02 = 20'd0;
|
||||
reg [19:0] temp_2_03 = 20'd0;
|
||||
reg [19:0] temp_2_04 = 20'd0;
|
||||
|
||||
reg [1:0] flag_clk_2_01 = 2'd0;
|
||||
reg [1:0] flag_clk_2_02 = 2'd0;
|
||||
reg [1:0] flag_clk_2_03 = 2'd0;
|
||||
reg [1:0] flag_clk_2_04 = 2'd0;
|
||||
|
||||
reg [1:0] flag_num_2_01 = 2'd0;
|
||||
reg [1:0] flag_num_2_02 = 2'd0;
|
||||
reg [1:0] flag_num_2_03 = 2'd0;
|
||||
reg [1:0] flag_num_2_04 = 2'd0;
|
||||
|
||||
reg nd_acc2 = 1'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
temp_2_01 <= 20'd0;
|
||||
temp_2_02 <= 20'd0;
|
||||
temp_2_03 <= 20'd0;
|
||||
temp_2_04 <= 20'd0;
|
||||
|
||||
flag_clk_2_01 <= 2'd0;
|
||||
flag_clk_2_02 <= 2'd0;
|
||||
flag_clk_2_03 <= 2'd0;
|
||||
flag_clk_2_04 <= 2'd0;
|
||||
|
||||
flag_num_2_01 <= 2'd0;
|
||||
flag_num_2_02 <= 2'd0;
|
||||
flag_num_2_03 <= 2'd0;
|
||||
flag_num_2_04 <= 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
|
||||
temp_2_01 <= temp_1_01;
|
||||
flag_clk_2_01 <= flag_clk_1_01;
|
||||
flag_num_2_01 <= flag_num_1_01;
|
||||
end
|
||||
else begin
|
||||
temp_2_01 <= temp_1_02;
|
||||
flag_clk_2_01 <= flag_clk_1_02;
|
||||
flag_num_2_01 <= flag_num_1_02;
|
||||
end
|
||||
|
||||
if(temp_1_03>=temp_1_04) begin
|
||||
temp_2_02 <= temp_1_03;
|
||||
flag_clk_2_02 <= flag_clk_1_03;
|
||||
flag_num_2_02 <= flag_num_1_03;
|
||||
end
|
||||
else begin
|
||||
temp_2_02 <= temp_1_04;
|
||||
flag_clk_2_02 <= flag_clk_1_04;
|
||||
flag_num_2_02 <= flag_num_1_04;
|
||||
end
|
||||
|
||||
if(temp_1_05>=temp_1_06) begin
|
||||
temp_2_03 <= temp_1_05;
|
||||
flag_clk_2_03 <= flag_clk_1_05;
|
||||
flag_num_2_03 <= flag_num_1_05;
|
||||
end
|
||||
else begin
|
||||
temp_2_03 <= temp_1_06;
|
||||
flag_clk_2_03 <= flag_clk_1_06;
|
||||
flag_num_2_03 <= flag_num_1_06;
|
||||
end
|
||||
|
||||
if(temp_1_07>=temp_1_08) begin
|
||||
temp_2_04 <= temp_1_07;
|
||||
flag_clk_2_04 <= flag_clk_1_07;
|
||||
flag_num_2_04 <= flag_num_1_07;
|
||||
end
|
||||
else begin
|
||||
temp_2_04 <= temp_1_08;
|
||||
flag_clk_2_04 <= flag_clk_1_08;
|
||||
flag_num_2_04 <= flag_num_1_08;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
reg [19:0] temp_3_1 = 20'd0;
|
||||
reg [19:0] temp_3_2 = 20'd0;
|
||||
|
||||
reg [1:0] flag_clk_3_1 = 2'd0;
|
||||
reg [1:0] flag_clk_3_2 = 2'd0;
|
||||
|
||||
reg [1:0] flag_num_3_1 = 2'd0;
|
||||
reg [1:0] flag_num_3_2 = 2'd0;
|
||||
|
||||
reg nd_acc3 = 1'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
temp_3_1 <= 20'd0;
|
||||
temp_3_2 <= 20'd0;
|
||||
|
||||
flag_clk_3_1 <= 2'd0;
|
||||
flag_clk_3_2 <= 2'd0;
|
||||
|
||||
flag_num_3_1 <= 2'd0;
|
||||
flag_num_3_2 <= 2'd0;
|
||||
|
||||
nd_acc3 <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
nd_acc3 <= nd_acc2;
|
||||
if(nd_acc2) begin
|
||||
if(temp_2_01>=temp_2_02) begin
|
||||
temp_3_1 <= temp_2_01;
|
||||
flag_clk_3_1 <= flag_clk_2_01;
|
||||
flag_num_3_1 <= flag_num_2_01;
|
||||
end
|
||||
else begin
|
||||
temp_3_1 <= temp_2_02;
|
||||
flag_clk_3_1 <= flag_clk_2_02;
|
||||
flag_num_3_1 <= flag_num_2_02;
|
||||
end
|
||||
|
||||
if(temp_2_03>=temp_2_04) begin
|
||||
temp_3_2 <= temp_2_03;
|
||||
flag_clk_3_2 <= flag_clk_2_03;
|
||||
flag_num_3_2 <= flag_num_2_03;
|
||||
end
|
||||
else begin
|
||||
temp_3_2 <= temp_2_04;
|
||||
flag_clk_3_2 <= flag_clk_2_04;
|
||||
flag_num_3_2 <= flag_num_2_04;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------------------给采样标志,delay=1--------------------------------------//
|
||||
|
||||
reg nd_acc4 = 1'd0;
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
flag_clk16 <= 2'd0;
|
||||
nd_acc4 <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
nd_acc4 <= nd_acc3;
|
||||
if(nd_acc3) begin
|
||||
if(temp_3_1>=temp_3_2) begin
|
||||
flag_clk16 <= flag_clk_3_1;
|
||||
flag_num16 <= flag_num_3_1;
|
||||
end
|
||||
else begin
|
||||
flag_clk16 <= flag_clk_3_2;
|
||||
flag_num16 <= flag_num_3_2;
|
||||
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
|
||||
|
||||
integer handle01;
|
||||
integer handle02;
|
||||
integer handle03;
|
||||
integer handle04;
|
||||
|
||||
|
||||
reg enable1 = 0;
|
||||
reg flag_save = 0;
|
||||
initial begin
|
||||
handle01=$fopen("data_1.txt","w"); $fclose(handle01);
|
||||
handle02=$fopen("data_2.txt","w"); $fclose(handle02);
|
||||
handle03=$fopen("data_3.txt","w"); $fclose(handle03);
|
||||
handle04=$fopen("data_4.txt","w"); $fclose(handle04);
|
||||
|
||||
#10;
|
||||
enable1 = 1;
|
||||
end
|
||||
|
||||
always@(posedge clk)begin
|
||||
if(enable1)begin
|
||||
if(nd_6) flag_save <= 1'd1;
|
||||
else flag_save <= flag_save;
|
||||
if(flag_save) begin
|
||||
handle01=$fopen("data_1.txt","a+");$fwrite(handle01,"%d\n",$signed(data_1));$fclose(handle01);
|
||||
handle02=$fopen("data_2.txt","a+");$fwrite(handle02,"%d\n",$signed(data_2));$fclose(handle02);
|
||||
handle03=$fopen("data_3.txt","a+");$fwrite(handle03,"%d\n",$signed(data_3));$fclose(handle03);
|
||||
handle04=$fopen("data_4.txt","a+");$fwrite(handle04,"%d\n",$signed(data_4));$fclose(handle04);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,472 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// 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
|
||||
@@ -0,0 +1,196 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 17:44 11/14/2019
|
||||
// Design Name:
|
||||
// Module Name: TimeSync_top
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module TimeSync_top(
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input [9:0] dini,
|
||||
input [9:0] dinq,
|
||||
|
||||
output reg rdy = 1'd0,
|
||||
output reg [9:0] douti = 10'd0,
|
||||
output reg [9:0] doutq = 10'd0,
|
||||
|
||||
input vio_tsync_inter16,//12.5
|
||||
input framesync, //帧同步标志
|
||||
output reg framesync_tsync = 1'd0, //帧同步标志
|
||||
|
||||
//debug
|
||||
output reg [1:0] cnt_tsync = 2'd0,//12.5
|
||||
output reg [3:0] flag_clk_4bit = 4'd0//12.5
|
||||
);
|
||||
|
||||
|
||||
wire [9:0] InterpdoutiA;
|
||||
wire [9:0] InterpdoutqA;
|
||||
wire [9:0] InterpdoutiB;
|
||||
wire [9:0] InterpdoutqB;
|
||||
wire [9:0] InterpdoutiC;
|
||||
wire [9:0] InterpdoutqC;
|
||||
wire [9:0] InterpdoutiD;
|
||||
wire [9:0] InterpdoutqD;
|
||||
|
||||
wire framesync_Interpolation;
|
||||
Interpolation Interpolation (
|
||||
.clk(clk),
|
||||
.framesync(framesync),
|
||||
.framesync_Interpolation(framesync_Interpolation),
|
||||
.dini(dini),
|
||||
.dinq(dinq),
|
||||
.doutiA(InterpdoutiA),
|
||||
.doutqA(InterpdoutqA),
|
||||
.doutiB(InterpdoutiB),
|
||||
.doutqB(InterpdoutqB),
|
||||
.doutiC(InterpdoutiC),
|
||||
.doutqC(InterpdoutqC),
|
||||
.doutiD(InterpdoutiD),
|
||||
.doutqD(InterpdoutqD)
|
||||
);
|
||||
|
||||
|
||||
wire rdy_4;
|
||||
wire [9:0] douti_4;
|
||||
wire [9:0] doutq_4;
|
||||
wire [1:0] cnt_4;
|
||||
wire [1:0] flag_clk4;
|
||||
wire framesync_out4;
|
||||
TSync_Abs_new4 TSync_Abs_new4 (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
.framesync_Interpolation(framesync),
|
||||
.framesync_out4(framesync_out4),
|
||||
.dataini(dini),
|
||||
.datainq(dinq),
|
||||
.TSyncout_nd(rdy_4),
|
||||
.TSyncout_i(douti_4),
|
||||
.TSyncout_q(doutq_4),
|
||||
|
||||
.cnt(cnt_4),
|
||||
.flag_clk4(flag_clk4)
|
||||
);
|
||||
|
||||
|
||||
wire rdy_16;
|
||||
wire [9:0] douti_16;
|
||||
wire [9:0] doutq_16;
|
||||
wire [1:0] cnt_16;
|
||||
wire [1:0] flag_clk16;
|
||||
wire [1:0] flag_num16;
|
||||
wire framesync_out16;
|
||||
TSync_Abs_new16 TSync_Abs_new16 (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
.framesync_Interpolation(framesync_Interpolation),
|
||||
.framesync_out16(framesync_out16),
|
||||
.datain1_i(InterpdoutiA),
|
||||
.datain1_q(InterpdoutqA),
|
||||
.datain2_i(InterpdoutiB),
|
||||
.datain2_q(InterpdoutqB),
|
||||
.datain3_i(InterpdoutiC),
|
||||
.datain3_q(InterpdoutqC),
|
||||
.datain4_i(InterpdoutiD),
|
||||
.datain4_q(InterpdoutqD),
|
||||
.TSyncout_nd(rdy_16),
|
||||
.TSyncout_i(douti_16),
|
||||
.TSyncout_q(doutq_16),
|
||||
|
||||
.cnt(cnt_16),
|
||||
.flag_clk16(flag_clk16),
|
||||
.flag_num16(flag_num16)
|
||||
);
|
||||
|
||||
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
rdy <= 1'd0;
|
||||
douti <= 10'd0;
|
||||
doutq <= 10'd0;
|
||||
framesync_tsync <= 1'd0;
|
||||
|
||||
cnt_tsync <= 2'd0;
|
||||
flag_clk_4bit <= 4'd0;
|
||||
end
|
||||
else begin
|
||||
if(vio_tsync_inter16) begin
|
||||
rdy <= rdy_16;
|
||||
douti <= douti_16;
|
||||
doutq <= doutq_16;
|
||||
framesync_tsync <= framesync_out16;
|
||||
|
||||
cnt_tsync <= cnt_16;
|
||||
flag_clk_4bit <= {flag_clk16,flag_num16};
|
||||
end
|
||||
else begin
|
||||
rdy <= rdy_4;
|
||||
douti <= douti_4;
|
||||
doutq <= doutq_4;
|
||||
framesync_tsync <= framesync_out4;
|
||||
|
||||
cnt_tsync <= cnt_4;
|
||||
flag_clk_4bit <= {2'd0,flag_clk4};
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
// integer handle01;
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
// integer handle05;
|
||||
// integer handle06;
|
||||
// integer handle07;
|
||||
// integer handle08;
|
||||
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
// handle01=$fopen("InterpdoutiA.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("InterpdoutqA.txt","w"); $fclose(handle02);
|
||||
// handle03=$fopen("InterpdoutiB.txt","w"); $fclose(handle03);
|
||||
// handle04=$fopen("InterpdoutqB.txt","w"); $fclose(handle04);
|
||||
// handle05=$fopen("InterpdoutiC.txt","w"); $fclose(handle05);
|
||||
// handle06=$fopen("InterpdoutqC.txt","w"); $fclose(handle06);
|
||||
// handle07=$fopen("InterpdoutiD.txt","w"); $fclose(handle07);
|
||||
// handle08=$fopen("InterpdoutqD.txt","w"); $fclose(handle08);
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
|
||||
// handle01=$fopen("InterpdoutiA.txt","a+");$fwrite(handle01,"%d\n",$signed(InterpdoutiA));$fclose(handle01);
|
||||
// handle02=$fopen("InterpdoutqA.txt","a+");$fwrite(handle02,"%d\n",$signed(InterpdoutqA));$fclose(handle02);
|
||||
// handle03=$fopen("InterpdoutiB.txt","a+");$fwrite(handle03,"%d\n",$signed(InterpdoutiB));$fclose(handle03);
|
||||
// handle04=$fopen("InterpdoutqB.txt","a+");$fwrite(handle04,"%d\n",$signed(InterpdoutqB));$fclose(handle04);
|
||||
// handle05=$fopen("InterpdoutiC.txt","a+");$fwrite(handle05,"%d\n",$signed(InterpdoutiC));$fclose(handle05);
|
||||
// handle06=$fopen("InterpdoutqC.txt","a+");$fwrite(handle06,"%d\n",$signed(InterpdoutqC));$fclose(handle06);
|
||||
// handle07=$fopen("InterpdoutiD.txt","a+");$fwrite(handle07,"%d\n",$signed(InterpdoutiD));$fclose(handle07);
|
||||
// handle08=$fopen("InterpdoutqD.txt","a+");$fwrite(handle08,"%d\n",$signed(InterpdoutqD));$fclose(handle08);
|
||||
|
||||
// end
|
||||
// end
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,624 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2020/01/04 21:09:20
|
||||
// Design Name:
|
||||
// Module Name: data_equalizer
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module data_equalizer(
|
||||
input clk,
|
||||
input rst,
|
||||
input EQUenable_vio,
|
||||
|
||||
input nd_pilot2,
|
||||
input flag_ChnEstFFT_done, //信道估计两次fft输入完毕后拉高1clk(Chn_Estimate给出)
|
||||
|
||||
//数据的fifo,4个
|
||||
input [9:0] dout_data1i,
|
||||
input [9:0] dout_data1q,
|
||||
output reg rd_en_data1 = 1'd0,
|
||||
input [9:0] dout_data2i,
|
||||
input [9:0] dout_data2q,
|
||||
output reg rd_en_data2 = 1'd0,
|
||||
input flag_dataow, //拉高1clk,说明一段数据ow存储完毕,后端可开始连续读取
|
||||
|
||||
//fft核
|
||||
input [25:0] fft_out_i,
|
||||
input [25:0] fft_out_q,
|
||||
input fft_out_nd,
|
||||
input [7:0] fft_index,
|
||||
output reg [16:0] fft_in_i = 17'd0,
|
||||
output reg [16:0] fft_in_q = 17'd0,
|
||||
output reg fft_in_nd = 1'd0,
|
||||
|
||||
//ifft核
|
||||
input [28:0] ifft_out_i,
|
||||
input [28:0] ifft_out_q,
|
||||
input ifft_out_nd,
|
||||
input [7:0] ifft_index,
|
||||
output reg [19:0] ifft_in_i = 20'd0,
|
||||
output reg [19:0] ifft_in_q = 20'd0,
|
||||
output reg ifft_in_nd = 1'd0,
|
||||
|
||||
//MMSE信道估计结果RAM
|
||||
output reg [7:0] addrout_MMSE = 8'd0,
|
||||
input [21:0] dout_MMSE,
|
||||
|
||||
//均衡结果输出
|
||||
output reg nd_SC_FDE_dout = 1'd0,
|
||||
output reg [9:0] SC_FDE_douti = 10'd0,
|
||||
output reg [9:0] SC_FDE_doutq = 10'd0,
|
||||
|
||||
//debug,溢出标志
|
||||
output reg flagoverflow_ifftindata_28to20i = 1'd0, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output reg flagoverflow_ifftindata_28to20q = 1'd0, //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
|
||||
output reg flagoverflow_fftdata_26to16i = 1'd0, //数据段ow的fft输出截位,26截到16
|
||||
output reg flagoverflow_fftdata_26to16q = 1'd0, //数据段ow的fft输出截位,26截到16
|
||||
output reg flagoverflow_FDE_dataout_29to10i = 1'd0, //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
output reg flagoverflow_FDE_dataout_29to10q = 1'd0 //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------fft的输入控制状态机---------------------------------------------------------//
|
||||
reg [3:0] state_fftin = 4'd0;
|
||||
reg [7:0] cnt_256 = 8'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
state_fftin <= 4'd0;
|
||||
cnt_256 <= 8'd0;
|
||||
|
||||
rd_en_data1 <= 1'd0;
|
||||
rd_en_data2 <= 1'd0;
|
||||
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_fftin)
|
||||
//帧间复位结束后,等待nd_pilot2,即导频部分全部到达
|
||||
4'd0:begin
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
if(nd_pilot2) state_fftin <= state_fftin + 4'd1;
|
||||
else state_fftin <= state_fftin;
|
||||
end
|
||||
|
||||
//等待flag_ChnEstFFT_done,即信道估计的两次fft输入全部完成
|
||||
4'd1:begin
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
if(flag_ChnEstFFT_done) state_fftin <= state_fftin + 4'd1;
|
||||
else state_fftin <= state_fftin;
|
||||
end
|
||||
|
||||
//计数60clk,开始输入第一组data的ow给fft,保证其输出的时候MMSE信道估计结果已全部准备完毕
|
||||
4'd2:begin
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
rd_en_data2 <= 1'd0;
|
||||
if(cnt_256==8'd60) begin
|
||||
rd_en_data1 <= 1'd1;
|
||||
cnt_256 <= 8'd0;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
else begin
|
||||
rd_en_data1 <= 1'd0;
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
state_fftin <= state_fftin;
|
||||
end
|
||||
end
|
||||
|
||||
//从rd_en_data1为1的第一个clk开始,输出第0组数据。rd_en_data1保持有效共需256clk,即最后一个clk的数据出到出口时仍需一个读nd(用于读空fifo)
|
||||
4'd3:begin
|
||||
rd_en_data2 <= 1'd0;
|
||||
if(cnt_256==8'd254) begin
|
||||
rd_en_data1 <= 1'd1;
|
||||
fft_in_i <= {{7{dout_data1i[9]}},dout_data1i};
|
||||
fft_in_q <= {{7{dout_data1q[9]}},dout_data1q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= 6'd0;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
else begin
|
||||
rd_en_data1 <= 1'd1;
|
||||
fft_in_i <= {{7{dout_data1i[9]}},dout_data1i};
|
||||
fft_in_q <= {{7{dout_data1q[9]}},dout_data1q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= cnt_256 + 6'd1;
|
||||
state_fftin <= state_fftin;
|
||||
end
|
||||
end
|
||||
4'd4:begin
|
||||
rd_en_data2 <= 1'd0;
|
||||
rd_en_data1 <= 1'd0;
|
||||
fft_in_i <= {{7{dout_data1i[9]}},dout_data1i};
|
||||
fft_in_q <= {{7{dout_data1q[9]}},dout_data1q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= 6'd0;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
|
||||
//data1读空,等待flag_dataow,说明下一个256数据段缓存完毕,可以取用
|
||||
4'd5:begin
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
rd_en_data1 <= 1'd0;
|
||||
cnt_256 <= 8'd0;
|
||||
if(flag_dataow) begin
|
||||
rd_en_data2 <= 1'd1;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
else begin
|
||||
rd_en_data2 <= 1'd0;
|
||||
state_fftin <= state_fftin;
|
||||
end
|
||||
end
|
||||
|
||||
//从rd_en_data2为1的第一个clk开始,输出第0组数据。rd_en_data2保持有效共需256clk,即最后一个clk的数据出到出口时仍需一个读nd(用于读空fifo)
|
||||
4'd6:begin
|
||||
rd_en_data1 <= 1'd0;
|
||||
if(cnt_256==8'd254) begin
|
||||
rd_en_data2 <= 1'd1;
|
||||
fft_in_i <= {{7{dout_data2i[9]}},dout_data2i};
|
||||
fft_in_q <= {{7{dout_data2q[9]}},dout_data2q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= 6'd0;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
else begin
|
||||
rd_en_data2 <= 1'd1;
|
||||
fft_in_i <= {{7{dout_data2i[9]}},dout_data2i};
|
||||
fft_in_q <= {{7{dout_data2q[9]}},dout_data2q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= cnt_256 + 6'd1;
|
||||
state_fftin <= state_fftin;
|
||||
end
|
||||
end
|
||||
4'd7:begin
|
||||
rd_en_data2 <= 1'd0;
|
||||
rd_en_data1 <= 1'd0;
|
||||
fft_in_i <= {{7{dout_data2i[9]}},dout_data2i};
|
||||
fft_in_q <= {{7{dout_data2q[9]}},dout_data2q};
|
||||
fft_in_nd <= 1'd1;
|
||||
cnt_256 <= 6'd0;
|
||||
state_fftin <= state_fftin + 4'd1;
|
||||
end
|
||||
|
||||
//data2读空,等待flag_dataow,说明下一个256数据段缓存完毕,可以取用;或等待nd_pilot2,说明本数据段结束,下一数据段的导频缓存完毕
|
||||
4'd8:begin
|
||||
fft_in_i <= 17'd0;
|
||||
fft_in_q <= 17'd0;
|
||||
fft_in_nd <= 1'd0;
|
||||
rd_en_data2 <= 1'd0;
|
||||
cnt_256 <= 8'd0;
|
||||
if(flag_dataow) begin
|
||||
rd_en_data1 <= 1'd1;
|
||||
state_fftin <= 4'd3;
|
||||
end
|
||||
else begin
|
||||
if(nd_pilot2) begin
|
||||
rd_en_data1 <= 1'd0;
|
||||
state_fftin <= 4'd1;
|
||||
end
|
||||
else begin
|
||||
rd_en_data1 <= 1'd0;
|
||||
state_fftin <= state_fftin;
|
||||
end
|
||||
end
|
||||
end
|
||||
default:state_fftin <= 4'd0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------fft的输出控制状态机---------------------------------------------------------//
|
||||
reg [1:0] state_fftout = 2'd0;
|
||||
reg fft_out_nd_d1 = 1'd0;
|
||||
reg [25:0] fft_out_i_d1 = 26'd0;
|
||||
reg [25:0] fft_out_q_d1 = 26'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
state_fftout <= 2'd0;
|
||||
|
||||
fft_out_nd_d1 <= 1'd0;
|
||||
fft_out_i_d1 <= 26'd0;
|
||||
fft_out_q_d1 <= 26'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_fftout)
|
||||
//帧间复位结束后,等待nd_pilot2,即导频部分全部到达
|
||||
2'd0:begin
|
||||
fft_out_nd_d1 <= 1'd0;
|
||||
fft_out_i_d1 <= 26'd0;
|
||||
fft_out_q_d1 <= 26'd0;
|
||||
if(nd_pilot2) state_fftout <= state_fftout + 2'd1;
|
||||
else state_fftout <= state_fftout;
|
||||
end
|
||||
|
||||
//等待flag_ChnEstFFT_done,即信道估计的两次fft输入全部完成
|
||||
2'd1:begin
|
||||
fft_out_nd_d1 <= 1'd0;
|
||||
fft_out_i_d1 <= 26'd0;
|
||||
fft_out_q_d1 <= 26'd0;
|
||||
if(flag_ChnEstFFT_done) state_fftout <= state_fftout + 2'd1;
|
||||
else state_fftout <= state_fftout;
|
||||
end
|
||||
|
||||
//等待第一组fft结果输出完毕。此组结果应为信道估计的第二次fft结果,本模块不取用
|
||||
2'd2:begin
|
||||
fft_out_nd_d1 <= 1'd0;
|
||||
fft_out_i_d1 <= 26'd0;
|
||||
fft_out_q_d1 <= 26'd0;
|
||||
if(fft_index==8'd255) state_fftout <= state_fftout + 2'd1;
|
||||
else state_fftout <= state_fftout;
|
||||
|
||||
end
|
||||
|
||||
//fft_out_nd指示fft结果有效。将fft输出延时1clk。nd_pilot2有效说明下一帧的导频部分输入完毕,转回状态1
|
||||
2'd3:begin
|
||||
fft_out_nd_d1 <= fft_out_nd;
|
||||
fft_out_i_d1 <= fft_out_i;
|
||||
fft_out_q_d1 <= fft_out_q;
|
||||
if(nd_pilot2) state_fftout <= 2'd1;
|
||||
else state_fftout <= state_fftout;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------复数乘法器+输出截位及溢出标志---------------------------------------------------------//
|
||||
reg mulin_nd = 1'd0;
|
||||
reg [15:0] mulin_ai = 16'd0;
|
||||
reg [15:0] mulin_aq = 16'd0;
|
||||
reg [10:0] mulin_bi = 11'd0;
|
||||
reg [10:0] mulin_bq = 11'd0;
|
||||
wire mulout_nd;
|
||||
wire[63:0] mulout_data;
|
||||
|
||||
SC_FDE_commul SC_FDE_commul (
|
||||
.aclk (clk), // input wire aclk
|
||||
.s_axis_a_tvalid (mulin_nd), // input wire s_axis_a_tvalid
|
||||
.s_axis_a_tdata ({mulin_aq,mulin_ai}), // input wire [31 : 0] s_axis_a_tdata
|
||||
.s_axis_b_tvalid (mulin_nd), // input wire s_axis_b_tvalid
|
||||
.s_axis_b_tdata ({5'd0,mulin_bq,5'd0,mulin_bi}), // input wire [31 : 0] s_axis_b_tdata
|
||||
.m_axis_dout_tvalid (mulout_nd), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata (mulout_data) // output wire [63 : 0] m_axis_dout_tdata
|
||||
);
|
||||
|
||||
wire [27:0] mulout_datai;
|
||||
wire [27:0] mulout_dataq;
|
||||
assign mulout_datai = mulout_data[27:0];
|
||||
assign mulout_dataq = mulout_data[59:32];
|
||||
|
||||
|
||||
|
||||
|
||||
reg mulifft_nd = 1'd0;
|
||||
reg [19:0] mulifft_datai = 20'd0;
|
||||
reg [19:0] mulifft_dataq = 20'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
mulifft_nd <= 1'd0;
|
||||
mulifft_datai <= 20'd0;
|
||||
mulifft_dataq <= 20'd0;
|
||||
flagoverflow_ifftindata_28to20i <= 1'd0;
|
||||
flagoverflow_ifftindata_28to20q <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
if(mulout_nd) begin
|
||||
mulifft_nd <= 1'd1;
|
||||
if(mulout_datai[27:19]!=9'd511&&mulout_datai[27:19]!=9'd0) begin
|
||||
flagoverflow_ifftindata_28to20i <= 1'd1;
|
||||
mulifft_datai <= (mulout_datai[27])? 20'b1000_0000_0000_0000_0000 : 20'b0111_1111_1111_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_ifftindata_28to20i <= 1'd0;
|
||||
mulifft_datai <= mulout_datai[19:0];
|
||||
end
|
||||
if(mulout_dataq[27:19]!=9'd511&&mulout_dataq[27:19]!=9'd0) begin
|
||||
flagoverflow_ifftindata_28to20q <= 1'd1;
|
||||
mulifft_dataq <= (mulout_dataq[27])? 20'b1000_0000_0000_0000_0000 : 20'b0111_1111_1111_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_ifftindata_28to20q <= 1'd0;
|
||||
mulifft_dataq <= mulout_dataq[19:0];
|
||||
end
|
||||
end
|
||||
else begin
|
||||
mulifft_nd <= 1'd0;
|
||||
mulifft_datai <= 20'd0;
|
||||
mulifft_dataq <= 20'd0;
|
||||
flagoverflow_ifftindata_28to20i <= 1'd0;
|
||||
flagoverflow_ifftindata_28to20q <= 1'd0;
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------------------复数乘法器输入控制状态机---------------------------------------------------------//
|
||||
reg mulin_nd_d0 = 1'd0;
|
||||
reg [15:0] mulin_i_d0 = 16'd0;
|
||||
reg [15:0] mulin_q_d0 = 16'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
addrout_MMSE <= 8'd0;
|
||||
mulin_nd_d0 <= 1'd0;
|
||||
mulin_i_d0 <= 16'd0;
|
||||
mulin_q_d0 <= 16'd0;
|
||||
flagoverflow_fftdata_26to16i <= 1'd0;
|
||||
flagoverflow_fftdata_26to16q <= 1'd0;
|
||||
|
||||
mulin_nd <= 1'd0;
|
||||
mulin_ai <= 16'd0;
|
||||
mulin_aq <= 16'd0;
|
||||
mulin_bi <= 11'd0;
|
||||
mulin_bq <= 11'd0;
|
||||
end
|
||||
else begin
|
||||
//fft输出再延时1clk,利用这个延时取出mmse信道估计结果。截位到16bit,设置溢出标志
|
||||
if(fft_out_nd_d1) begin
|
||||
addrout_MMSE <= addrout_MMSE + 8'd1;
|
||||
mulin_nd_d0 <= 1'd1;
|
||||
if(fft_out_i_d1[25:15]!=11'd2047&&fft_out_i_d1[25:15]!=11'd0) begin
|
||||
flagoverflow_fftdata_26to16i <= 1'd1;
|
||||
mulin_i_d0 <= (fft_out_i_d1[25])? 16'b1000_0000_0000_0000 : 16'b0111_1111_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_fftdata_26to16i <= 1'd0;
|
||||
mulin_i_d0 <= fft_out_i_d1[15:0];
|
||||
end
|
||||
if(fft_out_q_d1[25:15]!=11'd2047&&fft_out_q_d1[25:15]!=11'd0) begin
|
||||
flagoverflow_fftdata_26to16q <= 1'd1;
|
||||
mulin_q_d0 <= (fft_out_q_d1[25])? 16'b1000_0000_0000_0000 : 16'b0111_1111_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_fftdata_26to16q <= 1'd0;
|
||||
mulin_q_d0 <= fft_out_q_d1[15:0];
|
||||
end
|
||||
end
|
||||
else begin
|
||||
addrout_MMSE <= 8'd0;
|
||||
mulin_nd_d0 <= 1'd0;
|
||||
mulin_i_d0 <= 16'd0;
|
||||
mulin_q_d0 <= 16'd0;
|
||||
flagoverflow_fftdata_26to16i <= 1'd0;
|
||||
flagoverflow_fftdata_26to16q <= 1'd0;
|
||||
end
|
||||
|
||||
if(mulin_nd_d0) begin
|
||||
mulin_nd <= 1'd1;
|
||||
mulin_ai <= mulin_i_d0;
|
||||
mulin_aq <= mulin_q_d0;
|
||||
if(EQUenable_vio) begin
|
||||
mulin_bi <= dout_MMSE[10:0];
|
||||
mulin_bq <= dout_MMSE[21:11];
|
||||
end
|
||||
else begin
|
||||
mulin_bi <= 11'd1;
|
||||
mulin_bq <= 11'd0;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
mulin_nd <= 1'd0;
|
||||
mulin_ai <= 16'd0;
|
||||
mulin_aq <= 16'd0;
|
||||
mulin_bi <= 11'd0;
|
||||
mulin_bq <= 11'd0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------乘法器输出->ifft的输入控制------------------------------------------------------//
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
ifft_in_i <= 20'd0;
|
||||
ifft_in_q <= 20'd0;
|
||||
ifft_in_nd <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
if(mulifft_nd) begin
|
||||
ifft_in_i <= mulifft_datai;
|
||||
ifft_in_q <= mulifft_dataq;
|
||||
ifft_in_nd <= 1'd1;
|
||||
end
|
||||
else begin
|
||||
ifft_in_i <= 20'd0;
|
||||
ifft_in_q <= 20'd0;
|
||||
ifft_in_nd <= 1'd0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------ifft的输出控制+截位+溢出标志设置--------------------------------------------------//
|
||||
reg ifft_out_ce = 1'd0;
|
||||
reg ifft_out_nd_d1 = 1'd0;
|
||||
reg [28:0] ifft_out_i_d1 = 29'd0;
|
||||
reg [28:0] ifft_out_q_d1 = 29'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
ifft_out_ce <= 1'd0;
|
||||
ifft_out_nd_d1 <= 1'd0;
|
||||
ifft_out_i_d1 <= 29'd0;
|
||||
ifft_out_q_d1 <= 29'd0;
|
||||
end
|
||||
else begin
|
||||
if(ifft_out_ce==1'd0) begin
|
||||
if(flag_ChnEstFFT_done) begin
|
||||
ifft_out_ce <= 1'd1;
|
||||
end
|
||||
else begin
|
||||
ifft_out_ce <= 1'd0;
|
||||
end
|
||||
ifft_out_nd_d1 <= 1'd0;
|
||||
ifft_out_i_d1 <= 29'd0;
|
||||
ifft_out_q_d1 <= 29'd0;
|
||||
end
|
||||
else begin
|
||||
if(nd_pilot2) begin
|
||||
ifft_out_ce <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
ifft_out_ce <= 1'd1;
|
||||
end
|
||||
ifft_out_nd_d1 <= ifft_out_nd;
|
||||
ifft_out_i_d1 <= ifft_out_i;
|
||||
ifft_out_q_d1 <= ifft_out_q;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
nd_SC_FDE_dout <= 1'd0;
|
||||
SC_FDE_douti <= 10'd0;
|
||||
SC_FDE_doutq <= 10'd0;
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd0;
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
if(ifft_out_nd_d1) begin
|
||||
nd_SC_FDE_dout <= 1'd1;
|
||||
if(EQUenable_vio) begin //均衡开启,结果保留10bit,低位截掉8+5=13bit
|
||||
if(ifft_out_i_d1[28:22]!=7'd127&&ifft_out_i_d1[28:22]!=7'd0) begin
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd1;
|
||||
SC_FDE_douti <= (ifft_out_i_d1[28])? 10'b100000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd0;
|
||||
SC_FDE_douti <= ifft_out_i_d1[22:13];
|
||||
end
|
||||
if(ifft_out_q_d1[28:22]!=7'd127&&ifft_out_q_d1[28:22]!=7'd0) begin
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd1;
|
||||
SC_FDE_doutq <= (ifft_out_q_d1[28])? 10'b100000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd0;
|
||||
SC_FDE_doutq <= ifft_out_q_d1[22:13];
|
||||
end
|
||||
end
|
||||
else begin //均衡关闭,结果保留10bit,低位截掉8bit(结果应与输入相同)
|
||||
if(ifft_out_i_d1[28:17]!=12'd4095&&ifft_out_i_d1[28:17]!=12'd0) begin
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd1;
|
||||
SC_FDE_douti <= (ifft_out_i_d1[28])? 10'b100000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd0;
|
||||
SC_FDE_douti <= ifft_out_i_d1[17:8];
|
||||
end
|
||||
if(ifft_out_q_d1[28:17]!=12'd4095&&ifft_out_q_d1[28:17]!=12'd0) begin
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd1;
|
||||
SC_FDE_doutq <= (ifft_out_q_d1[28])? 10'b100000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
else begin
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd0;
|
||||
SC_FDE_doutq <= ifft_out_q_d1[17:8];
|
||||
end
|
||||
end
|
||||
end
|
||||
else begin
|
||||
nd_SC_FDE_dout <= 1'd0;
|
||||
SC_FDE_douti <= 10'd0;
|
||||
SC_FDE_doutq <= 10'd0;
|
||||
flagoverflow_FDE_dataout_29to10i <= 1'd0;
|
||||
flagoverflow_FDE_dataout_29to10q <= 1'd0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//------------------------------------------------------仿真文件保存---------------------------------------------------//
|
||||
// integer handle01;
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
// integer handle05;
|
||||
// integer handle06;
|
||||
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
|
||||
// handle01=$fopen("mulin_ai.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("mulin_aq.txt","w"); $fclose(handle02);
|
||||
// handle03=$fopen("mulin_bi.txt","w"); $fclose(handle03);
|
||||
// handle04=$fopen("mulin_bq.txt","w"); $fclose(handle04);
|
||||
// handle05=$fopen("mulout_datai.txt","w"); $fclose(handle05);
|
||||
// handle06=$fopen("mulout_dataq.txt","w"); $fclose(handle06);
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
|
||||
// if(mulin_nd)begin
|
||||
// handle01=$fopen("mulin_ai.txt","a+");$fwrite(handle01,"%d\n",$signed(mulin_ai));$fclose(handle01);
|
||||
// handle02=$fopen("mulin_aq.txt","a+");$fwrite(handle02,"%d\n",$signed(mulin_aq));$fclose(handle02);
|
||||
// handle03=$fopen("mulin_bi.txt","a+");$fwrite(handle03,"%d\n",$signed(mulin_bi));$fclose(handle03);
|
||||
// handle04=$fopen("mulin_bq.txt","a+");$fwrite(handle04,"%d\n",$signed(mulin_bq));$fclose(handle04);
|
||||
// end
|
||||
// if(mulout_nd)begin
|
||||
// handle05=$fopen("mulout_datai.txt","a+");$fwrite(handle05,"%d\n",$signed(mulout_datai));$fclose(handle05);
|
||||
// handle06=$fopen("mulout_dataq.txt","a+");$fwrite(handle06,"%d\n",$signed(mulout_dataq));$fclose(handle06);
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
+542
@@ -0,0 +1,542 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/12/19 16:14:42
|
||||
// Design Name:
|
||||
// Module Name: data_ow
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module data_ow(
|
||||
input clk,
|
||||
input rst,
|
||||
|
||||
input flag_ow_left,
|
||||
input nd,
|
||||
input [9:0] dini,
|
||||
input [9:0] dinq,
|
||||
|
||||
//数据的fifo,4个
|
||||
output reg [9:0] din_data1i = 10'd0,
|
||||
output reg [9:0] din_data1q = 10'd0,
|
||||
output reg wr_en_data1 = 1'd0,
|
||||
output reg [9:0] din_data2i = 10'd0,
|
||||
output reg [9:0] din_data2q = 10'd0,
|
||||
output reg wr_en_data2 = 1'd0,
|
||||
output reg flag_dataow = 1'd0, //拉高1clk,说明一段数据ow存储完毕,后端可开始连续读取
|
||||
|
||||
//正负导频段的加减结果
|
||||
output reg nd_pilot2 = 1'd0,
|
||||
output reg [9:0] pilot_datai = 10'd0,
|
||||
output reg [9:0] pilot_dataq = 10'd0,
|
||||
output reg [9:0] pilot_noisei = 10'd0,
|
||||
output reg [9:0] pilot_noiseq = 10'd0
|
||||
);
|
||||
|
||||
//导频的fifo,4个
|
||||
reg [9:0] din_pilot1i = 10'd0;
|
||||
reg wr_en_pilot1 = 1'd0;
|
||||
reg rd_en_pilot = 1'd0;
|
||||
wire [9:0] dout_pilot1i;
|
||||
wire full_pilot1i;
|
||||
wire empty_pilot1i;
|
||||
fifo_ow256 fifo_pilot_ow1i (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_pilot1i), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_pilot1), // input wire wr_en
|
||||
.rd_en (rd_en_pilot), // input wire rd_en
|
||||
.dout (dout_pilot1i), // output wire [9 : 0] dout
|
||||
.full (full_pilot1i), // output wire full
|
||||
.empty (empty_pilot1i) // output wire empty
|
||||
);
|
||||
|
||||
reg [9:0] din_pilot1q = 10'd0;
|
||||
// reg wr_en_pilot1q = 1'd0;
|
||||
// reg rd_en_pilot1q = 1'd0;
|
||||
wire [9:0] dout_pilot1q;
|
||||
wire full_pilot1q;
|
||||
wire empty_pilot1q;
|
||||
fifo_ow256 fifo_pilot_ow1q (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_pilot1q), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_pilot1), // input wire wr_en
|
||||
.rd_en (rd_en_pilot), // input wire rd_en
|
||||
.dout (dout_pilot1q), // output wire [9 : 0] dout
|
||||
.full (full_pilot1q), // output wire full
|
||||
.empty (empty_pilot1q) // output wire empty
|
||||
);
|
||||
|
||||
reg [9:0] din_pilot2i = 10'd0;
|
||||
reg wr_en_pilot2 = 1'd0;
|
||||
// reg rd_en_pilot2 = 1'd0;
|
||||
wire [9:0] dout_pilot2i;
|
||||
wire full_pilot2i;
|
||||
wire empty_pilot2i;
|
||||
fifo_ow256 fifo_pilot_ow2i (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_pilot2i), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_pilot2), // input wire wr_en
|
||||
.rd_en (rd_en_pilot), // input wire rd_en
|
||||
.dout (dout_pilot2i), // output wire [9 : 0] dout
|
||||
.full (full_pilot2i), // output wire full
|
||||
.empty (empty_pilot2i) // output wire empty
|
||||
);
|
||||
|
||||
reg [9:0] din_pilot2q = 10'd0;
|
||||
// reg wr_en_pilot2q = 1'd0;
|
||||
// reg rd_en_pilot2q = 1'd0;
|
||||
wire [9:0] dout_pilot2q;
|
||||
wire full_pilot2q;
|
||||
wire empty_pilot2q;
|
||||
fifo_ow256 fifo_pilot_ow2q (
|
||||
.rst (rst), // input wire rst
|
||||
.wr_clk (clk), // input wire wr_clk
|
||||
.rd_clk (clk), // input wire rd_clk
|
||||
.din (din_pilot2q), // input wire [9 : 0] din
|
||||
.wr_en (wr_en_pilot2), // input wire wr_en
|
||||
.rd_en (rd_en_pilot), // input wire rd_en
|
||||
.dout (dout_pilot2q), // output wire [9 : 0] dout
|
||||
.full (full_pilot2q), // output wire full
|
||||
.empty (empty_pilot2q) // output wire empty
|
||||
);
|
||||
|
||||
|
||||
reg [4:0] state_ow = 5'd0;
|
||||
reg [7:0] cnt_256 = 8'd0;
|
||||
reg [0:0] flag_pilot = 1'd0;
|
||||
reg [3:0] cnt_10data = 1'd0;
|
||||
reg [5:0] cnt_42block = 6'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
state_ow <= 5'd0;
|
||||
cnt_256 <= 8'd0;
|
||||
flag_pilot <= 1'd0;
|
||||
flag_dataow <= 1'd0;
|
||||
cnt_10data <= 4'd0;
|
||||
cnt_42block <= 6'd0;
|
||||
|
||||
din_pilot1i <= 10'd0;
|
||||
din_pilot1q <= 10'd0;
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
din_pilot2i <= 10'd0;
|
||||
din_pilot2q <= 10'd0;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
din_data1i <= 10'd0;
|
||||
din_data1q <= 10'd0;
|
||||
wr_en_data1 <= 1'd0;
|
||||
din_data2i <= 10'd0;
|
||||
din_data2q <= 10'd0;
|
||||
wr_en_data2 <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_ow)
|
||||
//等待帧同步指示。flag_ow_left与正导频段OW的左边界对齐。(要求flag_ow_left为高时nd也需有效)
|
||||
5'd0:begin
|
||||
if(flag_ow_left) begin
|
||||
din_pilot1i <= dini;
|
||||
din_pilot1q <= dinq;
|
||||
wr_en_pilot1 <= 1'd1;
|
||||
din_pilot2i <= din_pilot2i;
|
||||
din_pilot2q <= din_pilot2q;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
state_ow <= state_ow + 5'd1;
|
||||
end
|
||||
else begin
|
||||
din_pilot1i <= din_pilot1i;
|
||||
din_pilot1q <= din_pilot1q;
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
din_pilot2i <= din_pilot2i;
|
||||
din_pilot2q <= din_pilot2q;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
cnt_256 <= 8'd0;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
din_data1i <= din_data1i;
|
||||
din_data1q <= din_data1q;
|
||||
wr_en_data1 <= 1'd0;
|
||||
din_data2i <= din_data2i;
|
||||
din_data2q <= din_data2q;
|
||||
wr_en_data2 <= 1'd0;
|
||||
flag_pilot <= 1'd0;
|
||||
cnt_10data <= 4'd0;
|
||||
cnt_42block <= 6'd0;
|
||||
end
|
||||
|
||||
//等待正导频头全部存储完毕,256个nd
|
||||
5'd1:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd255) state_ow <= state_ow + 5'd1;
|
||||
else state_ow <= state_ow;
|
||||
din_pilot1i <= dini;
|
||||
din_pilot1q <= dinq;
|
||||
wr_en_pilot1 <= 1'd1;
|
||||
din_pilot2i <= din_pilot2i;
|
||||
din_pilot2q <= din_pilot2q;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
end
|
||||
else begin
|
||||
din_pilot1i <= din_pilot1i;
|
||||
din_pilot1q <= din_pilot1q;
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
din_pilot2i <= din_pilot2i;
|
||||
din_pilot2q <= din_pilot2q;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
flag_pilot <= 1'd0;
|
||||
cnt_10data <= 4'd0;
|
||||
cnt_42block <= cnt_42block;
|
||||
end
|
||||
|
||||
//计数数过32cp间隔
|
||||
5'd2:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd31) begin
|
||||
cnt_256 <= 8'd0;
|
||||
state_ow <= state_ow + 5'd1;
|
||||
end
|
||||
else begin
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
wr_en_data1 <= 1'd0;
|
||||
wr_en_data2 <= 1'd0;
|
||||
end
|
||||
|
||||
//存储第二段导频头(负导频头),长度256。导频缓存全部结束,给出flag_pilot,指示另一状态机:信道估计可以开始
|
||||
5'd3:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd255) begin
|
||||
flag_pilot <= 1'd1;
|
||||
state_ow <= state_ow + 5'd1;
|
||||
end
|
||||
else begin
|
||||
flag_pilot <= 1'd0;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
din_pilot1i <= din_pilot1i;
|
||||
din_pilot1q <= din_pilot1q;
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
din_pilot2i <= dini;
|
||||
din_pilot2q <= dinq;
|
||||
wr_en_pilot2 <= 1'd1;
|
||||
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
end
|
||||
else begin
|
||||
din_pilot1i <= din_pilot1i;
|
||||
din_pilot1q <= din_pilot1q;
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
din_pilot2i <= din_pilot2i;
|
||||
din_pilot2q <= din_pilot2q;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
|
||||
flag_pilot <= 1'd0;
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
end
|
||||
|
||||
//计数数过32cp间隔
|
||||
5'd4:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd31) begin
|
||||
cnt_10data <= cnt_10data + 4'd1; //cnt_10data代表接下来要存储的数据段为第几段(从1到10计数)
|
||||
cnt_256 <= 8'd0;
|
||||
state_ow <= state_ow + 5'd1;
|
||||
end
|
||||
else begin
|
||||
cnt_10data <= cnt_10data;
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
cnt_10data <= cnt_10data;
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
wr_en_data1 <= 1'd0;
|
||||
wr_en_data2 <= 1'd0;
|
||||
flag_pilot <= 1'd0;
|
||||
flag_dataow <= 1'd0;
|
||||
end
|
||||
|
||||
//存储数据段,长度256
|
||||
5'd5:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd255) state_ow <= state_ow + 5'd1;
|
||||
else state_ow <= state_ow;
|
||||
if(cnt_10data[0]==1'd1) begin
|
||||
din_data1i <= dini;
|
||||
din_data1q <= dinq;
|
||||
wr_en_data1 <= 1'd1;
|
||||
din_data2i <= din_data2i;
|
||||
din_data2q <= din_data2q;
|
||||
wr_en_data2 <= 1'd0;
|
||||
end
|
||||
else begin
|
||||
din_data1i <= din_data1i;
|
||||
din_data1q <= din_data1q;
|
||||
wr_en_data1 <= 1'd0;
|
||||
din_data2i <= dini;
|
||||
din_data2q <= dinq;
|
||||
wr_en_data2 <= 1'd1;
|
||||
end
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
end
|
||||
else begin
|
||||
din_data1i <= din_data1i;
|
||||
din_data1q <= din_data1q;
|
||||
wr_en_data1 <= 1'd0;
|
||||
din_data2i <= din_data2i;
|
||||
din_data2q <= din_data2q;
|
||||
wr_en_data2 <= 1'd0;
|
||||
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
end
|
||||
|
||||
//数据段最后一个nd的下一clk,此刻一定没有nd。利用这一时钟判断是否为数据段内最后一段256数据
|
||||
//同时利用这一时段给出flag_dataow,标志一段数据段ow存储完毕,后端可开始连续读取
|
||||
5'd6:begin
|
||||
if(cnt_10data==4'd10) begin //第10个256,当前数据段结束
|
||||
if(cnt_42block==6'd41) begin //42个数据段,当前帧结束,转至末尾状态31等待帧间复位即可
|
||||
cnt_42block <= 6'd0;
|
||||
state_ow <= 5'd31;
|
||||
end
|
||||
else begin
|
||||
cnt_42block <= cnt_42block + 6'd1;
|
||||
state_ow <= state_ow + 5'd1;
|
||||
end
|
||||
cnt_10data <= 4'd0;
|
||||
end
|
||||
else begin
|
||||
cnt_10data <= cnt_10data;
|
||||
cnt_42block <= cnt_42block;
|
||||
state_ow <= 5'd4;
|
||||
end
|
||||
wr_en_data1 <= 1'd0;
|
||||
wr_en_data2 <= 1'd0;
|
||||
flag_dataow <= 1'd1;
|
||||
end
|
||||
|
||||
//计数数过32cp间隔,之后来到正导频头缓存状态
|
||||
5'd7:begin
|
||||
if(nd) begin
|
||||
if(cnt_256==8'd31) begin
|
||||
cnt_10data <= cnt_10data; //cnt_10data代表接下来要存储的数据段为第几段(从1到10计数)
|
||||
cnt_256 <= 8'd0;
|
||||
state_ow <= 5'd1;
|
||||
end
|
||||
else begin
|
||||
cnt_10data <= cnt_10data;
|
||||
cnt_256 <= cnt_256 + 8'd1;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
cnt_10data <= cnt_10data;
|
||||
cnt_256 <= cnt_256;
|
||||
state_ow <= state_ow;
|
||||
end
|
||||
wr_en_pilot1 <= 1'd0;
|
||||
wr_en_pilot2 <= 1'd0;
|
||||
wr_en_data1 <= 1'd0;
|
||||
wr_en_data2 <= 1'd0;
|
||||
flag_pilot <= 1'd0;
|
||||
flag_dataow <= 1'd0;
|
||||
end
|
||||
|
||||
//一帧结束,等待复位
|
||||
5'd31:begin
|
||||
state_ow <= 5'd31;
|
||||
flag_pilot <= 1'd0;
|
||||
flag_dataow <= 1'd0;
|
||||
end
|
||||
|
||||
default:state_ow<= 5'd31;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
reg [2:0] state_pilot = 3'd0;
|
||||
reg [7:0] cnt_256pilot = 8'd0;
|
||||
reg [0:0] nd_pilot = 1'd0;
|
||||
reg [10:0] pilot_sumi = 11'd0;
|
||||
reg [10:0] pilot_sumq = 11'd0;
|
||||
reg [10:0] pilot_diffi = 11'd0;
|
||||
reg [10:0] pilot_diffq = 11'd0;
|
||||
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
state_pilot <= 3'd0;
|
||||
cnt_256pilot <= 8'd0;
|
||||
rd_en_pilot <= 1'd0;
|
||||
nd_pilot <= 1'd0;
|
||||
pilot_sumi <= 11'd0;
|
||||
pilot_sumq <= 11'd0;
|
||||
pilot_diffi <= 11'd0;
|
||||
pilot_diffq <= 11'd0;
|
||||
end
|
||||
else begin
|
||||
case(state_pilot)
|
||||
//等待flag_pilot指示。说明两段导频缓存完毕
|
||||
3'd0:begin
|
||||
if(flag_pilot) begin
|
||||
nd_pilot <= 1'd0;
|
||||
rd_en_pilot <= 1'd1;
|
||||
pilot_sumi <= pilot_sumi;
|
||||
pilot_sumq <= pilot_sumq;
|
||||
pilot_diffi <= pilot_diffi;
|
||||
pilot_diffq <= pilot_diffq;
|
||||
cnt_256pilot <= 8'd0;
|
||||
state_pilot <= state_pilot + 3'd1;
|
||||
end
|
||||
else begin
|
||||
nd_pilot <= 1'd0;
|
||||
rd_en_pilot <= 1'd0;
|
||||
pilot_sumi <= pilot_sumi;
|
||||
pilot_sumq <= pilot_sumq;
|
||||
pilot_diffi <= pilot_diffi;
|
||||
pilot_diffq <= pilot_diffq;
|
||||
cnt_256pilot <= 8'd0;
|
||||
state_pilot <= state_pilot;
|
||||
end
|
||||
end
|
||||
|
||||
//从rd_en_pilot为1的第一个clk开始,输出第0组数据。rd_en_pilot保持有效共需256clk,即最后一个clk的数据出到出口时仍需一个读nd(用读空fifo)
|
||||
3'd1:begin
|
||||
if(cnt_256pilot==8'd254) begin
|
||||
nd_pilot <= 1'd1;
|
||||
rd_en_pilot <= 1'd1;
|
||||
pilot_sumi <= {dout_pilot1i[9],dout_pilot1i} + {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_sumq <= {dout_pilot1q[9],dout_pilot1q} + {dout_pilot2q[9],dout_pilot2q};
|
||||
pilot_diffi <= {dout_pilot1i[9],dout_pilot1i} - {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_diffq <= {dout_pilot1q[9],dout_pilot1q} - {dout_pilot2q[9],dout_pilot2q};
|
||||
cnt_256pilot <= 8'd0;
|
||||
state_pilot <= state_pilot + 3'd1;
|
||||
end
|
||||
else begin
|
||||
nd_pilot <= 1'd1;
|
||||
rd_en_pilot <= 1'd1;
|
||||
pilot_sumi <= {dout_pilot1i[9],dout_pilot1i} + {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_sumq <= {dout_pilot1q[9],dout_pilot1q} + {dout_pilot2q[9],dout_pilot2q};
|
||||
pilot_diffi <= {dout_pilot1i[9],dout_pilot1i} - {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_diffq <= {dout_pilot1q[9],dout_pilot1q} - {dout_pilot2q[9],dout_pilot2q};
|
||||
cnt_256pilot <= cnt_256pilot + 8'd1;
|
||||
state_pilot <= state_pilot;
|
||||
end
|
||||
end
|
||||
|
||||
//最后一个数据:第255读完后转回0状态等待下一个数据段的导频。
|
||||
3'd2:begin
|
||||
nd_pilot <= 1'd1;
|
||||
rd_en_pilot <= 1'd0;
|
||||
pilot_sumi <= {dout_pilot1i[9],dout_pilot1i} + {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_sumq <= {dout_pilot1q[9],dout_pilot1q} + {dout_pilot2q[9],dout_pilot2q};
|
||||
pilot_diffi <= {dout_pilot1i[9],dout_pilot1i} - {dout_pilot2i[9],dout_pilot2i};
|
||||
pilot_diffq <= {dout_pilot1q[9],dout_pilot1q} - {dout_pilot2q[9],dout_pilot2q};
|
||||
cnt_256pilot <= 8'd0;
|
||||
state_pilot <= 3'd0;
|
||||
end
|
||||
|
||||
default:state_pilot <= 3'd0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//正负导频段的加减结果
|
||||
always @(posedge clk)begin
|
||||
if(rst)begin
|
||||
nd_pilot2 <= 1'd0;
|
||||
pilot_datai <= 10'd0;
|
||||
pilot_dataq <= 10'd0;
|
||||
pilot_noisei <= 10'd0;
|
||||
pilot_noiseq <= 10'd0;
|
||||
end
|
||||
else begin
|
||||
nd_pilot2 <= nd_pilot;
|
||||
pilot_noisei <= pilot_sumi[10:1];
|
||||
pilot_noiseq <= pilot_sumq[10:1];
|
||||
pilot_datai <= pilot_diffi[10:1];
|
||||
pilot_dataq <= pilot_diffq[10:1];
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------写测试文件---------------------------------------------------------------------//
|
||||
// integer handle01;
|
||||
// integer handle02;
|
||||
// integer handle03;
|
||||
// integer handle04;
|
||||
|
||||
// reg enable1 = 0;
|
||||
// initial begin
|
||||
// handle01=$fopen("din_pilot1i.txt","w"); $fclose(handle01);
|
||||
// handle02=$fopen("din_pilot1q.txt","w"); $fclose(handle02);
|
||||
// handle03=$fopen("din_pilot2i.txt","w"); $fclose(handle03);
|
||||
// handle04=$fopen("din_pilot2q.txt","w"); $fclose(handle04);
|
||||
|
||||
|
||||
// #10;
|
||||
// enable1 = 1;
|
||||
// end
|
||||
|
||||
// always@(posedge clk)begin
|
||||
// if(enable1)begin
|
||||
// if(wr_en_pilot1)begin
|
||||
// handle01=$fopen("din_pilot1i.txt","a+");$fwrite(handle01,"%d\n",$signed(din_pilot1i));$fclose(handle01);
|
||||
// handle02=$fopen("din_pilot1q.txt","a+");$fwrite(handle02,"%d\n",$signed(din_pilot1q));$fclose(handle02);
|
||||
// end
|
||||
// if(wr_en_pilot2)begin
|
||||
// handle03=$fopen("din_pilot2i.txt","a+");$fwrite(handle03,"%d\n",$signed(din_pilot2i));$fclose(handle03);
|
||||
// handle04=$fopen("din_pilot2q.txt","a+");$fwrite(handle04,"%d\n",$signed(din_pilot2q));$fclose(handle04);
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
+643
@@ -0,0 +1,643 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/12/23 17:06:52
|
||||
// Design Name:
|
||||
// Module Name: freqestm
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module freqestm (
|
||||
input clk,
|
||||
input rst,
|
||||
input framesync,
|
||||
input mgc_rdy,
|
||||
input [9:0] datain_i,
|
||||
input [9:0] datain_q,
|
||||
output reg [9:0] dataout_i,
|
||||
output reg [9:0] dataout_q,
|
||||
output reg framesync_delay,
|
||||
output reg data_save,
|
||||
output reg rst_freq
|
||||
);
|
||||
|
||||
wire [19:0] datain_01;
|
||||
wire [19:0] datain_02;
|
||||
wire [19:0] datain_03;
|
||||
wire framesync_d2;
|
||||
wire framesync_d3;
|
||||
|
||||
wire [19:0] dataout_16;
|
||||
|
||||
assign datain_01 = {datain_q, datain_i};
|
||||
|
||||
shiftram_freq shiftram_freq_01 (
|
||||
.CLK(clk),
|
||||
.D (datain_01),
|
||||
.Q (datain_02)
|
||||
);
|
||||
shiftram_freq shiftram_freq_02 (
|
||||
.CLK(clk),
|
||||
.D (datain_02),
|
||||
.Q (datain_03)
|
||||
);
|
||||
wire empty;
|
||||
wire full;
|
||||
reg rd_en;
|
||||
reg wr_en;
|
||||
|
||||
fifo_freq fifo_freq (
|
||||
.clk (clk),
|
||||
.srst (rst),
|
||||
.din (datain_03),
|
||||
.wr_en(wr_en),
|
||||
.full (full),
|
||||
.rd_en(rd_en),
|
||||
.empty(empty),
|
||||
.dout (dataout_16)
|
||||
|
||||
);
|
||||
reg [15:0] cnt_fifo;
|
||||
reg [ 2:0] state_fifo;
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
cnt_fifo <= 16'd0;
|
||||
wr_en <= 1'b0;
|
||||
rd_en <= 1'b0;
|
||||
state_fifo <= 3'd0;
|
||||
end
|
||||
else begin
|
||||
case (state_fifo)
|
||||
3'd0: begin
|
||||
if (mgc_rdy) begin
|
||||
state_fifo <= 3'd1;
|
||||
end
|
||||
else begin
|
||||
state_fifo <= state_fifo;
|
||||
end
|
||||
end
|
||||
3'd1: begin
|
||||
if (cnt_fifo == 16'd2175) begin
|
||||
wr_en <= 1'b1;
|
||||
cnt_fifo <= cnt_fifo + 16'd1;
|
||||
end
|
||||
else if (cnt_fifo == 16'd18065) begin
|
||||
rd_en <= 1'b1;
|
||||
cnt_fifo <= cnt_fifo;
|
||||
end
|
||||
else begin
|
||||
cnt_fifo <= cnt_fifo + 16'd1;
|
||||
wr_en <= wr_en;
|
||||
rd_en <= rd_en;
|
||||
end
|
||||
state_fifo <= state_fifo;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
reg [11:0] cnt_pilot;
|
||||
reg [14:0] cnt_frame;
|
||||
reg [ 7:0] cnt_bag;
|
||||
reg [11:0] cnt_cp;
|
||||
reg [11:0] cnt_process;
|
||||
reg [11:0] addra_pilot01;
|
||||
reg [11:0] addrb_pilot01;
|
||||
reg [11:0] addra_pilot02;
|
||||
reg [11:0] addrb_pilot02;
|
||||
reg [ 4:0] state_freq;
|
||||
|
||||
reg [19:0] din_pilot01;
|
||||
reg [19:0] din_pilot02;
|
||||
wire [19:0] dout_pilot01;
|
||||
wire [19:0] dout_pilot02;
|
||||
|
||||
reg framesync_delay_d1 = 1'b0;
|
||||
reg framesync_delay_d2 = 1'b0;
|
||||
reg framesync_delay_d3 = 1'b0;
|
||||
reg framesync_delay_d4 = 1'b0;
|
||||
reg framesync_delay_d5 = 1'b0;
|
||||
reg framesync_delay_d6 = 1'b0;
|
||||
reg framesync_delay_d7 = 1'b0;
|
||||
reg framesync_delay_d8 = 1'b0;
|
||||
reg framesync_delay_d9 = 1'b0;
|
||||
|
||||
|
||||
reg wea_01;
|
||||
reg wea_02;
|
||||
|
||||
ram_pilot ram_pilota (
|
||||
.clka (clk),
|
||||
.clkb (clk),
|
||||
.addra(addra_pilot01),
|
||||
.addrb(addrb_pilot01),
|
||||
.dina (din_pilot01),
|
||||
.doutb(dout_pilot01),
|
||||
.wea (wea_01)
|
||||
);
|
||||
|
||||
ram_pilot ram_pilotb (
|
||||
.clka (clk),
|
||||
.clkb (clk),
|
||||
.addra(addra_pilot02),
|
||||
.addrb(addrb_pilot02),
|
||||
.dina (din_pilot02),
|
||||
.doutb(dout_pilot02),
|
||||
.wea (wea_02)
|
||||
);
|
||||
|
||||
wire [ 2:0] Multouti01_head;
|
||||
wire [ 2:0] Multoutq01_head;
|
||||
wire [20:0] Multouti01;
|
||||
wire [20:0] Multoutq01;
|
||||
reg acc_rdy;
|
||||
|
||||
com_freq com_freq (
|
||||
.aclk (clk),
|
||||
.s_axis_a_tvalid (1'd1),
|
||||
.s_axis_a_tdata ({6'd0, dout_pilot01[19:10], 6'd0, dout_pilot01[9:0]}),
|
||||
.s_axis_b_tvalid (1'd1),
|
||||
.s_axis_b_tdata ({6'd0, dout_pilot02[19:10], 6'd0, dout_pilot02[9:0]}),
|
||||
.m_axis_dout_tvalid(m_axis_dout_tvalid01),
|
||||
.m_axis_dout_tdata ({Multoutq01_head, Multoutq01, Multouti01_head, Multouti01})
|
||||
);
|
||||
|
||||
|
||||
reg dfreq_word_nd_DDS;
|
||||
reg [31:0] acc_com_i;
|
||||
reg [31:0] acc_com_q;
|
||||
reg [ 9:0] phase_reg;
|
||||
reg [13:0] freq_out;
|
||||
wire [ 9:0] phase_out;
|
||||
wire [ 5:0] phase_out_head;
|
||||
wire phaserdy;
|
||||
reg [ 3:0] cnt_6;
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
//dataout_i <= 12'd0;
|
||||
//dataout_q <= 12'd0;
|
||||
framesync_delay_d2 <= 1'b0;
|
||||
framesync_delay_d3 <= 1'b0;
|
||||
framesync_delay_d4 <= 1'b0;
|
||||
framesync_delay_d5 <= 1'b0;
|
||||
framesync_delay_d6 <= 1'b0;
|
||||
framesync_delay_d7 <= 1'b0;
|
||||
framesync_delay_d8 <= 1'b0;
|
||||
framesync_delay <= 1'b0;
|
||||
state_freq <= 5'd0;
|
||||
framesync_delay_d1 <= 1'b0;
|
||||
cnt_bag <= 8'd0;
|
||||
acc_com_i <= 32'd0;
|
||||
acc_com_q <= 32'd0;
|
||||
phase_reg <= 10'd0;
|
||||
freq_out <= 14'd0;
|
||||
cnt_pilot <= 12'd0;
|
||||
cnt_frame <= 15'd0;
|
||||
cnt_process <= 12'd0;
|
||||
addra_pilot01 <= 12'd0;
|
||||
addra_pilot02 <= 12'd0;
|
||||
addrb_pilot01 <= 12'd0;
|
||||
addrb_pilot02 <= 12'd0;
|
||||
din_pilot01 <= 20'd0;
|
||||
din_pilot02 <= 20'd0;
|
||||
cnt_cp <= 12'd0;
|
||||
wea_01 <= 1'b0;
|
||||
wea_02 <= 1'b0;
|
||||
acc_rdy <= 1'b0;
|
||||
data_save <= 1'b0;
|
||||
dfreq_word_nd_DDS <= 1'b0;
|
||||
cnt_6 <= 4'd0;
|
||||
end
|
||||
else begin
|
||||
framesync_delay_d2 <= data_save;
|
||||
framesync_delay_d3 <= framesync_delay_d2;
|
||||
framesync_delay_d4 <= framesync_delay_d3;
|
||||
framesync_delay_d5 <= framesync_delay_d4;
|
||||
framesync_delay_d6 <= framesync_delay_d5;
|
||||
framesync_delay_d7 <= framesync_delay_d6;
|
||||
framesync_delay_d8 <= framesync_delay_d7;
|
||||
framesync_delay <= framesync_delay_d8;
|
||||
case (state_freq)
|
||||
5'd0: begin
|
||||
if (framesync) begin
|
||||
state_freq <= 5'd1;
|
||||
wea_01 <= 1'b1;
|
||||
if (datain_q == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -datain_q;
|
||||
|
||||
din_pilot01[9:0] <= datain_i[9:0];
|
||||
end
|
||||
else begin
|
||||
state_freq <= 5'd0;
|
||||
end
|
||||
//dataout_i <= 12'd0;
|
||||
//dataout_q <= 12'd0;
|
||||
framesync_delay_d1 <= 1'b0;
|
||||
cnt_bag <= 8'd0;
|
||||
acc_com_i <= 32'd0;
|
||||
acc_com_q <= 32'd0;
|
||||
phase_reg <= 10'd0;
|
||||
freq_out <= 14'd0;
|
||||
cnt_pilot <= 12'd0;
|
||||
cnt_frame <= 15'd0;
|
||||
cnt_process <= 12'd0;
|
||||
addra_pilot01 <= 12'd0;
|
||||
addra_pilot02 <= 12'd0;
|
||||
addrb_pilot01 <= 12'd0;
|
||||
addrb_pilot02 <= 12'd0;
|
||||
din_pilot01 <= 20'd0;
|
||||
din_pilot02 <= 20'd0;
|
||||
cnt_cp <= 12'd0;
|
||||
wea_01 <= 1'b0;
|
||||
wea_02 <= 1'b0;
|
||||
acc_rdy <= 1'b0;
|
||||
dfreq_word_nd_DDS <= 1'b0;
|
||||
end
|
||||
|
||||
5'd1: begin
|
||||
if (cnt_pilot == 12'd1023) begin
|
||||
addra_pilot01 <= addra_pilot01;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 5'd11;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
|
||||
wea_01 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (datain_q == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -datain_q;
|
||||
|
||||
din_pilot01[9:0] <= datain_i[9:0];
|
||||
addra_pilot01 <= addra_pilot01 + 12'd1;
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_01 <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd2: begin
|
||||
if (cnt_frame == 15'd13823) begin
|
||||
state_freq <= 5'd3;
|
||||
cnt_frame <= 15'd0;
|
||||
wea_02 <= 1'b1;
|
||||
din_pilot02 <= {datain_q, datain_i};
|
||||
end
|
||||
else begin
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd3: begin
|
||||
if (cnt_pilot == 12'd1023) begin
|
||||
addra_pilot02 <= addra_pilot02;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 5'd13;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag + 8'd1;
|
||||
wea_02 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
din_pilot02 <= {datain_q, datain_i};
|
||||
addra_pilot02 <= addra_pilot02 + 12'd1;
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_02 <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd4: begin
|
||||
state_freq <= 5'd5;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
acc_com_i <= 32'd0;
|
||||
acc_com_q <= 32'd0;
|
||||
end
|
||||
|
||||
5'd5: begin
|
||||
if (cnt_6 == 4'd6) begin
|
||||
if (Multouti01[20] == 1'b1) acc_com_i <= acc_com_i + {11'b11111111111, Multouti01};
|
||||
else acc_com_i <= acc_com_i + {11'b00000000000, Multouti01};
|
||||
if (Multoutq01[20] == 1'b1) acc_com_q <= acc_com_q + {11'b11111111111, Multoutq01};
|
||||
else acc_com_q <= acc_com_q + {11'b00000000000, Multoutq01};
|
||||
cnt_6 <= cnt_6;
|
||||
end
|
||||
else begin
|
||||
acc_com_q <= acc_com_q;
|
||||
acc_com_i <= acc_com_i;
|
||||
cnt_6 <= cnt_6 + 4'd1;
|
||||
end
|
||||
if (cnt_pilot >= 12'd2047) begin
|
||||
addrb_pilot01 <= 12'd0;
|
||||
addrb_pilot02 <= 12'd0;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
if (cnt_pilot == 12'd2053) begin
|
||||
acc_rdy <= 1'b1;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 5'd6;
|
||||
cnt_6 <= 4'd0;
|
||||
end
|
||||
else begin
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
addrb_pilot01 <= addrb_pilot01 + 12'd1;
|
||||
addrb_pilot02 <= addrb_pilot02 + 12'd1;
|
||||
acc_rdy <= 1'b0;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd6: begin
|
||||
acc_rdy <= 1'b0;
|
||||
if (phaserdy) begin
|
||||
phase_reg <= phase_out;
|
||||
state_freq <= 5'd7;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
wea_01 <= 1'b1;
|
||||
|
||||
if (dout_pilot02[19:10] == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -dout_pilot02[19:10];
|
||||
din_pilot01[9:0] <= dout_pilot02[9:0];
|
||||
|
||||
addrb_pilot02 <= addrb_pilot02 + 12'd1;
|
||||
end
|
||||
else begin
|
||||
phase_reg <= phase_reg;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd7: begin
|
||||
state_freq <= 5'd8;
|
||||
data_save <= 1'b1;
|
||||
|
||||
if (phase_reg[9] == 1'b1) freq_out <= {3'b111, phase_reg, 1'b0} + {4'b1111, phase_reg};
|
||||
else freq_out <= {3'b000, phase_reg, 1'b0} + {4'b0000, phase_reg};
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
dfreq_word_nd_DDS <= 1'b1;
|
||||
if (cnt_bag == 8'd1) framesync_delay_d1 <= 1'b1;
|
||||
else framesync_delay_d1 <= 1'b0;
|
||||
|
||||
wea_01 <= 1'b1;
|
||||
|
||||
if (dout_pilot02[19:10] == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -dout_pilot02[19:10];
|
||||
din_pilot01[9:0] <= dout_pilot02[9:0];
|
||||
|
||||
addrb_pilot02 <= addrb_pilot02 + 12'd1;
|
||||
end
|
||||
|
||||
5'd8: begin
|
||||
dfreq_word_nd_DDS <= 1'b0;
|
||||
framesync_delay_d1 <= 1'b0;
|
||||
if (cnt_pilot >= 12'd2045) begin
|
||||
|
||||
addrb_pilot02 <= 12'd0;
|
||||
if (cnt_pilot == 12'd2047) begin
|
||||
addra_pilot01 <= 12'd0;
|
||||
addrb_pilot02 <= 12'd0;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 5'd9;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
wea_01 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (dout_pilot02[19:10] == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -dout_pilot02[19:10];
|
||||
din_pilot01[9:0] <= dout_pilot02[9:0];
|
||||
|
||||
addra_pilot01 <= addra_pilot01 + 12'd1;
|
||||
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
wea_01 <= 1'b1;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
if (dout_pilot02[19:10] == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -dout_pilot02[19:10];
|
||||
din_pilot01[9:0] <= dout_pilot02[9:0];
|
||||
|
||||
addra_pilot01 <= addra_pilot01 + 12'd1;
|
||||
addrb_pilot02 <= addrb_pilot02 + 12'd1;
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
wea_01 <= 1'b1;
|
||||
end
|
||||
end
|
||||
5'd9: begin
|
||||
if (cnt_frame == 15'd13823) begin
|
||||
|
||||
if (cnt_bag == 8'd40) begin
|
||||
state_freq <= 5'd10;
|
||||
cnt_bag <= cnt_bag + 8'd1;
|
||||
end
|
||||
else begin
|
||||
state_freq <= 5'd3;
|
||||
wea_02 <= 1'b1;
|
||||
din_pilot02 <= {datain_q, datain_i};
|
||||
|
||||
end
|
||||
|
||||
cnt_frame <= 15'd0;
|
||||
end
|
||||
else begin
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd10: begin
|
||||
if (cnt_frame == 15'd13695) begin
|
||||
cnt_frame <= 15'd0;
|
||||
state_freq <= 5'd0;
|
||||
end
|
||||
else begin
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
5'd11: begin
|
||||
if (cnt_cp == 12'd127) begin
|
||||
state_freq <= 5'd12;
|
||||
cnt_cp <= 12'd0;
|
||||
wea_01 <= 1'b1;
|
||||
addra_pilot01 <= addra_pilot01 + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
if (datain_q == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -datain_q;
|
||||
|
||||
din_pilot01[9:0] <= datain_i[9:0];
|
||||
end
|
||||
else begin
|
||||
cnt_cp <= cnt_cp + 12'd1;
|
||||
state_freq <= state_freq;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
5'd12: begin
|
||||
if (cnt_pilot == 12'd1023) begin
|
||||
addra_pilot01 <= 12'd0;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 12'd2;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_01 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (datain_q == 10'd512) din_pilot01[19:10] <= 10'd511;
|
||||
else din_pilot01[19:10] <= -datain_q;
|
||||
|
||||
din_pilot01[9:0] <= datain_i[9:0];
|
||||
addra_pilot01 <= addra_pilot01 + 12'd1;
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_01 <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
5'd13: begin
|
||||
if (cnt_cp == 12'd127) begin
|
||||
state_freq <= 5'd14;
|
||||
cnt_cp <= 12'd0;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
din_pilot02 <= {datain_q, datain_i};
|
||||
addra_pilot02 <= addra_pilot02 + 12'd1;
|
||||
wea_02 <= 1'b1;
|
||||
end
|
||||
else begin
|
||||
cnt_cp <= cnt_cp + 12'd1;
|
||||
state_freq <= state_freq;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
5'd14: begin
|
||||
if (cnt_pilot == 12'd1023) begin
|
||||
addra_pilot02 <= 12'd0;
|
||||
cnt_pilot <= 12'd0;
|
||||
state_freq <= 5'd4;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_02 <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
din_pilot02 <= {datain_q, datain_i};
|
||||
addra_pilot02 <= addra_pilot02 + 12'd1;
|
||||
cnt_pilot <= cnt_pilot + 12'd1;
|
||||
cnt_frame <= cnt_frame + 15'd1;
|
||||
cnt_bag <= cnt_bag;
|
||||
wea_02 <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endcase
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
atan2_freq atan2_freq (
|
||||
.aclk (clk), // input wire aclk
|
||||
.s_axis_cartesian_tvalid(acc_rdy), // input wire s_axis_cartesian_tvalid
|
||||
.s_axis_cartesian_tdata ({acc_com_q, acc_com_i}), // input wire [47 : 0] s_axis_cartesian_tdata
|
||||
.m_axis_dout_tvalid (phaserdy), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata ({phase_out_head, phase_out}) // output wire [15 : 0] m_axis_dout_tdata
|
||||
);
|
||||
|
||||
wire [11:0] DDS_trunc_i;
|
||||
wire [11:0] DDS_trunc_q;
|
||||
wire DDS_trunc_nd;
|
||||
wire Demod_ovrflw;
|
||||
|
||||
|
||||
|
||||
reg [11:0] DDSin_i;
|
||||
reg [11:0] DDSin_q;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (dataout_16[19] == 1'b1) DDSin_q <= {2'b11, dataout_16[19:10]};
|
||||
else DDSin_q <= {2'b00, dataout_16[19:10]};
|
||||
if (dataout_16[9] == 1'b1) DDSin_i <= {2'b11, dataout_16[9:0]};
|
||||
else DDSin_i <= {2'b00, dataout_16[9:0]};
|
||||
end
|
||||
|
||||
|
||||
DDS_compensate DDS_compensate_mx (
|
||||
.clk (clk),
|
||||
.rst (rst), //捕获模块复位受到发端影响,测试捕获情冿
|
||||
.din_nd (1'd1),
|
||||
.din_i (DDSin_i),
|
||||
.din_q (DDSin_q),
|
||||
.acq_nd (1'b0), // 捕获信息 //捕获到了复位丿欿
|
||||
.dfreq_word_nd (dfreq_word_nd_DDS), // 频偏NCO信息
|
||||
.dfreq_word (freq_out),
|
||||
.framesync_success(framesync), // 帧同步标志,用于切码
|
||||
.demod_trunc_i (DDS_trunc_i),
|
||||
.demod_trunc_q (DDS_trunc_q),
|
||||
.demod_trunc_nd (DDS_trunc_nd),
|
||||
.Demod_ovrflw (Demod_ovrflw)
|
||||
);
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (DDS_trunc_i[11:9] == 3'b000 || DDS_trunc_i[11:9] == 3'b111) begin
|
||||
dataout_i <= DDS_trunc_i[9:0];
|
||||
end
|
||||
else begin
|
||||
dataout_i <= (DDS_trunc_i[11] == 1'b1) ? 10'b10_0000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
if (DDS_trunc_q[11:9] == 3'b000 || DDS_trunc_q[11:9] == 3'b111) begin
|
||||
dataout_q <= DDS_trunc_q[9:0];
|
||||
end
|
||||
else begin
|
||||
dataout_q <= (DDS_trunc_q[11] == 1'b1) ? 10'b10_0000_0000 : 10'b01_1111_1111;
|
||||
end
|
||||
end
|
||||
|
||||
reg [19:0] cnt_rst = 20'd0;
|
||||
always @(posedge clk) begin
|
||||
if (framesync_delay_d8 && !framesync_delay) begin
|
||||
cnt_rst <= 20'd0;
|
||||
rst_freq <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (cnt_rst == 20'd580620) begin
|
||||
rst_freq <= 1'b1;
|
||||
cnt_rst <= cnt_rst + 20'd1;
|
||||
end
|
||||
else if (cnt_rst == 20'd580621) begin
|
||||
rst_freq <= 1'b0;
|
||||
cnt_rst <= cnt_rst;
|
||||
end
|
||||
else begin
|
||||
cnt_rst <= cnt_rst + 20'd1;
|
||||
rst_freq <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,261 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2020/12/14 14:44:05
|
||||
// Design Name:
|
||||
// Module Name: phase_adjust
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module phase_adjust(
|
||||
input clk,
|
||||
input rst,
|
||||
input [9:0] din_i,
|
||||
input [9:0] din_q,
|
||||
input nd,
|
||||
input framesync,
|
||||
output reg rdy,
|
||||
output [9:0] dout_i,
|
||||
output [9:0] dout_q
|
||||
);
|
||||
|
||||
|
||||
reg [7:0] addra = 8'd0;
|
||||
reg [19:0] dina = 20'd0;
|
||||
reg [7:0] addrb = 8'd0;
|
||||
wire [19:0] doutb;
|
||||
RAM_phase RAM_phase (
|
||||
.clka(clk), // input clka
|
||||
.wea(1'b1), // input [0 : 0] wea
|
||||
.addra(addra), // input [9 : 0] addra
|
||||
.dina(dina), // input [15 : 0] dina
|
||||
.clkb(clk), // input clkb
|
||||
.addrb(addrb), // input [10 : 0] addrb
|
||||
.doutb(doutb) // output [7 : 0] doutb
|
||||
);
|
||||
|
||||
|
||||
wire [10:0] squarei;
|
||||
wire [10:0] squareq;
|
||||
wire [47:0] m_axis_dout_tdata;
|
||||
wire m_axis_dout_tvalid;
|
||||
CompMultIP CompMultIP1 (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_a_tvalid(nd), // input wire s_axis_a_tvalid
|
||||
.s_axis_a_tdata({6'd0,din_q,6'd0,din_i}), // input wire [31 : 0] s_axis_a_tdata
|
||||
.s_axis_b_tvalid(nd), // input wire s_axis_b_tvalid
|
||||
.s_axis_b_tdata({6'd0,din_q,6'd0,din_i}), // input wire [31 : 0] s_axis_b_tdata
|
||||
.m_axis_dout_tvalid(m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata(m_axis_dout_tdata) // output wire [47 : 0] m_axis_dout_tdata
|
||||
);
|
||||
assign squareq = m_axis_dout_tdata[40:30];
|
||||
assign squarei = m_axis_dout_tdata[16:6];
|
||||
|
||||
wire [11:0] square2i;
|
||||
wire [11:0] square2q;
|
||||
wire [47:0] m_axis_dout_tdata2;
|
||||
wire m_axis_dout_tvalid2;
|
||||
CompMultIP2 CompMultIP2 (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_a_tvalid(m_axis_dout_tvalid), // input wire s_axis_a_tvalid
|
||||
.s_axis_a_tdata({5'd0,squareq,5'd0,squarei}), // input wire [31 : 0] s_axis_a_tdata
|
||||
.s_axis_b_tvalid(m_axis_dout_tvalid), // input wire s_axis_b_tvalid
|
||||
.s_axis_b_tdata({5'd0,squareq,5'd0,squarei}), // input wire [31 : 0] s_axis_b_tdata
|
||||
.m_axis_dout_tvalid(m_axis_dout_tvalid2), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata(m_axis_dout_tdata2) // output wire [47 : 0] m_axis_dout_tdata
|
||||
);
|
||||
assign square2q = m_axis_dout_tdata2[41:30];
|
||||
assign square2i = m_axis_dout_tdata2[17:6];
|
||||
|
||||
|
||||
reg [19:0] sum256i = 20'd0;
|
||||
reg [19:0] sum256q = 20'd0;
|
||||
reg [9:0] addradelay = 10'd0;
|
||||
reg [3:0] state_phase;
|
||||
reg [9:0] cnt_phase;
|
||||
reg sum_rdy;
|
||||
reg rotate_nd;
|
||||
reg [9:0] phase_estm;
|
||||
reg [9:0] phase_shengyu;
|
||||
reg [9:0] phase_final;
|
||||
reg [9:0] phase_pi = 10'b0110010010;
|
||||
|
||||
|
||||
wire [9:0] phase_out;
|
||||
wire [5:0] phase_out_head;
|
||||
wire phaserdy;
|
||||
atan2_phase atan2_phase (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_cartesian_tvalid(sum_rdy), // input wire s_axis_cartesian_tvalid
|
||||
.s_axis_cartesian_tdata({4'd0,sum256q,4'd0,sum256i}), // input wire [47 : 0] s_axis_cartesian_tdata
|
||||
.m_axis_dout_tvalid(phaserdy), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata({phase_out_head,phase_out}) // output wire [15 : 0] m_axis_dout_tdata
|
||||
);
|
||||
|
||||
wire [5:0] rotate_headq;
|
||||
wire [5:0] rotate_headi;
|
||||
wire rotate_rdy;
|
||||
|
||||
|
||||
atan2_rotate atan2_rotate (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_cartesian_tvalid(rotate_nd), // input wire s_axis_cartesian_tvalid
|
||||
.s_axis_cartesian_tdata({6'd0,doutb[19:10],6'd0,doutb[9:0]}), // input wire [47 : 0] s_axis_cartesian_tdata
|
||||
.s_axis_phase_tvalid(rotate_nd), // input wire s_axis_cartesian_tvalid
|
||||
.s_axis_phase_tdata({6'd0,phase_final[9],phase_final[9],phase_final[9:2]}), // input wire [47 : 0] s_axis_cartesian_tdata
|
||||
.m_axis_dout_tvalid(rotate_rdy), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata({rotate_headq,dout_q,rotate_headi,dout_i}) // output wire [15 : 0] m_axis_dout_tdata
|
||||
);
|
||||
|
||||
always @ (posedge clk) begin
|
||||
if(rst) begin
|
||||
state_phase <= 4'd0;
|
||||
addradelay <= 10'd0;
|
||||
sum256i <= 20'd0;
|
||||
sum256q <= 20'd0;
|
||||
cnt_phase <= 10'd0;
|
||||
sum_rdy <= 1'b0;
|
||||
phase_estm <= 10'd0;
|
||||
phase_shengyu <= 10'd0;
|
||||
phase_final <= 10'd0;
|
||||
rotate_nd <= 1'b0;
|
||||
rdy <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
rdy <= rotate_rdy;
|
||||
case(state_phase)
|
||||
4'd0:begin
|
||||
if(framesync) begin
|
||||
state_phase <= 4'd1;
|
||||
end
|
||||
else begin
|
||||
state_phase <= 4'd0;
|
||||
end
|
||||
end
|
||||
4'd1:begin
|
||||
if(nd)begin
|
||||
addradelay <= addradelay + 10'd1;
|
||||
dina <= {din_q,din_i};
|
||||
addra <= addradelay[7:0];
|
||||
if(addradelay==10'd255) begin
|
||||
state_phase <= 4'd2;
|
||||
addradelay <= 10'd0;
|
||||
end
|
||||
else begin
|
||||
state_phase <= 4'd1;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
state_phase <= 4'd1;
|
||||
addradelay <= addradelay;
|
||||
addra <= addra;
|
||||
dina <= dina;
|
||||
state_phase <= 2'd1;
|
||||
end
|
||||
|
||||
|
||||
if(m_axis_dout_tvalid2)begin
|
||||
cnt_phase <= cnt_phase + 10'd1;
|
||||
sum256i <= sum256i + {square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i};
|
||||
sum256q <= sum256q + {square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q};
|
||||
end
|
||||
else begin
|
||||
cnt_phase <= cnt_phase;
|
||||
sum256i <= sum256i;
|
||||
sum256q <= sum256q;
|
||||
end
|
||||
end
|
||||
4'd2:begin
|
||||
if(m_axis_dout_tvalid2)begin
|
||||
if(cnt_phase==10'd255)begin
|
||||
cnt_phase <= 10'd0;
|
||||
state_phase <= 4'd3;
|
||||
sum_rdy <= 1'b1;
|
||||
end
|
||||
else begin
|
||||
cnt_phase <= cnt_phase + 10'd1;
|
||||
sum_rdy <= 1'b0;
|
||||
state_phase <= 4'd2;
|
||||
end
|
||||
sum256i <= sum256i + {square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i[11],square2i};
|
||||
sum256q <= sum256q + {square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q[11],square2q};
|
||||
end
|
||||
else begin
|
||||
cnt_phase <= cnt_phase;
|
||||
state_phase <= 4'd2;
|
||||
sum256i <= sum256i;
|
||||
sum256q <= sum256q;
|
||||
end
|
||||
end
|
||||
4'd3:begin
|
||||
sum_rdy <= 1'b0;
|
||||
if(phaserdy) begin
|
||||
sum256i <= 20'd0;
|
||||
sum256q <= 20'd0;
|
||||
phase_estm <= phase_out;
|
||||
if(phase_out[9]) begin
|
||||
phase_shengyu <= phase_pi + phase_out;
|
||||
end
|
||||
else begin
|
||||
phase_shengyu <= phase_pi - phase_out;
|
||||
end
|
||||
state_phase <= 4'd4;
|
||||
end
|
||||
else begin
|
||||
phase_estm <= phase_estm;
|
||||
state_phase <= 4'd3;
|
||||
end
|
||||
end
|
||||
4'd4:begin
|
||||
if(phase_estm[9]) begin
|
||||
phase_final <= -phase_shengyu;
|
||||
end
|
||||
else begin
|
||||
phase_final <= phase_shengyu;
|
||||
end
|
||||
if(cnt_phase == 10'd0) begin
|
||||
cnt_phase <= cnt_phase + 10'd1;
|
||||
addrb <= 10'd0;
|
||||
rotate_nd <= 1'b1;
|
||||
end
|
||||
else if(cnt_phase == 10'd256) begin
|
||||
cnt_phase <= 10'd0;
|
||||
rotate_nd <= 1'b0;
|
||||
state_phase <= 4'd1;
|
||||
addrb <= 8'd0;
|
||||
end
|
||||
else begin
|
||||
cnt_phase <= cnt_phase + 10'd1;
|
||||
addrb <= addrb + 8'd1;
|
||||
rotate_nd <= 1'b1;
|
||||
end
|
||||
end
|
||||
default:begin
|
||||
if(framesync) begin
|
||||
state_phase <= 4'd1;
|
||||
end
|
||||
else begin
|
||||
state_phase <= 4'd0;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,75 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 2019/08/03 14:53:56
|
||||
// Design Name:
|
||||
// Module Name: trunc_25to12_2dly
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module trunc_25to12_2dly(
|
||||
clk,
|
||||
din_nd,
|
||||
din,
|
||||
ctrl,
|
||||
dout_nd,
|
||||
dout,
|
||||
ovrflw
|
||||
);
|
||||
//--------------------- IN/OUT ------------------------
|
||||
input clk;
|
||||
input din_nd;
|
||||
input [24:0] din;
|
||||
input ctrl;
|
||||
output reg dout_nd = 0;
|
||||
output reg [11:0] dout = 0;
|
||||
output reg ovrflw = 0;
|
||||
|
||||
//---------------------- delay -----------------------
|
||||
reg [24:0] din_dly = 0;
|
||||
always @(posedge clk)
|
||||
din_dly <= din;
|
||||
|
||||
reg sign_bit = 0;
|
||||
always @(posedge clk)
|
||||
sign_bit <= din[24];
|
||||
|
||||
//---------------------- flag -------------------------
|
||||
reg signbit3 = 0;
|
||||
always @(posedge clk)
|
||||
if(din[24:22] == 3'b000 || din[24:22] == 3'b111)
|
||||
signbit3 <= 1'b1;
|
||||
else
|
||||
signbit3 <= 1'b0;
|
||||
|
||||
//------------------------------------------------------
|
||||
always @(posedge clk)
|
||||
if(signbit3 == 1'b1)
|
||||
begin
|
||||
dout <= din_dly[22:11];
|
||||
ovrflw <= 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
dout <= {sign_bit,{10{!sign_bit}}};
|
||||
ovrflw <= 1;
|
||||
end
|
||||
reg din_nd_d1 = 0;
|
||||
always @(posedge clk) begin
|
||||
din_nd_d1 <= din_nd;
|
||||
dout_nd <= din_nd_d1;
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user