refactor(recviver): simulation pass for ila data

This commit is contained in:
2024-07-24 21:32:28 +08:00
parent 09fe5b3f8d
commit 0bedb6c2ef
56 changed files with 5822 additions and 1186 deletions
+1
View File
@@ -2,3 +2,4 @@ adi_library
c/**
ip
.tags
sim/sim_data
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+145
View File
@@ -0,0 +1,145 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CCSDS_LDPC_DEC_K1024_R12
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CCSDS_LDPC_DEC_K1024_R12 #(
parameter WIDTH = 4'd8,
parameter MAX_ITER_NUM = 6'd14,
parameter OUT_ONLY_INFORMATION = 1'b0 //译码输出格式选择标志,1:只输出信息位;0:输出整个码字
) (
input clk, //工作时钟,100MHz
input Rst, //同步复位信号,高有效
input FrameSync, //帧同步标志,高脉冲
input Nd, //译码输入数据有效标志,高有效
input [WIDTH-1:0] Din, //译码输入数据,软信息,数据速率约为12.5Mbps
output reg LDPC_SyncOut = 1'b0, //LDPC模块帧同步输出信号,高脉冲,指示帧起点
output reg Rdy = 1'b0, //译码输出信号有效标志,高有效
output reg [0:0] LDPC_Dout = 1'b0, //译码输出信号
output reg [8:0] good_frames = 9'd0, //译码好帧计数
output reg [8:0] bad_frames = 9'd0, //译码坏帧计数
output reg [8:0] total_frames = 9'd0 //译码总帧计数
);
reg rst_MS = 1'd0;
reg framesync_MS = 1'd0;
reg nd_MS = 1'd0;
reg [WIDTH-1:0] din_MS = 8'd0;
reg oe_MS = 1'd0;
wire deal_end_MS;
wire [WIDTH-1:0] dout01_MS;
wire [WIDTH-1:0] dout02_MS;
wire [WIDTH-1:0] dout03_MS;
wire [WIDTH-1:0] dout04_MS;
always @(posedge clk) begin
rst_MS <= Rst;
framesync_MS <= FrameSync;
nd_MS <= Nd;
din_MS <= Din;
end
//******输入数据的缓存模块
Message_Store #(
.WIDTH(WIDTH)
) MS (
.clk (clk),
.rst_MS (rst_MS),
.framesync_MS(framesync_MS),
.nd_MS (nd_MS),
.din_MS (din_MS),
.oe_MS (oe_MS),
.deal_end_MS (deal_end_MS),
.syncout_MS (syncout_MS),
.rdy_MS (rdy_MS),
.dout01_MS (dout01_MS),
.dout02_MS (dout02_MS),
.dout03_MS (dout03_MS),
.dout04_MS (dout04_MS)
);
reg rst = 1'd0;
reg start = 1'd0;
reg framesync = 1'd0;
reg nd = 1'd0;
reg [WIDTH-1:0] din01 = 8'd0;
reg [WIDTH-1:0] din02 = 8'd0;
reg [WIDTH-1:0] din03 = 8'd0;
reg [WIDTH-1:0] din04 = 8'd0;
wire ask_din;
wire [ 8:0] gd_frames;
wire [ 8:0] bd_frames;
wire [ 8:0] tl_frames;
wire ldpc_syncout;
wire rdy;
wire [ 0:0] ldpc_dout;
always @(posedge clk) begin
rst <= Rst;
start <= deal_end_MS;
framesync <= syncout_MS;
nd <= rdy_MS;
din01 <= dout01_MS;
din02 <= dout02_MS;
din03 <= dout03_MS;
din04 <= dout04_MS;
oe_MS <= ask_din;
end
// TOP层译码器输出
always @(posedge clk) begin
LDPC_SyncOut <= ldpc_syncout;
Rdy <= rdy;
LDPC_Dout <= ldpc_dout;
good_frames <= gd_frames;
bad_frames <= bd_frames;
total_frames <= tl_frames;
end
LDPC_DEC_PRO //译码器的吞吐量=(信息比特数/(一次迭代所需的时钟数*迭代次数))*FPGA工作主频
#(
.MAX_ITER_NUM(MAX_ITER_NUM),
.WIDTH(WIDTH),
.OUT_ONLY_INFORMATION(OUT_ONLY_INFORMATION)
) LDPC_DEC (
.clk (clk),
.rst (rst),
.start (start),
.framesync (framesync),
.nd (nd),
.din01 (din01),
.din02 (din02),
.din03 (din03),
.din04 (din04),
.ask_din (ask_din),
.gd_frames (gd_frames),
.bd_frames (bd_frames),
.tl_frames (tl_frames),
.ldpc_syncout(ldpc_syncout),
.rdy (rdy),
.ldpc_dout (ldpc_dout)
);
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+386
View File
@@ -0,0 +1,386 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CK_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CK_PRO
#(
parameter Index_p1_row_01_dec_01_01=0, Index_p1_row_01_dec_02_01=0,
parameter Index_p1_row_02_dec_02_01=0, Index_p1_row_02_dec_03_01=0,
parameter Index_p1_row_03_dec_03_01=0, Index_p1_row_03_dec_04_01=0,
parameter Index_p1_row_04_dec_04_01=0, Index_p1_row_04_dec_01_01=112,
parameter Index_p2_row_01_dec_05_01=0, Index_p2_row_01_dec_05_02=25, Index_p2_row_01_dec_08_01=31,Index_p2_row_01_dec_07_01=39,
parameter Index_p2_row_02_dec_06_01=0, Index_p2_row_02_dec_06_02=75, Index_p2_row_02_dec_05_01=23,Index_p2_row_02_dec_08_01=16,
parameter Index_p2_row_03_dec_07_01=0, Index_p2_row_03_dec_07_02=120,Index_p2_row_03_dec_06_01=54,Index_p2_row_03_dec_05_01=0,
parameter Index_p2_row_04_dec_08_01=0, Index_p2_row_04_dec_08_02=93, Index_p2_row_04_dec_07_01=9, Index_p2_row_04_dec_06_01=83,
parameter Index_p3_row_01_dec_09_01=0, Index_p3_row_01_dec_09_02=13, Index_p3_row_01_dec_11_01=97, Index_p3_row_01_dec_10_01=0, Index_p3_row_01_dec_12_01=34,
parameter Index_p3_row_02_dec_10_01=0, Index_p3_row_02_dec_10_02=69, Index_p3_row_02_dec_12_01=64, Index_p3_row_02_dec_11_01=6, Index_p3_row_02_dec_09_01=98,
parameter Index_p3_row_03_dec_11_01=0, Index_p3_row_03_dec_11_02=127,Index_p3_row_03_dec_09_01=78, Index_p3_row_03_dec_12_01=35, Index_p3_row_03_dec_10_01=26,
parameter Index_p3_row_04_dec_12_01=0, Index_p3_row_04_dec_12_02=29, Index_p3_row_04_dec_10_01=81, Index_p3_row_04_dec_09_01=99, Index_p3_row_04_dec_11_01=59
)
(
input clk,
input rst_OUTCK,
input start_OUTCK,
input nd_OUTCK,
input [0:0] DR_din_01,
input [0:0] DR_din_02,
input [0:0] DR_din_03,
input [0:0] DR_din_04,
input [0:0] DR_din_05,
output reg [8:0] gd_frames=9'd0,//译码好帧计数
output reg [8:0] bd_frames=9'd0,//译码坏帧计数
output reg [8:0] tl_frames=9'd0 //译码总帧数计数
);
reg [127:0] dec_01 = 128'd0, dec_02 = 128'd0, dec_03 = 128'd0, dec_04 = 128'd0;
reg [127:0] dec_05 = 128'd0, dec_06 = 128'd0, dec_07 = 128'd0, dec_08 = 128'd0;
reg [127:0] dec_09 = 128'd0, dec_10 = 128'd0, dec_11 = 128'd0, dec_12 = 128'd0;
reg [127:0] dec_01_d1 = 128'd0, dec_02_d1 = 128'd0, dec_03_d1 = 128'd0, dec_04_d1 = 128'd0;
reg [127:0] dec_05_d1 = 128'd0, dec_06_d1 = 128'd0, dec_07_d1 = 128'd0, dec_08_d1 = 128'd0;
reg [127:0] dec_09_d1 = 128'd0, dec_10_d1 = 128'd0, dec_11_d1 = 128'd0, dec_12_d1 = 128'd0;
reg [10:0] cnt_CK=11'd0;
reg deal_end=1'd0,deal_end_d1=1'd0,deal_end_d2=1'd0,deal_end_d3=1'd0,deal_end_d4=1'd0,deal_end_d5=1'd0,dec_proc=1'd0;
// 产生本模块的计数器
always @ (posedge clk) begin
if (rst_OUTCK) begin
dec_proc <= 1'd0;
cnt_CK <= 11'd0;
end else begin
if (start_OUTCK) begin
dec_proc <= 1'd1;
cnt_CK <= 11'd0;
end else begin
if (dec_proc) begin
if (cnt_CK < 11'd560) begin
cnt_CK <= cnt_CK + 11'd1;
dec_proc <= dec_proc;
end else begin
cnt_CK <= cnt_CK;
dec_proc <= 1'd0;
end
end else begin
cnt_CK <= cnt_CK;
end
end
end
end
parameter DELAY_DIN = 11'd0;
always @ (posedge clk) begin
if (rst_OUTCK || start_OUTCK) begin
dec_01 <= 128'd0; dec_01_d1 <= 128'd0;
dec_02 <= 128'd0; dec_02_d1 <= 128'd0;
dec_03 <= 128'd0; dec_03_d1 <= 128'd0;
dec_04 <= 128'd0; dec_04_d1 <= 128'd0;
dec_05 <= 128'd0; dec_05_d1 <= 128'd0;
dec_06 <= 128'd0; dec_06_d1 <= 128'd0;
dec_07 <= 128'd0; dec_07_d1 <= 128'd0;
dec_08 <= 128'd0; dec_08_d1 <= 128'd0;
dec_09 <= 128'd0; dec_09_d1 <= 128'd0;
dec_10 <= 128'd0; dec_10_d1 <= 128'd0;
dec_11 <= 128'd0; dec_11_d1 <= 128'd0;
dec_12 <= 128'd0; dec_12_d1 <= 128'd0;
deal_end <= 1'd0;
end else begin
// 本来3行5列的H矩阵转置后变成5行3列
// 第1列(4*128=512)个校验子求解过程
if (cnt_CK >= 11'd1 + DELAY_DIN && cnt_CK < 11'd129 + DELAY_DIN) begin
dec_01[Index_p1_row_01_dec_01_01] <= DR_din_03 ^ DR_din_05;
dec_02[Index_p1_row_01_dec_02_01] <= DR_din_05;
end else if (cnt_CK >= 11'd129 + DELAY_DIN && cnt_CK < 11'd257 + DELAY_DIN) begin
dec_01[Index_p1_row_01_dec_01_01] <= 1'd0;
dec_02[Index_p1_row_02_dec_02_01] <= DR_din_03 ^ DR_din_05;
dec_03[Index_p1_row_02_dec_03_01] <= DR_din_05;
end else if (cnt_CK >= 11'd257 + DELAY_DIN && cnt_CK < 11'd385 + DELAY_DIN) begin
dec_03[Index_p1_row_03_dec_03_01] <= DR_din_03 ^ DR_din_05;
dec_04[Index_p1_row_03_dec_04_01] <= DR_din_05;
end else if (cnt_CK >= 11'd385 + DELAY_DIN && cnt_CK < 11'd513 + DELAY_DIN) begin
dec_04[Index_p1_row_04_dec_04_01] <= DR_din_03 ^ DR_din_05;
dec_01[Index_p1_row_04_dec_01_01] <= DR_din_05;
end else begin
dec_01 <= dec_01;
dec_02 <= dec_02;
dec_03 <= dec_03;
dec_04 <= dec_04;
end
if (cnt_CK >= 11'd2 + DELAY_DIN && cnt_CK < 11'd130 + DELAY_DIN) begin
dec_01_d1 <= {dec_01_d1[0],dec_01_d1[127:1]} ^ dec_01;
dec_02_d1 <= {dec_02_d1[0],dec_02_d1[127:1]} ^ dec_02;
end else if (cnt_CK >= 11'd130 + DELAY_DIN && cnt_CK < 11'd258 + DELAY_DIN) begin
dec_02_d1 <= {dec_02_d1[0],dec_02_d1[127:1]} ^ dec_02;
dec_03_d1 <= {dec_03_d1[0],dec_03_d1[127:1]} ^ dec_03;
end else if (cnt_CK >= 11'd258 + DELAY_DIN && cnt_CK < 11'd386 + DELAY_DIN) begin
dec_03_d1 <= {dec_03_d1[0],dec_03_d1[127:1]} ^ dec_03;
dec_04_d1 <= {dec_04_d1[0],dec_04_d1[127:1]} ^ dec_04;
end else if (cnt_CK >= 11'd386 + DELAY_DIN && cnt_CK < 11'd514 + DELAY_DIN) begin
dec_04_d1 <= {dec_04_d1[0],dec_04_d1[127:1]} ^ dec_04;
dec_01_d1 <= {dec_01_d1[0],dec_01_d1[127:1]} ^ dec_01;
end else if (cnt_CK == 11'd514 + DELAY_DIN) begin
dec_01_d1 <= {dec_01_d1[0],dec_01_d1[127:1]};
dec_02_d1 <= {dec_02_d1[0],dec_02_d1[127:1]};
dec_03_d1 <= {dec_03_d1[0],dec_03_d1[127:1]};
dec_04_d1 <= {dec_04_d1[0],dec_04_d1[127:1]};
end else begin
dec_01_d1 <= dec_01_d1;
dec_02_d1 <= dec_02_d1;
dec_03_d1 <= dec_03_d1;
dec_04_d1 <= dec_04_d1;
deal_end <= 1'd0;
end
// 第2列(4*128=512)个校验子求解过程
if (cnt_CK >= 11'd1 + DELAY_DIN && cnt_CK < 11'd129 + DELAY_DIN) begin
dec_05[Index_p2_row_01_dec_05_01] <= DR_din_01 ^ DR_din_02 ^ DR_din_04;
dec_05[Index_p2_row_01_dec_05_02] <= DR_din_05;
dec_08[Index_p2_row_01_dec_08_01] <= DR_din_05;
dec_07[Index_p2_row_01_dec_07_01] <= DR_din_05;
end else if (cnt_CK >= 11'd129 + DELAY_DIN && cnt_CK < 11'd257 + DELAY_DIN) begin
dec_06[Index_p2_row_02_dec_06_01] <= DR_din_01 ^ DR_din_02 ^ DR_din_04;
dec_06[Index_p2_row_02_dec_06_02] <= DR_din_05;
dec_05[Index_p2_row_02_dec_05_01] <= DR_din_05;
dec_05[Index_p2_row_01_dec_05_01] <= 1'd0;
dec_05[Index_p2_row_01_dec_05_02] <= 1'd0;
dec_08[Index_p2_row_02_dec_08_01] <= DR_din_05;
dec_08[Index_p2_row_01_dec_08_01] <= 1'd0;
dec_07[Index_p2_row_01_dec_07_01] <= 1'd0; //xhx
end else if (cnt_CK >= 11'd257 + DELAY_DIN && cnt_CK < 11'd385 + DELAY_DIN) begin
dec_07[Index_p2_row_03_dec_07_01] <= DR_din_01 ^ DR_din_02 ^ DR_din_04;
dec_07[Index_p2_row_03_dec_07_02] <= DR_din_05;
dec_06[Index_p2_row_03_dec_06_01] <= DR_din_05;
dec_06[Index_p2_row_02_dec_06_01] <= 1'd0;
dec_06[Index_p2_row_02_dec_06_02] <= 1'd0;
dec_05[Index_p2_row_03_dec_05_01] <= DR_din_05;
dec_05[Index_p2_row_02_dec_05_01] <= 1'd0;
dec_08[Index_p2_row_02_dec_08_01] <= 1'd0; //xhx
end else if (cnt_CK >= 11'd385 + DELAY_DIN && cnt_CK < 11'd513 + DELAY_DIN) begin
dec_08[Index_p2_row_04_dec_08_01] <= DR_din_01 ^ DR_din_02 ^ DR_din_04;
dec_08[Index_p2_row_04_dec_08_02] <= DR_din_05;
dec_07[Index_p2_row_04_dec_07_01] <= DR_din_05;
dec_07[Index_p2_row_03_dec_07_01] <= 1'd0;
dec_07[Index_p2_row_03_dec_07_02] <= 1'd0;
dec_06[Index_p2_row_04_dec_06_01] <= DR_din_05;
dec_06[Index_p2_row_03_dec_06_01] <= 1'd0;
dec_05[Index_p2_row_03_dec_05_01] <= 1'd0; //xhx
end else begin
dec_05 <= dec_05;
dec_06 <= dec_06;
dec_07 <= dec_07;
dec_08 <= dec_08;
end
if (cnt_CK >= 11'd2 + DELAY_DIN && cnt_CK < 11'd130 + DELAY_DIN) begin
dec_05_d1 <= {dec_05_d1[0],dec_05_d1[127:1]} ^ dec_05;
dec_07_d1 <= {dec_07_d1[0],dec_07_d1[127:1]} ^ dec_07;
dec_08_d1 <= {dec_08_d1[0],dec_08_d1[127:1]} ^ dec_08;
end else if (cnt_CK >= 11'd130 + DELAY_DIN && cnt_CK < 11'd258 + DELAY_DIN) begin
dec_05_d1 <= {dec_05_d1[0],dec_05_d1[127:1]} ^ dec_05;
dec_06_d1 <= {dec_06_d1[0],dec_06_d1[127:1]} ^ dec_06;
dec_08_d1 <= {dec_08_d1[0],dec_08_d1[127:1]} ^ dec_08;
end else if (cnt_CK >= 11'd258 + DELAY_DIN && cnt_CK < 11'd386 + DELAY_DIN) begin
dec_05_d1 <= {dec_05_d1[0],dec_05_d1[127:1]} ^ dec_05;
dec_06_d1 <= {dec_06_d1[0],dec_06_d1[127:1]} ^ dec_06;
dec_07_d1 <= {dec_07_d1[0],dec_07_d1[127:1]} ^ dec_07;
end else if (cnt_CK >= 11'd386 + DELAY_DIN && cnt_CK < 11'd514 + DELAY_DIN) begin
dec_06_d1 <= {dec_06_d1[0],dec_06_d1[127:1]} ^ dec_06;
dec_07_d1 <= {dec_07_d1[0],dec_07_d1[127:1]} ^ dec_07;
dec_08_d1 <= {dec_08_d1[0],dec_08_d1[127:1]} ^ dec_08;
end else if (cnt_CK == 11'd514 + DELAY_DIN) begin
dec_05_d1 <= {dec_05_d1[0],dec_05_d1[127:1]};
dec_06_d1 <= {dec_06_d1[0],dec_06_d1[127:1]};
dec_07_d1 <= {dec_07_d1[0],dec_07_d1[127:1]};
dec_08_d1 <= {dec_08_d1[0],dec_08_d1[127:1]};
end else begin
dec_05_d1 <= dec_05_d1;
dec_06_d1 <= dec_06_d1;
dec_07_d1 <= dec_07_d1;
dec_08_d1 <= dec_08_d1;
end
// 第3列(4*128=512)个校验子求解过程
if (cnt_CK >= 11'd1 + DELAY_DIN && cnt_CK < 11'd129 + DELAY_DIN) begin
dec_09[Index_p3_row_01_dec_09_01] <= DR_din_01 ^ DR_din_05;
dec_09[Index_p3_row_01_dec_09_02] <= DR_din_04;
dec_11[Index_p3_row_01_dec_11_01] <= DR_din_02;
dec_10[Index_p3_row_01_dec_10_01] <= DR_din_02;
dec_12[Index_p3_row_01_dec_12_01] <= DR_din_04;
end else if (cnt_CK >= 11'd129 + DELAY_DIN && cnt_CK < 11'd257 + DELAY_DIN) begin
dec_10[Index_p3_row_02_dec_10_01] <= DR_din_01 ^ DR_din_05;
dec_10[Index_p3_row_02_dec_10_02] <= DR_din_04;
dec_12[Index_p3_row_02_dec_12_01] <= DR_din_02;
dec_12[Index_p3_row_01_dec_12_01] <= 1'd0;
dec_11[Index_p3_row_02_dec_11_01] <= DR_din_02;
dec_11[Index_p3_row_01_dec_11_01] <= 1'd0;
dec_09[Index_p3_row_02_dec_09_01] <= DR_din_04;
dec_09[Index_p3_row_01_dec_09_01] <= 1'd0;
dec_09[Index_p3_row_01_dec_09_02] <= 1'd0;
end else if (cnt_CK >= 11'd257 + DELAY_DIN && cnt_CK < 11'd385 + DELAY_DIN) begin
dec_11[Index_p3_row_03_dec_11_01] <= DR_din_01 ^ DR_din_05;
dec_11[Index_p3_row_03_dec_11_02] <= DR_din_04;
dec_11[Index_p3_row_02_dec_11_01] <= 1'd0;
dec_09[Index_p3_row_03_dec_09_01] <= DR_din_02;
dec_09[Index_p3_row_02_dec_09_01] <= 1'd0;
dec_12[Index_p3_row_03_dec_12_01] <= DR_din_02;
dec_12[Index_p3_row_02_dec_12_01] <= 1'd0;
dec_10[Index_p3_row_03_dec_10_01] <= DR_din_04;
dec_10[Index_p3_row_02_dec_10_01] <= 1'd0;
dec_10[Index_p3_row_02_dec_10_02] <= 1'd0;
end else if (cnt_CK >= 11'd385 + DELAY_DIN && cnt_CK < 11'd513 + DELAY_DIN) begin
dec_12[Index_p3_row_04_dec_12_01] <= DR_din_01 ^ DR_din_05;
dec_12[Index_p3_row_04_dec_12_02] <= DR_din_04;
dec_12[Index_p3_row_03_dec_12_01] <= 1'd0;
dec_10[Index_p3_row_04_dec_10_01] <= DR_din_02;
dec_10[Index_p3_row_03_dec_10_01] <= 1'd0;
dec_09[Index_p3_row_04_dec_09_01] <= DR_din_02;
dec_09[Index_p3_row_03_dec_09_01] <= 1'd0;
dec_11[Index_p3_row_04_dec_11_01] <= DR_din_04;
dec_11[Index_p3_row_03_dec_11_01] <= 1'd0;
dec_11[Index_p3_row_03_dec_11_02] <= 1'd0;
end else begin
dec_09 <= dec_09;
dec_10 <= dec_10;
dec_11 <= dec_11;
dec_12 <= dec_12;
end
if (cnt_CK >= 11'd2 + DELAY_DIN && cnt_CK < 11'd130 + DELAY_DIN) begin
dec_09_d1 <= {dec_09_d1[0],dec_09_d1[127:1]} ^ dec_09;
dec_10_d1 <= {dec_10_d1[0],dec_10_d1[127:1]} ^ dec_10;
dec_11_d1 <= {dec_11_d1[0],dec_11_d1[127:1]} ^ dec_11;
dec_12_d1 <= {dec_12_d1[0],dec_12_d1[127:1]} ^ dec_12;
end else if (cnt_CK >= 11'd130 + DELAY_DIN && cnt_CK < 11'd258 + DELAY_DIN) begin
dec_09_d1 <= {dec_09_d1[0],dec_09_d1[127:1]} ^ dec_09;
dec_10_d1 <= {dec_10_d1[0],dec_10_d1[127:1]} ^ dec_10;
dec_11_d1 <= {dec_11_d1[0],dec_11_d1[127:1]} ^ dec_11;
dec_12_d1 <= {dec_12_d1[0],dec_12_d1[127:1]} ^ dec_12;
end else if (cnt_CK >= 11'd258 + DELAY_DIN && cnt_CK < 11'd386 + DELAY_DIN) begin
dec_09_d1 <= {dec_09_d1[0],dec_09_d1[127:1]} ^ dec_09;
dec_10_d1 <= {dec_10_d1[0],dec_10_d1[127:1]} ^ dec_10;
dec_11_d1 <= {dec_11_d1[0],dec_11_d1[127:1]} ^ dec_11;
dec_12_d1 <= {dec_12_d1[0],dec_12_d1[127:1]} ^ dec_12;
end else if (cnt_CK >= 11'd386 + DELAY_DIN && cnt_CK < 11'd514 + DELAY_DIN) begin
dec_09_d1 <= {dec_09_d1[0],dec_09_d1[127:1]} ^ dec_09;
dec_10_d1 <= {dec_10_d1[0],dec_10_d1[127:1]} ^ dec_10;
dec_11_d1 <= {dec_11_d1[0],dec_11_d1[127:1]} ^ dec_11;
dec_12_d1 <= {dec_12_d1[0],dec_12_d1[127:1]} ^ dec_12;
end else if (cnt_CK == 11'd514 + DELAY_DIN) begin
dec_09_d1 <= {dec_09_d1[0],dec_09_d1[127:1]};
dec_10_d1 <= {dec_10_d1[0],dec_10_d1[127:1]};
dec_11_d1 <= {dec_11_d1[0],dec_11_d1[127:1]};
dec_12_d1 <= {dec_12_d1[0],dec_12_d1[127:1]};
end else begin
dec_09_d1 <= dec_09_d1;
dec_10_d1 <= dec_10_d1;
dec_11_d1 <= dec_11_d1;
dec_12_d1 <= dec_12_d1;
end
// 产生标志位
if (cnt_CK == 11'd514 + DELAY_DIN)
deal_end <= 1'd1;
else
deal_end <= 1'd0;
end
end
//2019.02.28添加:打一拍,尝试避免时序问题
reg deal_end_d6 = 1'd0;
reg flag_judge1 = 1'd0;
reg flag_judge2 = 1'd0;
reg flag_judge3 = 1'd0;
always@(posedge clk) begin
if(rst_OUTCK) begin
flag_judge1 <= 1'd0;
flag_judge2 <= 1'd0;
flag_judge3 <= 1'd0;
end
else begin
if(deal_end_d5) begin
if(dec_01_d1 == 128'd0 && dec_02_d1 == 128'd0 && dec_03_d1 == 128'd0 && dec_04_d1 == 128'd0 ) flag_judge1 <= 1'd0;
else flag_judge1 <= 1'd1;
if(dec_05_d1 == 128'd0 && dec_06_d1 == 128'd0 && dec_07_d1 == 128'd0 && dec_08_d1 == 128'd0 ) flag_judge2 <= 1'd0;
else flag_judge2 <= 1'd1;
if(dec_09_d1 == 128'd0 && dec_10_d1 == 128'd0 && dec_11_d1 == 128'd0 && dec_12_d1 == 128'd0 ) flag_judge3 <= 1'd0;
else flag_judge3 <= 1'd1;
end
else begin
flag_judge1 <= flag_judge1;
flag_judge2 <= flag_judge2;
flag_judge3 <= flag_judge3;
end
end
end
always@(posedge clk) begin
if(rst_OUTCK) begin
gd_frames <= 9'd0;
bd_frames <= 9'd0;
tl_frames <= 9'd0;
deal_end_d1 <= 1'd0;
deal_end_d2 <= 1'd0;
deal_end_d3 <= 1'd0;
deal_end_d4 <= 1'd0;
deal_end_d5 <= 1'd0;
deal_end_d6 <= 1'd0; //2019.02.28添加
end else begin
deal_end_d1 <= deal_end;
deal_end_d2 <= deal_end_d1;
deal_end_d3 <= deal_end_d2;
deal_end_d4 <= deal_end_d3;
deal_end_d5 <= deal_end_d4;
deal_end_d6 <= deal_end_d5; //2019.02.28添加
if(deal_end_d6) begin
if(flag_judge1 == 1'd0 && flag_judge2 == 1'd0 && flag_judge3 == 1'd0 ) begin
// if(dec_01_d1 == 128'd0 && dec_02_d1 == 128'd0 && dec_03_d1 == 128'd0 && dec_04_d1 == 128'd0 &&
// dec_05_d1 == 128'd0 && dec_06_d1 == 128'd0 && dec_07_d1 == 128'd0 && dec_08_d1 == 128'd0 &&
// dec_09_d1 == 128'd0 && dec_10_d1 == 128'd0 && dec_11_d1 == 128'd0 && dec_12_d1 == 128'd0 ) begin
gd_frames <= gd_frames + 9'd1;
bd_frames <= bd_frames;
tl_frames <= tl_frames + 9'd1;
end else begin
gd_frames <= gd_frames;
bd_frames <= bd_frames + 9'd1;
tl_frames <= tl_frames + 9'd1;
end
end else begin
gd_frames <= gd_frames;
bd_frames <= bd_frames;
tl_frames <= tl_frames;
end
end
end
endmodule
+107
View File
@@ -0,0 +1,107 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CNU_3din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CNU_3din
#(parameter WIDTH = 4'd8)(
input clk,
input [WIDTH-1:0] din01_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din02_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din03_VN_RU, //变量节点信息输入
output reg [WIDTH-1:0] dout01_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout02_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout03_RU=8'd0 //更新输出
);//输出相对输入延时9个clk
reg [WIDTH-1:0] abs01=8'd0,abs01_reg0=8'd0,abs01_reg1=8'd0;
reg [WIDTH-1:0] abs02=8'd0,abs02_reg0=8'd0,abs02_reg1=8'd0;
reg [WIDTH-1:0] abs03=8'd0,abs03_reg0=8'd0,abs03_reg1=8'd0;
always @ (posedge clk) begin//求输入数据的绝对值过程
if(din01_VN_RU[WIDTH-1]) abs01 <= ~din01_VN_RU + 8'd1;else abs01 <= din01_VN_RU;
if(din02_VN_RU[WIDTH-1]) abs02 <= ~din02_VN_RU + 8'd1;else abs02 <= din02_VN_RU;
if(din03_VN_RU[WIDTH-1]) abs03 <= ~din03_VN_RU + 8'd1;else abs03 <= din03_VN_RU;
end
always @ (posedge clk) begin
abs01_reg0 <= abs01; abs01_reg1 <= abs01_reg0;
abs02_reg0 <= abs02; abs02_reg1 <= abs02_reg0;
abs03_reg0 <= abs03; abs03_reg1 <= abs03_reg0;
end
reg [WIDTH-1:0] min_level_1_01=8'd0,min_level_1_02=8'd0;
reg [WIDTH-1:0] min_level_2_01=8'd0,min_level_2_02=8'd0;
always @ (posedge clk) begin//第1级分类,两两一组将最小及次小值分开
min_level_1_01 <= (abs01 < abs02) ? abs01:abs02;
min_level_1_02 <= (abs01 < abs02) ? abs02:abs01;
end
always @ (posedge clk) begin
min_level_2_01 <= (abs03_reg0<min_level_1_01) ? abs03_reg0:min_level_1_01;
min_level_2_02 <= (abs03_reg0<min_level_1_01) ? min_level_1_01:((abs03_reg0<min_level_1_02)? abs03_reg0 : min_level_1_02);
end
reg [WIDTH-1:0] abs01_update=8'd0,abs02_update=8'd0,abs03_update=8'd0;
always @ (posedge clk) begin//各绝对值的最小值及次小值更新
abs01_update <= (abs01_reg1==min_level_2_01) ? min_level_2_02 : min_level_2_01;
abs02_update <= (abs02_reg1==min_level_2_01) ? min_level_2_02 : min_level_2_01;
abs03_update <= (abs03_reg1==min_level_2_01) ? min_level_2_02 : min_level_2_01;
end
wire [WIDTH-1:0] dout_abs_NF01,dout_abs_NF02,dout_abs_NF03;
//*****对更新后的非负数修正,系数为0.8125
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF01 (.clk(clk),.din_NF(abs01_update),.dout_NF(dout_abs_NF01));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF02 (.clk(clk),.din_NF(abs02_update),.dout_NF(dout_abs_NF02));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF03 (.clk(clk),.din_NF(abs03_update),.dout_NF(dout_abs_NF03));
reg [2:0] sgn=3'd0,sgn_reg0=3'd0;
always @ (posedge clk) begin//求输入数据的符号位及其流水延时过程
sgn[2:0] <= {din01_VN_RU[WIDTH-1],din02_VN_RU[WIDTH-1],din03_VN_RU[WIDTH-1]};
sgn_reg0 <= sgn;
end
reg xor_level_1_01=1'd0;
always @ (posedge clk) begin//求所有符号位异或和的过程
xor_level_1_01 <= sgn[0] ^ sgn[1] ^ sgn[2];
end
reg [2:0] sgn_update=3'd0,sgn_update_reg0=3'd0,sgn_update_reg1=3'd0,sgn_update_reg2=3'd0,sgn_update_reg3=3'd0;
always @ (posedge clk) begin //更新所有符号位及结果流水延时过程
sgn_update[2:0] <= sgn_reg0^{3{xor_level_1_01}};
sgn_update_reg0 <= sgn_update;
sgn_update_reg1 <= sgn_update_reg0;
sgn_update_reg2 <= sgn_update_reg1;
sgn_update_reg3 <= sgn_update_reg2;
end
reg [WIDTH-1:0] dout01_RU_temp=8'd0,dout02_RU_temp=8'd0,dout03_RU_temp=8'd0;
always @ (posedge clk) begin //计算最终更新结果的过程(符号位+绝对值)
dout01_RU_temp <= (sgn_update_reg3[2]) ? {sgn_update_reg3[2],~dout_abs_NF01[WIDTH-2:0]+8'd1} : {sgn_update_reg3[2],dout_abs_NF01[WIDTH-2:0]};
dout02_RU_temp <= (sgn_update_reg3[1]) ? {sgn_update_reg3[1],~dout_abs_NF02[WIDTH-2:0]+8'd1} : {sgn_update_reg3[1],dout_abs_NF02[WIDTH-2:0]};
dout03_RU_temp <= (sgn_update_reg3[0]) ? {sgn_update_reg3[0],~dout_abs_NF03[WIDTH-2:0]+8'd1} : {sgn_update_reg3[0],dout_abs_NF03[WIDTH-2:0]};
dout01_RU <= dout01_RU_temp;
dout02_RU <= dout02_RU_temp;
dout03_RU <= dout03_RU_temp;
end
endmodule
+150
View File
@@ -0,0 +1,150 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CNU_6din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CNU_6din
#(parameter WIDTH = 4'd8)
(//输入数据个数为10的行更新模块,包括符号更新
input clk,
input [WIDTH-1:0] din01_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din02_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din03_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din04_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din05_VN_RU, //变量节点信息输入
input [WIDTH-1:0] din06_VN_RU, //变量节点信息输入
output reg [WIDTH-1:0] dout01_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout02_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout03_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout04_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout05_RU=8'd0, //更新输出
output reg [WIDTH-1:0] dout06_RU=8'd0 //更新输出
); //输出相对输入延时9个clk
reg [WIDTH-1:0] abs01=8'd0,abs01_reg0=8'd0,abs01_reg1=8'd0,abs01_reg2=8'd0,min_level_1_01=8'd0;
reg [WIDTH-1:0] abs02=8'd0,abs02_reg0=8'd0,abs02_reg1=8'd0,abs02_reg2=8'd0,min_level_1_02=8'd0;
reg [WIDTH-1:0] abs03=8'd0,abs03_reg0=8'd0,abs03_reg1=8'd0,abs03_reg2=8'd0,min_level_1_03=8'd0;
reg [WIDTH-1:0] abs04=8'd0,abs04_reg0=8'd0,abs04_reg1=8'd0,abs04_reg2=8'd0,min_level_1_04=8'd0;
reg [WIDTH-1:0] abs05=8'd0,abs05_reg0=8'd0,abs05_reg1=8'd0,abs05_reg2=8'd0,min_level_1_05=8'd0;
reg [WIDTH-1:0] abs06=8'd0,abs06_reg0=8'd0,abs06_reg1=8'd0,abs06_reg2=8'd0,min_level_1_06=8'd0;
wire [WIDTH-1:0] min_level_2_01,min_level_2_02,min_level_3_01,min_level_3_02;
always @ (posedge clk) begin//求输入数据的绝对值过程
if(din01_VN_RU[WIDTH-1]) abs01 <= ~din01_VN_RU + 8'd1;else abs01 <= din01_VN_RU;
if(din02_VN_RU[WIDTH-1]) abs02 <= ~din02_VN_RU + 8'd1;else abs02 <= din02_VN_RU;
if(din03_VN_RU[WIDTH-1]) abs03 <= ~din03_VN_RU + 8'd1;else abs03 <= din03_VN_RU;
if(din04_VN_RU[WIDTH-1]) abs04 <= ~din04_VN_RU + 8'd1;else abs04 <= din04_VN_RU;
if(din05_VN_RU[WIDTH-1]) abs05 <= ~din05_VN_RU + 8'd1;else abs05 <= din05_VN_RU;
if(din06_VN_RU[WIDTH-1]) abs06 <= ~din06_VN_RU + 8'd1;else abs06 <= din06_VN_RU;
end
always @ (posedge clk) begin//对绝对值流水延时
abs01_reg0 <= abs01; abs01_reg1 <= abs01_reg0; abs01_reg2 <= abs01_reg1;
abs02_reg0 <= abs02; abs02_reg1 <= abs02_reg0; abs02_reg2 <= abs02_reg1;
abs03_reg0 <= abs03; abs03_reg1 <= abs03_reg0; abs03_reg2 <= abs03_reg1;
abs04_reg0 <= abs04; abs04_reg1 <= abs04_reg0; abs04_reg2 <= abs04_reg1;
abs05_reg0 <= abs05; abs05_reg1 <= abs05_reg0; abs05_reg2 <= abs05_reg1;
abs06_reg0 <= abs06; abs06_reg1 <= abs06_reg0; abs06_reg2 <= abs06_reg1;
end
reg [WIDTH-1:0] min_level_1_05_reg0=8'd0,min_level_1_06_reg0=8'd0;
always @ (posedge clk) begin
min_level_1_05_reg0 <= min_level_1_05;
min_level_1_06_reg0 <= min_level_1_06;
end
always @ (posedge clk) begin//第1级分类,两两一组将最小及次小值分开
min_level_1_01 <= (abs01<abs02) ? abs01 : abs02; min_level_1_02 <= (abs01<abs02) ? abs02 : abs01;
min_level_1_03 <= (abs03<abs04) ? abs03 : abs04; min_level_1_04 <= (abs03<abs04) ? abs04 : abs03;
min_level_1_05 <= (abs05<abs06) ? abs05 : abs06; min_level_1_06 <= (abs05<abs06) ? abs06 : abs05;
end
abs_min_4din #(.WIDTH(WIDTH))inst_4din_level_1_01 (.clk(clk),.din01(min_level_1_01),.din02(min_level_1_02),.din03(min_level_1_03),.din04(min_level_1_04),.dout_min(min_level_2_01),.dout_sec(min_level_2_02));
abs_min_4din #(.WIDTH(WIDTH))inst_4din_level_2_01 (.clk(clk),.din01(min_level_1_05_reg0),.din02(min_level_1_06_reg0),.din03(min_level_2_01),.din04(min_level_2_02),.dout_min(min_level_3_01),.dout_sec(min_level_3_02));
reg [WIDTH-1:0] abs01_update=8'd0;
reg [WIDTH-1:0] abs02_update=8'd0;
reg [WIDTH-1:0] abs03_update=8'd0;
reg [WIDTH-1:0] abs04_update=8'd0;
reg [WIDTH-1:0] abs05_update=8'd0;
reg [WIDTH-1:0] abs06_update=8'd0;
always @ (posedge clk) begin//各绝对值的最小值及次小值更新
abs01_update <= (abs01_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
abs02_update <= (abs02_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
abs03_update <= (abs03_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
abs04_update <= (abs04_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
abs05_update <= (abs05_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
abs06_update <= (abs06_reg2==min_level_3_01) ? min_level_3_02 : min_level_3_01;
end
wire [WIDTH-1:0] dout_abs_NF01;
wire [WIDTH-1:0] dout_abs_NF02;
wire [WIDTH-1:0] dout_abs_NF03;
wire [WIDTH-1:0] dout_abs_NF04;
wire [WIDTH-1:0] dout_abs_NF05;
wire [WIDTH-1:0] dout_abs_NF06;
//*****对更新后的非负数修正,系数为0.8125
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF01 (.clk(clk),.din_NF(abs01_update),.dout_NF(dout_abs_NF01));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF02 (.clk(clk),.din_NF(abs02_update),.dout_NF(dout_abs_NF02));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF03 (.clk(clk),.din_NF(abs03_update),.dout_NF(dout_abs_NF03));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF04 (.clk(clk),.din_NF(abs04_update),.dout_NF(dout_abs_NF04));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF05 (.clk(clk),.din_NF(abs05_update),.dout_NF(dout_abs_NF05));
Normalization_Factor_0_8125 #(.WIDTH(WIDTH)) NF06 (.clk(clk),.din_NF(abs06_update),.dout_NF(dout_abs_NF06));
reg [5:0] sgn=6'd0,sgn_reg0=6'd0,sgn_reg1=6'd0;
always @ (posedge clk) begin//求输入数据的符号位及其流水延时过程
sgn[5:0] <= {din01_VN_RU[WIDTH-1],din02_VN_RU[WIDTH-1],din03_VN_RU[WIDTH-1],din04_VN_RU[WIDTH-1],din05_VN_RU[WIDTH-1],din06_VN_RU[WIDTH-1]};
sgn_reg0 <= sgn;
sgn_reg1 <= sgn_reg0;
end
reg xor_level_1_01=1'd0,xor_level_1_02=1'd0,xor_level_2_01=1'd0;
always @ (posedge clk) begin//求所有符号位异或和的过程
xor_level_1_01 <= sgn[0] ^ sgn[1] ^ sgn[2];
xor_level_1_02 <= sgn[3] ^ sgn[4] ^ sgn[5];
xor_level_2_01 <= xor_level_1_01 ^ xor_level_1_02;
end
reg [5:0] sgn_update=6'd0,sgn_update_reg0=6'd0,sgn_update_reg1=6'd0,sgn_update_reg2=6'd0,sgn_update_reg3=6'd0;
always @ (posedge clk) begin //更新所有符号位及结果流水延时过程
sgn_update[5:0] <= sgn_reg1^{6{xor_level_2_01}};
sgn_update_reg0 <= sgn_update;
sgn_update_reg1 <= sgn_update_reg0;
sgn_update_reg2 <= sgn_update_reg1;
sgn_update_reg3 <= sgn_update_reg2;
end
always @ (posedge clk) begin //计算最终更新结果的过程(符号位+绝对值)
dout01_RU <= (sgn_update_reg3[5]) ? {sgn_update_reg3[5],~dout_abs_NF01[WIDTH-2:0]+8'd1} : {sgn_update_reg3[5],dout_abs_NF01[WIDTH-2:0]};
dout02_RU <= (sgn_update_reg3[4]) ? {sgn_update_reg3[4],~dout_abs_NF02[WIDTH-2:0]+8'd1} : {sgn_update_reg3[4],dout_abs_NF02[WIDTH-2:0]};
dout03_RU <= (sgn_update_reg3[3]) ? {sgn_update_reg3[3],~dout_abs_NF03[WIDTH-2:0]+8'd1} : {sgn_update_reg3[3],dout_abs_NF03[WIDTH-2:0]};
dout04_RU <= (sgn_update_reg3[2]) ? {sgn_update_reg3[2],~dout_abs_NF04[WIDTH-2:0]+8'd1} : {sgn_update_reg3[2],dout_abs_NF04[WIDTH-2:0]};
dout05_RU <= (sgn_update_reg3[1]) ? {sgn_update_reg3[1],~dout_abs_NF05[WIDTH-2:0]+8'd1} : {sgn_update_reg3[1],dout_abs_NF05[WIDTH-2:0]};
dout06_RU <= (sgn_update_reg3[0]) ? {sgn_update_reg3[0],~dout_abs_NF06[WIDTH-2:0]+8'd1} : {sgn_update_reg3[0],dout_abs_NF06[WIDTH-2:0]};
end
endmodule
+426
View File
@@ -0,0 +1,426 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CN_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CN_PRO
#(
parameter WIDTH = 4'd8
)
(
input clk,
input rst_CN,
input start_CN, //模块启动信号,高脉冲
//VN数据输出,H阵第1行
input [WIDTH-1:0] VN1_dout_01_00,
input [WIDTH-1:0] VN1_dout_02_00, //后面的00代表H阵原模图的IM
input [WIDTH-1:0] VN1_dout_02_01, //后面的01代表H阵原模图的II1
//VN数据输出,H阵第2行
input [WIDTH-1:0] VN2_dout_01_00,
input [WIDTH-1:0] VN2_dout_02_00,
input [WIDTH-1:0] VN2_dout_03_00,
input [WIDTH-1:0] VN2_dout_04_02, //后面的02代表H阵原模图的II2
input [WIDTH-1:0] VN2_dout_04_03, //后面的03代表H阵原模图的II3
input [WIDTH-1:0] VN2_dout_04_04, //后面的04代表H阵原模图的II4
//VN数据输出,H阵第3行
input [WIDTH-1:0] VN3_dout_01_00,
input [WIDTH-1:0] VN3_dout_02_05, //后面的05代表H阵原模图的II5
input [WIDTH-1:0] VN3_dout_02_06, //后面的06代表H阵原模图的II6
input [WIDTH-1:0] VN3_dout_03_07, //后面的07代表H阵原模图的II7
input [WIDTH-1:0] VN3_dout_03_08, //后面的08代表H阵原模图的II8
input [WIDTH-1:0] VN3_dout_04_00,
//VN读地址,H阵第1行
output reg [8:0] VN1_addr_rd_01_00=9'd511,
output reg [9:0] VN1_addr_rd_02_00=10'd1023,
output reg [9:0] VN1_addr_rd_02_01=10'd511,
//VN读地址,H阵第2行
output reg [8:0] VN2_addr_rd_01_00=9'd511,
output reg [8:0] VN2_addr_rd_02_00=9'd511,
output reg [8:0] VN2_addr_rd_03_00=9'd511,
output reg [9:0] VN2_addr_rd_04_02=10'd1023,
output reg [9:0] VN2_addr_rd_04_03=10'd511,
output reg [8:0] VN2_addr_rd_04_04=9'd511,
//VN读地址,H阵第3行
output reg [8:0] VN3_addr_rd_01_00=9'd511,
output reg [9:0] VN3_addr_rd_02_05=10'd1023,
output reg [9:0] VN3_addr_rd_02_06=10'd511,
output reg [9:0] VN3_addr_rd_03_07=10'd1023,
output reg [9:0] VN3_addr_rd_03_08=10'd511,
output reg [8:0] VN3_addr_rd_04_00=9'd511,
//CN写使能
output reg [0:0] CN_wea=1'd0,
//CN写地址,H阵第1行
output reg [8:0] CN1_addr_wr_01_00=9'd511,
output reg [9:0] CN1_addr_wr_02_00=10'd1023,
output reg [9:0] CN1_addr_wr_02_01=10'd511,
//CN写地址,H阵第2行
output reg [8:0] CN2_addr_wr_01_00=9'd511,
output reg [8:0] CN2_addr_wr_02_00=9'd511,
output reg [8:0] CN2_addr_wr_03_00=9'd511,
output reg [9:0] CN2_addr_wr_04_02=10'd1023,
output reg [9:0] CN2_addr_wr_04_03=10'd511,
output reg [8:0] CN2_addr_wr_04_04=9'd511,
//CN写地址,H阵第3行
output reg [8:0] CN3_addr_wr_01_00=9'd511,
output reg [9:0] CN3_addr_wr_02_05=10'd1023,
output reg [9:0] CN3_addr_wr_02_06=10'd511,
output reg [9:0] CN3_addr_wr_03_07=10'd1023,
output reg [9:0] CN3_addr_wr_03_08=10'd511,
output reg [8:0] CN3_addr_wr_04_00=9'd511,
//CN写数据,H阵第1行
output reg [WIDTH-1:0] CN1_din_01_00=8'd0,
output reg [WIDTH-1:0] CN1_din_02_00=8'd0,
output reg [WIDTH-1:0] CN1_din_02_01=8'd0,
//CN写数据,H阵第2行
output reg [WIDTH-1:0] CN2_din_01_00=8'd0,
output reg [WIDTH-1:0] CN2_din_02_00=8'd0,
output reg [WIDTH-1:0] CN2_din_03_00=8'd0,
output reg [WIDTH-1:0] CN2_din_04_02=8'd0,
output reg [WIDTH-1:0] CN2_din_04_03=8'd0,
output reg [WIDTH-1:0] CN2_din_04_04=8'd0,
//CN写数据,H阵第3行
output reg [WIDTH-1:0] CN3_din_01_00=8'd0,
output reg [WIDTH-1:0] CN3_din_02_05=8'd0,
output reg [WIDTH-1:0] CN3_din_02_06=8'd0,
output reg [WIDTH-1:0] CN3_din_03_07=8'd0,
output reg [WIDTH-1:0] CN3_din_03_08=8'd0,
output reg [WIDTH-1:0] CN3_din_04_00=8'd0,
output end_CN //模块结束标志,高脉冲
);
reg [10:0] cnt_CN=11'd0;
reg flag_CN=1'd0;
// 产生该模块的计数基准
always @ (posedge clk) begin
if(rst_CN) begin
cnt_CN <= 11'd0;
flag_CN <= 1'b0;
end else begin
if(start_CN) begin
flag_CN <= 1'b1;
cnt_CN <= 11'd0;
end else begin
if(flag_CN) begin
if(cnt_CN<11'd560)begin
flag_CN <= flag_CN;
cnt_CN <= cnt_CN + 11'd1;
end else begin
cnt_CN <= cnt_CN;
flag_CN<= 1'b0;
end
end else begin
cnt_CN <= cnt_CN;
end
end
end
end
// 对VN地址操作
always @ (posedge clk) begin
if (rst_CN) begin
VN1_addr_rd_01_00 <= 9'd511;
VN1_addr_rd_02_00 <= 10'd1023;
VN2_addr_rd_01_00 <= 9'd511;
VN2_addr_rd_02_00 <= 9'd511;
VN2_addr_rd_03_00 <= 9'd511;
VN3_addr_rd_01_00 <= 9'd511;
VN3_addr_rd_04_00 <= 9'd511;
VN1_addr_rd_02_01 <= 10'd511;
VN2_addr_rd_04_02 <= 10'd1023;
VN2_addr_rd_04_03 <= 10'd511;
VN2_addr_rd_04_04 <= 9'd511;
VN3_addr_rd_02_05 <= 10'd1023;
VN3_addr_rd_02_06 <= 10'd511;
VN3_addr_rd_03_07 <= 10'd1023;
VN3_addr_rd_03_08 <= 10'd511;
end else begin
if (cnt_CN >= 11'd1 && cnt_CN <= 11'd512) begin
VN1_addr_rd_01_00 <= VN1_addr_rd_01_00 + 9'd1;
VN1_addr_rd_02_00 <= VN1_addr_rd_02_00 + 9'd1;
VN2_addr_rd_01_00 <= VN2_addr_rd_01_00 + 9'd1;
VN2_addr_rd_02_00 <= VN2_addr_rd_02_00 + 9'd1;
VN2_addr_rd_03_00 <= VN2_addr_rd_03_00 + 9'd1;
VN3_addr_rd_01_00 <= VN3_addr_rd_01_00 + 9'd1;
VN3_addr_rd_04_00 <= VN3_addr_rd_04_00 + 9'd1;
VN1_addr_rd_02_01 <= VN1_addr_rd_02_01 + 10'd1;
VN2_addr_rd_04_02 <= VN2_addr_rd_04_02 + 10'd1;
VN2_addr_rd_04_03 <= VN2_addr_rd_04_03 + 10'd1;
VN2_addr_rd_04_04 <= VN2_addr_rd_04_04 + 9'd1;
VN3_addr_rd_02_05 <= VN3_addr_rd_02_05 + 10'd1;
VN3_addr_rd_02_06 <= VN3_addr_rd_02_06 + 10'd1;
VN3_addr_rd_03_07 <= VN3_addr_rd_03_07 + 10'd1;
VN3_addr_rd_03_08 <= VN3_addr_rd_03_08 + 10'd1;
end else begin
VN1_addr_rd_01_00 <= 9'd511;
VN1_addr_rd_02_00 <= 10'd1023;
VN2_addr_rd_01_00 <= 9'd511;
VN2_addr_rd_02_00 <= 9'd511;
VN2_addr_rd_03_00 <= 9'd511;
VN3_addr_rd_01_00 <= 9'd511;
VN3_addr_rd_04_00 <= 9'd511;
VN1_addr_rd_02_01 <= 10'd511;
VN2_addr_rd_04_02 <= 10'd1023;
VN2_addr_rd_04_03 <= 10'd511;
VN2_addr_rd_04_04 <= 9'd511;
VN3_addr_rd_02_05 <= 10'd1023;
VN3_addr_rd_02_06 <= 10'd511;
VN3_addr_rd_03_07 <= 10'd1023;
VN3_addr_rd_03_08 <= 10'd511;
end
end
end
wire [WIDTH-1:0] din01_VN_RU01;
wire [WIDTH-1:0] din02_VN_RU01;
wire [WIDTH-1:0] din03_VN_RU01;
wire [WIDTH-1:0] dout01_RU01 ;
wire [WIDTH-1:0] dout02_RU01 ;
wire [WIDTH-1:0] dout03_RU01 ;
wire [WIDTH-1:0] din01_VN_RU02;
wire [WIDTH-1:0] din02_VN_RU02;
wire [WIDTH-1:0] din03_VN_RU02;
wire [WIDTH-1:0] din04_VN_RU02;
wire [WIDTH-1:0] din05_VN_RU02;
wire [WIDTH-1:0] din06_VN_RU02;
wire [WIDTH-1:0] dout01_RU02 ;
wire [WIDTH-1:0] dout02_RU02 ;
wire [WIDTH-1:0] dout03_RU02 ;
wire [WIDTH-1:0] dout04_RU02 ;
wire [WIDTH-1:0] dout05_RU02 ;
wire [WIDTH-1:0] dout06_RU02 ;
wire [WIDTH-1:0] din01_VN_RU03;
wire [WIDTH-1:0] din02_VN_RU03;
wire [WIDTH-1:0] din03_VN_RU03;
wire [WIDTH-1:0] din04_VN_RU03;
wire [WIDTH-1:0] din05_VN_RU03;
wire [WIDTH-1:0] din06_VN_RU03;
wire [WIDTH-1:0] dout01_RU03 ;
wire [WIDTH-1:0] dout02_RU03 ;
wire [WIDTH-1:0] dout03_RU03 ;
wire [WIDTH-1:0] dout04_RU03 ;
wire [WIDTH-1:0] dout05_RU03 ;
wire [WIDTH-1:0] dout06_RU03 ;
CNU_3din #(.WIDTH(WIDTH)) RU_01 (
.clk(clk),
.din01_VN_RU(din01_VN_RU01),
.din02_VN_RU(din02_VN_RU01),
.din03_VN_RU(din03_VN_RU01),
.dout01_RU(dout01_RU01),
.dout02_RU(dout02_RU01),
.dout03_RU(dout03_RU01)
);
CNU_6din #(.WIDTH(WIDTH)) RU_02 (
.clk(clk),
.din01_VN_RU(din01_VN_RU02),
.din02_VN_RU(din02_VN_RU02),
.din03_VN_RU(din03_VN_RU02),
.din04_VN_RU(din04_VN_RU02),
.din05_VN_RU(din05_VN_RU02),
.din06_VN_RU(din06_VN_RU02),
.dout01_RU(dout01_RU02),
.dout02_RU(dout02_RU02),
.dout03_RU(dout03_RU02),
.dout04_RU(dout04_RU02),
.dout05_RU(dout05_RU02),
.dout06_RU(dout06_RU02)
);
CNU_6din #(.WIDTH(WIDTH)) RU_03 (
.clk(clk),
.din01_VN_RU(din01_VN_RU03),
.din02_VN_RU(din02_VN_RU03),
.din03_VN_RU(din03_VN_RU03),
.din04_VN_RU(din04_VN_RU03),
.din05_VN_RU(din05_VN_RU03),
.din06_VN_RU(din06_VN_RU03),
.dout01_RU(dout01_RU03),
.dout02_RU(dout02_RU03),
.dout03_RU(dout03_RU03),
.dout04_RU(dout04_RU03),
.dout05_RU(dout05_RU03),
.dout06_RU(dout06_RU03)
);
// 设置读操作的时延
parameter DELAY_RD = 11'd6;
// RU模块的输入
assign din01_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_01_00 : 8'd0;
assign din02_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_02_00 : 8'd0;
assign din03_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_02_01 : 8'd0;
assign din01_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_01_00 : 8'd0;
assign din02_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_02_00 : 8'd0;
assign din03_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_03_00 : 8'd0;
assign din04_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_02 : 8'd0;
assign din05_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_03 : 8'd0;
assign din06_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_04 : 8'd0;
assign din01_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_01_00 : 8'd0;
assign din02_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_02_05 : 8'd0;
assign din03_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_02_06 : 8'd0;
assign din04_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_03_07 : 8'd0;
assign din05_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_03_08 : 8'd0;
assign din06_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_04_00 : 8'd0;
// 设置写操作的时延
parameter DELAY_WR = 11'd15;
// 控制CN的写使能
always @ (posedge clk) begin
if(rst_CN) begin
CN_wea <= 1'd0;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR)
CN_wea <= 1'd1;
else
CN_wea <= 1'd0;
end
end
// 控制CN存储的写地址
always @ (posedge clk) begin
if (rst_CN) begin
CN1_addr_wr_01_00 <= 9'd511;
CN1_addr_wr_02_00 <= 10'd1023;
CN2_addr_wr_01_00 <= 9'd511;
CN2_addr_wr_02_00 <= 9'd511;
CN2_addr_wr_03_00 <= 9'd511;
CN3_addr_wr_01_00 <= 9'd511;
CN3_addr_wr_04_00 <= 9'd511;
CN1_addr_wr_02_01 <= 10'd511;
CN2_addr_wr_04_02 <= 10'd1023;
CN2_addr_wr_04_03 <= 10'd511;
CN2_addr_wr_04_04 <= 9'd511;
CN3_addr_wr_02_05 <= 10'd1023;
CN3_addr_wr_02_06 <= 10'd511;
CN3_addr_wr_03_07 <= 10'd1023;
CN3_addr_wr_03_08 <= 10'd511;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR) begin
CN1_addr_wr_01_00 <= CN1_addr_wr_01_00 + 9'd1;
CN1_addr_wr_02_00 <= CN1_addr_wr_02_00 + 9'd1;
CN2_addr_wr_01_00 <= CN2_addr_wr_01_00 + 9'd1;
CN2_addr_wr_02_00 <= CN2_addr_wr_02_00 + 9'd1;
CN2_addr_wr_03_00 <= CN2_addr_wr_03_00 + 9'd1;
CN3_addr_wr_01_00 <= CN3_addr_wr_01_00 + 9'd1;
CN3_addr_wr_04_00 <= CN3_addr_wr_04_00 + 9'd1;
CN1_addr_wr_02_01 <= CN1_addr_wr_02_01 + 10'd1;
CN2_addr_wr_04_02 <= CN2_addr_wr_04_02 + 10'd1;
CN2_addr_wr_04_03 <= CN2_addr_wr_04_03 + 10'd1;
CN2_addr_wr_04_04 <= CN2_addr_wr_04_04 + 9'd1;
CN3_addr_wr_02_05 <= CN3_addr_wr_02_05 + 10'd1;
CN3_addr_wr_02_06 <= CN3_addr_wr_02_06 + 10'd1;
CN3_addr_wr_03_07 <= CN3_addr_wr_03_07 + 10'd1;
CN3_addr_wr_03_08 <= CN3_addr_wr_03_08 + 10'd1;
end else begin
CN1_addr_wr_01_00 <= 9'd511;
CN1_addr_wr_02_00 <= 10'd1023;
CN2_addr_wr_01_00 <= 9'd511;
CN2_addr_wr_02_00 <= 9'd511;
CN2_addr_wr_03_00 <= 9'd511;
CN3_addr_wr_01_00 <= 9'd511;
CN3_addr_wr_04_00 <= 9'd511;
CN1_addr_wr_02_01 <= 10'd511;
CN2_addr_wr_04_02 <= 10'd1023;
CN2_addr_wr_04_03 <= 10'd511;
CN2_addr_wr_04_04 <= 9'd511;
CN3_addr_wr_02_05 <= 10'd1023;
CN3_addr_wr_02_06 <= 10'd511;
CN3_addr_wr_03_07 <= 10'd1023;
CN3_addr_wr_03_08 <= 10'd511;
end
end
end
// 控制CN的写数据
always @ (posedge clk) begin
if (rst_CN) begin
CN1_din_01_00 <= 8'd0;
CN1_din_02_00 <= 8'd0;
CN2_din_01_00 <= 8'd0;
CN2_din_02_00 <= 8'd0;
CN2_din_03_00 <= 8'd0;
CN3_din_01_00 <= 8'd0;
CN3_din_04_00 <= 8'd0;
CN1_din_02_01 <= 8'd0;
CN2_din_04_02 <= 8'd0;
CN2_din_04_03 <= 8'd0;
CN2_din_04_04 <= 8'd0;
CN3_din_02_05 <= 8'd0;
CN3_din_02_06 <= 8'd0;
CN3_din_03_07 <= 8'd0;
CN3_din_03_08 <= 8'd0;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR) begin
CN1_din_01_00 <= dout01_RU01;
CN1_din_02_00 <= dout02_RU01;
CN2_din_01_00 <= dout01_RU02;
CN2_din_02_00 <= dout02_RU02;
CN2_din_03_00 <= dout03_RU02;
CN3_din_01_00 <= dout01_RU03;
CN3_din_04_00 <= dout06_RU03;
CN1_din_02_01 <= dout03_RU01;
CN2_din_04_02 <= dout04_RU02;
CN2_din_04_03 <= dout05_RU02;
CN2_din_04_04 <= dout06_RU02;
CN3_din_02_05 <= dout02_RU03;
CN3_din_02_06 <= dout03_RU03;
CN3_din_03_07 <= dout04_RU03;
CN3_din_03_08 <= dout05_RU03;
end else begin
CN1_din_01_00 <= 8'd0;
CN1_din_02_00 <= 8'd0;
CN2_din_01_00 <= 8'd0;
CN2_din_02_00 <= 8'd0;
CN2_din_03_00 <= 8'd0;
CN3_din_01_00 <= 8'd0;
CN3_din_04_00 <= 8'd0;
CN1_din_02_01 <= 8'd0;
CN2_din_04_02 <= 8'd0;
CN2_din_04_03 <= 8'd0;
CN2_din_04_04 <= 8'd0;
CN3_din_02_05 <= 8'd0;
CN3_din_02_06 <= 8'd0;
CN3_din_03_07 <= 8'd0;
CN3_din_03_08 <= 8'd0;
end
end
end
//状态指示
assign end_CN = (cnt_CN == 11'd512 + DELAY_WR + 11'd2) ? 1'd1 : 1'd0;
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1074
View File
File diff suppressed because it is too large Load Diff
+193
View File
@@ -0,0 +1,193 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: LDPC_TopManage_2
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module LDPC_TopManage_2 #(
parameter WIDTH = 4'd8
) (
input clk, //工作时钟,100MHz
input Rst, //同步复位信号,高有效
input FrameSync_TM, //帧同步标志,高脉冲
input Nd_TM, //译码输入数据有效标志,高有效
input [WIDTH-1:0] Din_TM, //译码输入数据,软信息
//A
output FrameSync_A_TM, //帧同步标志,高脉冲
output Nd_A_TM, //译码输入数据有效标志,高有效
output [WIDTH-1:0] Din_A_TM, //译码输入数据,软信息
//B
output FrameSync_B_TM, //帧同步标志,高脉冲
output Nd_B_TM, //译码输入数据有效标志,高有效
output [WIDTH-1:0] Din_B_TM, //译码输入数据,软信息
// flag A
input LDPC_SyncOut_A_TM, //LDPC 模块帧同步输出信号,高脉冲,指示帧起点
input Rdy_A_TM, //译码输出信号有效标志,高有效
input [ 0:0] LDPC_Dout_A_TM, //译码输出信号
input [ 8:0] good_frames_A_TM, //译码好帧计数
input [ 8:0] bad_frames_A_TM, //译码坏帧计数
input [ 8:0] total_frames_A_TM, //译码总帧数计数
//flag B
input LDPC_SyncOut_B_TM, //LDPC 模块帧同步输出信号,高脉冲,指示帧起点
input Rdy_B_TM, //译码输出信号有效标志,高有效
input [ 0:0] LDPC_Dout_B_TM, //译码输出信号
input [ 8:0] good_frames_B_TM, //译码好帧计数
input [ 8:0] bad_frames_B_TM, //译码坏帧计数
input [ 8:0] total_frames_B_TM, //译码总帧数计数
//result
output LDPC_SyncOut_TM, //LDPC 模块帧同步输出信号,高脉冲,指示帧起点
output Rdy_TM, //译码输出信号有效标志,高有效
output [ 0:0] LDPC_Dout_TM, //译码输出信号
output [ 8:0] good_frames_TM, //译码好帧计数
output [ 8:0] bad_frames_TM, //译码坏帧计数
output [ 8:0] total_frames_TM //译码总帧数计数
);
reg FrameSync_TM_reg0, FrameSync_TM_reg1;
reg Nd_TM_reg0, Nd_TM_reg1;
reg [WIDTH-1:0] Din_TM_reg0, Din_TM_reg1;
//******输入过程控制
always @(posedge clk) begin //接收数据缓存过程
FrameSync_TM_reg0 <= FrameSync_TM;
FrameSync_TM_reg1 <= FrameSync_TM_reg0;
Nd_TM_reg0 <= Nd_TM;
Nd_TM_reg1 <= Nd_TM_reg0;
Din_TM_reg0 <= Din_TM;
Din_TM_reg1 <= Din_TM_reg0;
end
reg [0:0] flag_switch_in = 1'b1;
always @(posedge clk) begin //输入乒乓控制过程
if (Rst) begin
flag_switch_in <= 1'd1;
end
else begin
if (FrameSync_TM) begin
flag_switch_in <= ~flag_switch_in;
end
else flag_switch_in <= flag_switch_in;
end
end
assign FrameSync_A_TM = (flag_switch_in == 1'b0) ? FrameSync_TM_reg1 : 1'b0;
assign Nd_A_TM = (flag_switch_in == 1'b0) ? Nd_TM_reg1 : 1'b0;
assign Din_A_TM = (flag_switch_in == 1'b0) ? Din_TM_reg1 : 8'd0;
assign FrameSync_B_TM = (flag_switch_in == 1'b1) ? FrameSync_TM_reg1 : 1'b0;
assign Nd_B_TM = (flag_switch_in == 1'b1) ? Nd_TM_reg1 : 1'b0;
assign Din_B_TM = (flag_switch_in == 1'b1) ? Din_TM_reg1 : 8'd0;
reg LDPC_SyncOut_A_TM_reg0, LDPC_SyncOut_A_TM_reg1;
reg Rdy_A_TM_reg0, Rdy_A_TM_reg1;
reg [0:0] LDPC_Dout_A_TM_reg0, LDPC_Dout_A_TM_reg1;
reg [8:0] good_frames_A_TM_reg0, good_frames_A_TM_reg1;
reg [8:0] bad_frames_A_TM_reg0, bad_frames_A_TM_reg1;
reg [8:0] total_frames_A_TM_reg0, total_frames_A_TM_reg1;
reg LDPC_SyncOut_B_TM_reg0, LDPC_SyncOut_B_TM_reg1;
reg Rdy_B_TM_reg0, Rdy_B_TM_reg1;
reg [0:0] LDPC_Dout_B_TM_reg0, LDPC_Dout_B_TM_reg1;
reg [8:0] good_frames_B_TM_reg0, good_frames_B_TM_reg1;
reg [8:0] bad_frames_B_TM_reg0, bad_frames_B_TM_reg1;
reg [8:0] total_frames_B_TM_reg0, total_frames_B_TM_reg1;
//******输入过程控制
always @(posedge clk) begin //输出数据缓存过程
if (Rst) begin
LDPC_SyncOut_A_TM_reg0 <= 1'b0;
LDPC_SyncOut_A_TM_reg1 <= 1'b0;
Rdy_A_TM_reg0 <= 1'b0;
Rdy_A_TM_reg1 <= 1'b0;
LDPC_Dout_A_TM_reg0 <= 1'b0;
LDPC_Dout_A_TM_reg1 <= 1'b0;
good_frames_A_TM_reg0 <= 9'd0;
good_frames_A_TM_reg1 <= 9'd0;
bad_frames_A_TM_reg0 <= 9'd0;
bad_frames_A_TM_reg1 <= 9'd0;
total_frames_A_TM_reg0 <= 9'd0;
total_frames_A_TM_reg1 <= 9'd0;
LDPC_SyncOut_B_TM_reg0 <= 1'b0;
LDPC_SyncOut_B_TM_reg1 <= 1'b0;
Rdy_B_TM_reg0 <= 1'b0;
Rdy_B_TM_reg1 <= 1'b0;
LDPC_Dout_B_TM_reg0 <= 1'b0;
LDPC_Dout_B_TM_reg1 <= 1'b0;
good_frames_B_TM_reg0 <= 9'd0;
good_frames_B_TM_reg1 <= 9'd0;
bad_frames_B_TM_reg0 <= 9'd0;
bad_frames_B_TM_reg1 <= 9'd0;
total_frames_B_TM_reg0 <= 9'd0;
total_frames_B_TM_reg1 <= 9'd0;
end
else begin
LDPC_SyncOut_A_TM_reg0 <= LDPC_SyncOut_A_TM;
LDPC_SyncOut_A_TM_reg1 <= LDPC_SyncOut_A_TM_reg0;
Rdy_A_TM_reg0 <= Rdy_A_TM;
Rdy_A_TM_reg1 <= Rdy_A_TM_reg0;
LDPC_Dout_A_TM_reg0 <= LDPC_Dout_A_TM;
LDPC_Dout_A_TM_reg1 <= LDPC_Dout_A_TM_reg0;
good_frames_A_TM_reg0 <= good_frames_A_TM;
good_frames_A_TM_reg1 <= good_frames_A_TM_reg0;
bad_frames_A_TM_reg0 <= bad_frames_A_TM;
bad_frames_A_TM_reg1 <= bad_frames_A_TM_reg0;
total_frames_A_TM_reg0 <= total_frames_A_TM;
total_frames_A_TM_reg1 <= total_frames_A_TM_reg0;
LDPC_SyncOut_B_TM_reg0 <= LDPC_SyncOut_B_TM;
LDPC_SyncOut_B_TM_reg1 <= LDPC_SyncOut_B_TM_reg0;
Rdy_B_TM_reg0 <= Rdy_B_TM;
Rdy_B_TM_reg1 <= Rdy_B_TM_reg0;
LDPC_Dout_B_TM_reg0 <= LDPC_Dout_B_TM;
LDPC_Dout_B_TM_reg1 <= LDPC_Dout_B_TM_reg0;
good_frames_B_TM_reg0 <= good_frames_B_TM;
good_frames_B_TM_reg1 <= good_frames_B_TM_reg0;
bad_frames_B_TM_reg0 <= bad_frames_B_TM;
bad_frames_B_TM_reg1 <= bad_frames_B_TM_reg0;
total_frames_B_TM_reg0 <= total_frames_B_TM;
total_frames_B_TM_reg1 <= total_frames_B_TM_reg0;
end
end
reg [0:0] flag_switch_out = 1'b1;
always @(posedge clk) begin //输出乒乓控制过程
if (Rst) begin
flag_switch_out <= 1'd1;
end
else begin
if (LDPC_SyncOut_A_TM || LDPC_SyncOut_B_TM) flag_switch_out <= ~flag_switch_out;
else flag_switch_out <= flag_switch_out;
end
end
assign LDPC_SyncOut_TM = (flag_switch_out == 1'b0) ? LDPC_SyncOut_A_TM_reg1 : LDPC_SyncOut_B_TM_reg1;
assign Rdy_TM = (flag_switch_out == 1'b0) ? Rdy_A_TM_reg1 : Rdy_B_TM_reg1;
assign LDPC_Dout_TM = (flag_switch_out == 1'b0) ? LDPC_Dout_A_TM_reg1 : LDPC_Dout_B_TM_reg1;
assign good_frames_TM = good_frames_B_TM_reg1 + good_frames_A_TM_reg1;
assign bad_frames_TM = bad_frames_B_TM_reg1 + bad_frames_A_TM_reg1;
assign total_frames_TM = total_frames_B_TM_reg1 + total_frames_A_TM_reg1;
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
module MagnitudeEstimator #(
parameter VEC_WIDTH = 21
+385
View File
@@ -0,0 +1,385 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: Message_Store
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Message_Store #(
parameter WIDTH = 4'd8
) (
input clk,
input rst_MS,
input framesync_MS, //帧同步标志,高脉冲
input nd_MS, //译码输入数据有效标志,高有效
input [WIDTH-1:0] din_MS, //译码输入软信息
input [ 0:0] oe_MS, //使能输出信号,高脉冲
output deal_end_MS, //转换完成标志
output syncout_MS, //高脉冲
output rdy_MS, //高有效的连续信号
output reg [WIDTH-1:0] dout01_MS = 8'd0, // 输出数据
output reg [WIDTH-1:0] dout02_MS = 8'd0,
output reg [WIDTH-1:0] dout03_MS = 8'd0,
output reg [WIDTH-1:0] dout04_MS = 8'd0
);
reg [10:0] cnt_MS = 11'd0;
reg flag_end = 1'd0;
always @(posedge clk) begin
if (rst_MS) begin
flag_end <= 11'd0;
end
else begin
if (framesync_MS) flag_end <= 1'd1;
else if (nd_MS && cnt_MS == 11'd2047) flag_end <= 1'd0;
else flag_end <= flag_end;
end
end
// 产生基准计数
always @(posedge clk) begin
if (rst_MS) begin
cnt_MS <= 11'd0;
end
else begin
if (flag_end) begin
if (nd_MS) cnt_MS <= cnt_MS + 11'd1;
else begin
cnt_MS <= cnt_MS;
end
end
else begin
cnt_MS <= cnt_MS;
end
end
end
reg wea1_01 = 1'd0, wea1_02 = 1'd0, wea1_03 = 1'd0, wea1_04 = 1'd0, wea2_01 = 1'd0, wea2_02 = 1'd0, wea2_03 = 1'd0, wea2_04 = 1'd0;
reg [8:0] addr_wr1_01 = 9'd511, addr_wr1_02 = 9'd511, addr_wr1_03 = 9'd511, addr_wr1_04 = 9'd511, addr_wr2_01 = 9'd511, addr_wr2_02 = 9'd511, addr_wr2_03 = 9'd511, addr_wr2_04 = 9'd511;
reg [WIDTH-1:0] din1_01 = 8'd0, din1_02 = 8'd0, din1_03 = 8'd0, din1_04 = 8'd0, din2_01 = 8'd0, din2_02 = 8'd0, din2_03 = 8'd0, din2_04 = 8'd0;
reg [8:0] addr_rd1_01 = 9'd511, addr_rd1_02 = 9'd511, addr_rd1_03 = 9'd511, addr_rd1_04 = 9'd511, addr_rd2_01 = 9'd511, addr_rd2_02 = 9'd511, addr_rd2_03 = 9'd511, addr_rd2_04 = 9'd511;
wire [WIDTH-1:0] dout1_01, dout1_02, dout1_03, dout1_04, dout2_01, dout2_02, dout2_03, dout2_04;
RAM_512_8 Lp1_01 (
.clka (clk),
.wea (wea1_01),
.addra(addr_wr1_01),
.dina (din1_01),
.clkb (clk),
.addrb(addr_rd1_01),
.doutb(dout1_01)
);
RAM_512_8 Lp1_02 (
.clka (clk),
.wea (wea1_02),
.addra(addr_wr1_02),
.dina (din1_02),
.clkb (clk),
.addrb(addr_rd1_02),
.doutb(dout1_02)
);
RAM_512_8 Lp1_03 (
.clka (clk),
.wea (wea1_03),
.addra(addr_wr1_03),
.dina (din1_03),
.clkb (clk),
.addrb(addr_rd1_03),
.doutb(dout1_03)
);
RAM_512_8 Lp1_04 (
.clka (clk),
.wea (wea1_04),
.addra(addr_wr1_04),
.dina (din1_04),
.clkb (clk),
.addrb(addr_rd1_04),
.doutb(dout1_04)
);
RAM_512_8 Lp2_01 (
.clka (clk),
.wea (wea2_01),
.addra(addr_wr2_01),
.dina (din2_01),
.clkb (clk),
.addrb(addr_rd2_01),
.doutb(dout2_01)
);
RAM_512_8 Lp2_02 (
.clka (clk),
.wea (wea2_02),
.addra(addr_wr2_02),
.dina (din2_02),
.clkb (clk),
.addrb(addr_rd2_02),
.doutb(dout2_02)
);
RAM_512_8 Lp2_03 (
.clka (clk),
.wea (wea2_03),
.addra(addr_wr2_03),
.dina (din2_03),
.clkb (clk),
.addrb(addr_rd2_03),
.doutb(dout2_03)
);
RAM_512_8 Lp2_04 (
.clka (clk),
.wea (wea2_04),
.addra(addr_wr2_04),
.dina (din2_04),
.clkb (clk),
.addrb(addr_rd2_04),
.doutb(dout2_04)
);
reg flag_switch_MS = 1'd0;
always @(posedge clk) begin
if (rst_MS) flag_switch_MS <= 1'd0;
else begin
if (nd_MS && cnt_MS == 11'd2047) flag_switch_MS <= ~flag_switch_MS;
else flag_switch_MS <= flag_switch_MS;
end
end
// 乒乓写缓存过程
always @(posedge clk) begin
if (rst_MS) begin
wea1_01 <= 1'd0;
wea1_02 <= 1'd0;
wea1_03 <= 1'd0;
wea1_04 <= 1'd0;
wea2_01 <= 1'd0;
wea2_02 <= 1'd0;
wea2_03 <= 1'd0;
wea2_04 <= 1'd0;
addr_wr1_01 <= 9'd511;
addr_wr1_02 <= 9'd511;
addr_wr1_03 <= 9'd511;
addr_wr1_04 <= 9'd511;
addr_wr2_01 <= 9'd511;
addr_wr2_02 <= 9'd511;
addr_wr2_03 <= 9'd511;
addr_wr2_04 <= 9'd511;
din1_01 <= 8'd0;
din1_02 <= 8'd0;
din1_03 <= 8'd0;
din1_04 <= 8'd0;
din2_01 <= 8'd0;
din2_02 <= 8'd0;
din2_03 <= 8'd0;
din2_04 <= 8'd0;
end
else begin
if (nd_MS) //所有的写操作均在nd_MS有效时进行
if (flag_switch_MS == 1'd0) begin //写第一个缓存区
if (cnt_MS >= 11'd0 && cnt_MS < 11'd512) begin
wea1_01 <= 1'd1;
addr_wr1_01 <= addr_wr1_01 + 9'd1;
din1_01 <= din_MS;
end
else if (cnt_MS >= 11'd512 && cnt_MS < 11'd1024) begin
wea1_02 <= 1'd1;
addr_wr1_02 <= addr_wr1_02 + 9'd1;
din1_02 <= din_MS;
wea1_01 <= 1'd0;
end
else if (cnt_MS >= 11'd1024 && cnt_MS < 11'd1536) begin
wea1_03 <= 1'd1;
addr_wr1_03 <= addr_wr1_03 + 9'd1;
din1_03 <= din_MS;
wea1_02 <= 1'd0;
end
else if (cnt_MS >= 11'd1536 && cnt_MS <= 11'd2047) begin
wea1_04 <= 1'd1;
addr_wr1_04 <= addr_wr1_04 + 9'd1;
din1_04 <= din_MS;
wea1_03 <= 1'd0;
end
end
else begin
if (cnt_MS >= 11'd0 && cnt_MS < 11'd512) begin
wea2_01 <= 1'd1;
addr_wr2_01 <= addr_wr2_01 + 9'd1;
din2_01 <= din_MS;
end
else if (cnt_MS >= 11'd512 && cnt_MS < 11'd1024) begin
wea2_02 <= 1'd1;
addr_wr2_02 <= addr_wr2_02 + 9'd1;
din2_02 <= din_MS;
wea2_01 <= 1'd0;
end
else if (cnt_MS >= 11'd1024 && cnt_MS < 11'd1536) begin
wea2_03 <= 1'd1;
addr_wr2_03 <= addr_wr2_03 + 9'd1;
din2_03 <= din_MS;
wea2_02 <= 1'd0;
end
else if (cnt_MS >= 11'd1536 && cnt_MS <= 11'd2047) begin
wea2_04 <= 1'd1;
addr_wr2_04 <= addr_wr2_04 + 9'd1;
din2_04 <= din_MS;
wea2_03 <= 1'd0;
end
end
else begin
wea1_01 <= 1'd0;
wea1_02 <= 1'd0;
wea1_03 <= 1'd0;
wea1_04 <= 1'd0;
wea2_01 <= 1'd0;
wea2_02 <= 1'd0;
wea2_03 <= 1'd0;
wea2_04 <= 1'd0;
din1_01 <= 8'd0;
din1_02 <= 8'd0;
din1_03 <= 8'd0;
din1_04 <= 8'd0;
din2_01 <= 8'd0;
din2_02 <= 8'd0;
din2_03 <= 8'd0;
din2_04 <= 8'd0;
addr_wr1_01 <= addr_wr1_01;
addr_wr1_02 <= addr_wr1_02;
addr_wr1_03 <= addr_wr1_03;
addr_wr1_04 <= addr_wr1_04;
addr_wr2_01 <= addr_wr2_01;
addr_wr2_02 <= addr_wr2_02;
addr_wr2_03 <= addr_wr2_03;
addr_wr2_04 <= addr_wr2_04;
end
end
end
reg flag_out = 1'd0;
reg [10:0] cnt_out_MS = 11'd0;
// 产生输出计数器
always @(posedge clk) begin
if (rst_MS) begin
flag_out <= 1'd0;
cnt_out_MS <= 11'd0;
end
else begin
if (oe_MS) begin
flag_out <= 1'd1;
cnt_out_MS <= 11'd0;
end
else begin
if (flag_out && cnt_out_MS < 11'd540) begin
cnt_out_MS <= cnt_out_MS + 11'd1;
end
else begin
flag_out <= 1'd0;
cnt_out_MS <= cnt_out_MS;
end
end
end
end
// 控制输出缓存地址
always @(posedge clk) begin
if (rst_MS) begin
addr_rd1_01 <= 9'd511;
addr_rd1_02 <= 9'd511;
addr_rd1_03 <= 9'd511;
addr_rd1_04 <= 9'd511;
addr_rd2_01 <= 9'd511;
addr_rd2_02 <= 9'd511;
addr_rd2_03 <= 9'd511;
addr_rd2_04 <= 9'd511;
end
else begin
if (flag_switch_MS) begin // 输出缓存1中的数据
if (cnt_out_MS >= 11'd1 && cnt_out_MS <= 11'd512) begin
addr_rd1_01 <= addr_rd1_01 + 9'd1;
addr_rd1_02 <= addr_rd1_02 + 9'd1;
addr_rd1_03 <= addr_rd1_03 + 9'd1;
addr_rd1_04 <= addr_rd1_04 + 9'd1;
end
else begin
addr_rd1_01 <= 9'd511;
addr_rd1_02 <= 9'd511;
addr_rd1_03 <= 9'd511;
addr_rd1_04 <= 9'd511;
end
end
else begin // 输出缓存2中的数据
if (cnt_out_MS >= 11'd1 && cnt_out_MS <= 11'd512) begin
addr_rd2_01 <= addr_rd2_01 + 9'd1;
addr_rd2_02 <= addr_rd2_02 + 9'd1;
addr_rd2_03 <= addr_rd2_03 + 9'd1;
addr_rd2_04 <= addr_rd2_04 + 9'd1;
end
else begin
addr_rd2_01 <= 9'd511;
addr_rd2_02 <= 9'd511;
addr_rd2_03 <= 9'd511;
addr_rd2_04 <= 9'd511;
end
end
end
end
// 输出缓存数据到译码器
always @(posedge clk) begin
if (rst_MS) begin
dout01_MS <= 8'd0;
dout02_MS <= 8'd0;
dout03_MS <= 8'd0;
dout04_MS <= 8'd0;
end
else begin
if (flag_switch_MS) begin
if (cnt_out_MS >= 11'd5 && cnt_out_MS <= 11'd516) begin
dout01_MS <= dout1_01;
dout02_MS <= dout1_02;
dout03_MS <= dout1_03;
dout04_MS <= dout1_04;
end
else begin
dout01_MS <= 8'd0;
dout02_MS <= 8'd0;
dout03_MS <= 8'd0;
dout04_MS <= 8'd0;
end
end
else begin
if (cnt_out_MS >= 11'd5 && cnt_out_MS <= 11'd516) begin
dout01_MS <= dout2_01;
dout02_MS <= dout2_02;
dout03_MS <= dout2_03;
dout04_MS <= dout2_04;
end
else begin
dout01_MS <= 8'd0;
dout02_MS <= 8'd0;
dout03_MS <= 8'd0;
dout04_MS <= 8'd0;
end
end
end
end
// 输出处理完成、同步脉冲和使能标志
assign deal_end_MS = (cnt_MS == 11'd2047 && nd_MS) ? 1'd1 : 1'd0;
assign syncout_MS = (cnt_out_MS == 11'd5) ? 1'd1 : 1'd0;
assign rdy_MS = (cnt_out_MS >= 11'd6 && cnt_out_MS <= 11'd517) ? 1'd1 : 1'd0;
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+60
View File
@@ -0,0 +1,60 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 21:27:25 01/18/2018
// Design Name:
// Module Name: Normalization_Factor_0_8125
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Normalization_Factor_0_8125 #(
parameter WIDTH = 4'd8
) (
input clk,
input [WIDTH-1:0] din_NF, //输入为非负数
output reg [WIDTH-1:0] dout_NF = 8'd0 //输出相对输入延时3个时钟周期
);
reg [WIDTH-1:0] din_NF_reg0 = 8'd0, din_NF_reg1 = 8'd0;
reg [WIDTH-1:0] sum_1 = 8'd0, sum_2 = 8'd0;
always @(posedge clk) begin
din_NF_reg0 <= din_NF;
din_NF_reg1 <= din_NF_reg0;
end
always @(posedge clk) begin //对输入数据乘以系数0.8125
sum_1 <= (din_NF >> 1) + (din_NF >> 2);
sum_2 <= sum_1 + (din_NF_reg0 >> 4);
case ({
din_NF_reg1[3:0]
}) //matlab中用round函数,verilog中默认是floor函数
4'b0000: dout_NF <= sum_2 + 8'd0;
4'b0001: dout_NF <= sum_2 + 8'd1;
4'b0010: dout_NF <= sum_2 + 8'd1;
4'b0011: dout_NF <= sum_2 + 8'd1;
4'b0100: dout_NF <= sum_2 + 8'd0;
4'b0101: dout_NF <= sum_2 + 8'd1;
4'b0110: dout_NF <= sum_2 + 8'd1; //32个数,0~15和16~31的数是一样的,所以用din_NF_reg1&4'b1111,
4'b0111: dout_NF <= sum_2 + 8'd2; //例如,din_NF_reg1=6'd19,经过din_NF_reg1&4'b1111之后,变成了6'd3
4'b1000: dout_NF <= sum_2 + 8'd1;
4'b1001: dout_NF <= sum_2 + 8'd1;
4'b1010: dout_NF <= sum_2 + 8'd1;
4'b1011: dout_NF <= sum_2 + 8'd2;
4'b1100: dout_NF <= sum_2 + 8'd1;
4'b1101: dout_NF <= sum_2 + 8'd2;
4'b1110: dout_NF <= sum_2 + 8'd1;
4'b1111: dout_NF <= sum_2 + 8'd2;
default: dout_NF <= 8'd0;
endcase
end
endmodule
+144
View File
@@ -0,0 +1,144 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: OUT_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module OUT_PRO
#(
parameter OUT_ONLY_INFORMATION = 1'd0 //译码输出格式选择标志,1:只输出信息位;0:输出整个码字
)
(
input clk,
input rst_OUT,
input start_OUT,
input [0:0] DR_dout_01,
input [0:0] DR_dout_02,
input [0:0] DR_dout_03,
input [0:0] DR_dout_04,
output reg [8:0] DR_addr_rd_01=9'd511,
output reg [8:0] DR_addr_rd_02=9'd511,
output reg [8:0] DR_addr_rd_03=9'd511,
output reg [8:0] DR_addr_rd_04=9'd511,
output ldpc_syncout_OUT,
output rdy_OUT,
output reg [0:0] ldpc_dout_OUT=1'd0
);
reg [11:0] cnt_OUT=12'd0;
reg flag_OUT=1'd0;
always @ (posedge clk) begin//产生该模块的计数基准
if(rst_OUT) begin
cnt_OUT <= 12'd0;
flag_OUT <= 1'b0;
end else begin
if(start_OUT) begin
flag_OUT <= 1'b1;
cnt_OUT <= 12'd0;
end else begin
if(flag_OUT) begin
if(cnt_OUT<12'd2080)begin
flag_OUT <= flag_OUT;
cnt_OUT <= cnt_OUT + 12'd1;
end else begin
cnt_OUT <= cnt_OUT;
flag_OUT <= 1'b0;
end
end else begin
cnt_OUT <= cnt_OUT;
end
end
end
end
// 控制DR的读地址
always @ (posedge clk) begin
if (rst_OUT) begin
DR_addr_rd_01 <= 9'd511;
DR_addr_rd_02 <= 9'd511;
DR_addr_rd_03 <= 9'd511;
DR_addr_rd_04 <= 9'd511;
end else begin
if (OUT_ONLY_INFORMATION) begin // 只输出信息位
if (cnt_OUT >= 12'd1 && cnt_OUT <= 12'd512)
DR_addr_rd_01 <= DR_addr_rd_01 + 9'd1;
else if (cnt_OUT >= 12'd513 && cnt_OUT <= 12'd1024)
DR_addr_rd_02 <= DR_addr_rd_02 + 9'd1;
else begin
DR_addr_rd_01 <= 9'd511;
DR_addr_rd_02 <= 9'd511;
end
end else begin // 输出整个码字
if (cnt_OUT >= 12'd1 && cnt_OUT <= 12'd512)
DR_addr_rd_01 <= DR_addr_rd_01 + 9'd1;
else if (cnt_OUT >= 12'd513 && cnt_OUT <= 12'd1024)
DR_addr_rd_02 <= DR_addr_rd_02 + 9'd1;
else if (cnt_OUT >= 12'd1025 && cnt_OUT <= 12'd1536)
DR_addr_rd_03 <= DR_addr_rd_03 + 9'd1;
else if (cnt_OUT >= 12'd1537 && cnt_OUT <= 12'd2048)
DR_addr_rd_04 <= DR_addr_rd_04 + 9'd1;
else begin
DR_addr_rd_01 <= 9'd511;
DR_addr_rd_02 <= 9'd511;
DR_addr_rd_03 <= 9'd511;
DR_addr_rd_04 <= 9'd511;
end
end
end
end
parameter DELAY_OUT = 4'd6;
// 控制DR的输出数据到译码器的输出
always @ (posedge clk) begin
if (rst_OUT) begin
ldpc_dout_OUT <= 1'd0;
end else begin
if (OUT_ONLY_INFORMATION) begin // 只输出信息位
if (cnt_OUT >= 12'd1 + DELAY_OUT && cnt_OUT <= 12'd512 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_01;
else if (cnt_OUT >= 12'd513 + DELAY_OUT && cnt_OUT <= 12'd1024 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_02;
else
ldpc_dout_OUT <= 1'd0;
end else begin // 输出整个码字
if (cnt_OUT >= 12'd1 + DELAY_OUT && cnt_OUT <= 12'd512 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_01;
else if (cnt_OUT >= 12'd513 + DELAY_OUT && cnt_OUT <= 12'd1024 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_02;
else if (cnt_OUT >= 12'd1025 + DELAY_OUT && cnt_OUT <= 12'd1536 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_03;
else if (cnt_OUT >= 12'd1537 + DELAY_OUT && cnt_OUT <= 12'd2048 + DELAY_OUT)
ldpc_dout_OUT <= DR_dout_04;
else
ldpc_dout_OUT <= 1'd0;
end
end
end
// 产生状态指示标志
assign ldpc_syncout_OUT = (cnt_OUT == 12'd1 + DELAY_OUT) ? 1'd1 : 1'd0;
assign rdy_OUT = (OUT_ONLY_INFORMATION == 1'd0) ?
((cnt_OUT >= 12'd1 + DELAY_OUT + 12'd1 && cnt_OUT <= 12'd2048 + DELAY_OUT + 12'd1) ? 1'd1 : 1'd0) :
((cnt_OUT >= 12'd1 + DELAY_OUT + 12'd1 && cnt_OUT <= 12'd1024 + DELAY_OUT + 12'd1) ? 1'd1 : 1'd0);
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
// +------------------------------+
// | |
+144 -219
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
@@ -20,103 +20,102 @@
//////////////////////////////////////////////////////////////////////////////////
module RecvTop (
input clk,
input clk2,
input clk_60M_mac,
input clk_2x, // clk_2x
input clk_4x,
input rst,
input rst2,
input rst2, // TODO: delete the signal
// phy wave
input [11:0] dini,
input [11:0] dinq,
// mgc control
output [ 3:0] ad9361_ctrl_in,
//vio
input vio_tsync_inter16, //为1的时候启用内插,从16倍过采样中挑一路
input EQUenable_vio, //为1时启用均衡
input [ 7:0] Zerozone_vio, //零域估计,默认值为8'd29
input [ 6:0] vio_stopbit, //寻找停止位,默认值为7'd60
// stop signal
output flag_stop, //给shx,拉高8个clk表示当前时帧有效数据接收完毕
output [16:0] addr_stop, //给shx,拉高8个clk,与flag_stop对齐,指示位置与最后1bit有效数据的位置对齐
input [6:0] vio_stopbit, //寻找停止位,默认值为7'd60
//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,
// mac frame header
output [63:0] recvNetData,
output recvNetDataNd,
input debug_loss
output recvNetDataNd
);
wire rst_TimeSync;
wire rst_freq;
wire DAGC_rdy;
wire framesync; //帧同步峰
wire framesync_delay; //帧同步峰,与频率补偿输出对应
wire framesync_tsync; //帧同步标志,与TSync输出对应
wire IntpARdy; //TSync输出nd
wire nd_SC_FDE_dout; //SC_FDE输出nd
wire framerdy; //一帧译码结果存储完毕标志
reg flag_bercount = 1'd0;
reg flag_badframe = 1'd0;
reg flag_ber = 1'd0;
wire [11:0] dc_removal_dout_i; //MGC_adaptation、去直流输出
wire [11:0] dc_removal_dout_q;
wire [ 9:0] matchfilterout_i; //MF输出
wire [ 9:0] matchfilterout_q;
wire [ 9:0] DAGC_out_i; //DAGC输出
wire [ 9:0] DAGC_out_q;
wire [ 9:0] freqdataout_i; //频率补偿输出
wire [ 9:0] freqdataout_q;
wire [ 9:0] IntpOuti; //TSync输出
wire [ 9:0] IntpOutq;
wire [ 9:0] SC_FDE_douti; //SC_FDE输出
wire [ 9:0] SC_FDE_doutq;
wire [24:0] mean_temp;
wire [12:0] acc_mean;
wire [ 4:0] state_mgc;
wire mgc1_rdy;
wire flag_state_mgc;
wire [ 2:0] state_rst;
wire flag_overflow;
wire flag_small;
wire [11:0] dc_value_i;
wire [11:0] dc_value_q;
wire flag_dc;
wire flag_agch;
wire flag_agcl;
wire flag_agc_power;
wire [12:0] agc_ref;
wire [12:0] agc_check;
wire flag_powerabsh;
wire flag_powerabsl;
wire flag_abs_power;
wire [10:0] abs_ref;
wire [10:0] abs_check;
wire [ 3:0] flag_clk_4bit; //位同步选取通道结果
wire flagoverflow_fftpilot_26to14; //第1个fft结果截位,即导频fft结果的截位,26截到14
wire flagoverflow_ChnZF_26to18; //第2个fft结果截位,即ZF信道估计结果的截位,26截到18
wire flagoverflow_comdiv_34to20i; //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
wire flagoverflow_comdiv_34to20q; //第1个除法器结果截位,即复数除法结果的截位,得到没有去噪的ZF估计,34截到18
wire flagoverflow_ifftzero_29to17i; //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
wire flagoverflow_ifftzero_29to17q; //第1个ifft结果截位,即ZF零域估计处,结果先除掉低8位,29-8=21截到17
wire flagoverflow_MMSEdiv_divisor_31to28; //第2个除法器,即MMSE除法的分母截位,31截到28
wire flagoverflow_divmmse_34to11; //第2个除法器结果截位,即MMSE信道估计结果的截位,34截到11
wire flagoverflow_ifftindata_28to20i; //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
wire flagoverflow_ifftindata_28to20q; //均衡完毕后(频域结果)的截位,即乘法器输出结果的截位,28截到20
wire flagoverflow_fftdata_26to16i; //数据段ow的fft输出截位,26截到16
wire flagoverflow_fftdata_26to16q; //数据段ow的fft输出截位,26截到16
wire flagoverflow_FDE_dataout_29to10i; //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
wire flagoverflow_FDE_dataout_29to10q; //ifft结果截位,即均衡结果处,结果先除掉低8位,29-7=22截到10
reg flagoverflow = 1'd0; //总溢出标志
wire Pilot_rdy_hide1_d1;
reg [ 7:0] cnt_mgc_delay;
wire mgc_start;
wire flag_mgc_done; // level flag
wire flag_mgc_done_4x; // level flag
// startup delay
always @(posedge clk) begin
if (rst) begin
cnt_mgc_delay <= 0;
@@ -131,6 +130,7 @@ module RecvTop (
assign mgc_start = (cnt_mgc_delay == 8'hFE);
// * MGC module
ad9361_mgc_pin_ctrl u_ad9361_mgc_pin_ctrl (
.clk (clk),
.rst (rst),
@@ -141,6 +141,8 @@ module RecvTop (
.flag_mgc_done (flag_mgc_done)
);
reg MF_rdy; // flag_mgc_done_d1
wire MF_rst; // flag_mgc_done_pulse_d2
always @(posedge clk) begin
@@ -197,13 +199,14 @@ module RecvTop (
end
wire mf_fir_s_tready_i;
wire mf_fir_s_tready_q;
// Match filter
fir_match_interp4 u_fir_match_filter_interp4_i (
.aclk (clk), // input wire aclk
.s_axis_data_tvalid(flag_mgc_done), // input wire s_axis_data_tvalid
.s_axis_data_tready(), // output wire s_axis_data_tready
.s_axis_data_tready(mf_fir_s_tready_i), // output wire s_axis_data_tready
.s_axis_data_tdata ({4'd0, dini}), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid(), // output wire m_axis_data_tvalid
.m_axis_data_tdata (mf_data_interp4_i) // output wire [31 : 0] m_axis_data_tdata
@@ -211,7 +214,7 @@ module RecvTop (
fir_match_interp4 u_fir_match_filter_interp4_q (
.aclk (clk), // input wire aclk
.s_axis_data_tvalid(flag_mgc_done), // input wire s_axis_data_tvalid
.s_axis_data_tready(), // output wire s_axis_data_tready
.s_axis_data_tready(mf_fir_s_tready_q), // output wire s_axis_data_tready
.s_axis_data_tdata ({4'd0, dinq}), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid(), // output wire m_axis_data_tvalid
.m_axis_data_tdata (mf_data_interp4_q) // output wire [31 : 0] m_axis_data_tdata
@@ -252,24 +255,31 @@ module RecvTop (
.m_axis_data_tdata (dmf_tdata_interp4_q)
);
localparam CNT_CHU_SEQ_SYNC_MAX = 8;//! should not less than 3 due to the minimum rst of aresetn
wire [21:0] mag;
wire mag_valid;
wire frame_sync_4x;
wire frame_sync_pulse; // in domain clk
reg flag_frame_sync; // active high level
// calc the magnitude
wire rst_frame_sync; // derive from frame sync pulse
reg [ 7:0] cnt_chu_seq_sync; // frame sync delay to chu seq sample start pos
assign rst_frame_sync = ((cnt_chu_seq_sync >= 1) && (cnt_chu_seq_sync < CNT_CHU_SEQ_SYNC_MAX));
//* calc the magnitude
MagnitudeEstimator #(
.VEC_WIDTH(21)
) u_MagnitudeEstimator (
.clk (clk_4x),
.rst (rst),
.vec_valid(dmf_tvalid_interp4_i),
.I (dmf_tdata_interp4_i),
.Q (dmf_tdata_interp4_q),
.I (dmf_tdata_interp4_i[20:0]),
.Q (dmf_tdata_interp4_q[20:0]),
.mag (mag),
.mag_valid(mag_valid)
);
// frame sync threashold judgement
//* frame sync threashold judgement
PAPR #(
.MAG_WIDTH (22),
.WINDOW_DEPTH(1023)
@@ -279,22 +289,34 @@ module RecvTop (
.vec_mag (mag),
.mag_valid (mag_valid),
.frame_sync (frame_sync_4x),
.frame_sync_pulse()
.frame_sync_pulse() // under clk_4x
);
always @(posedge clk) begin
if (frame_sync_pulse) begin
cnt_chu_seq_sync <= 1;
end
// avoid the tailing of the convolution (here we use CNT_CHU_SEQ_SYNC_MAX clocks)
else if (cnt_chu_seq_sync >= 1 && cnt_chu_seq_sync < CNT_CHU_SEQ_SYNC_MAX) begin
cnt_chu_seq_sync <= cnt_chu_seq_sync + 1;
end
else begin
cnt_chu_seq_sync <= 0;
end
end
always @(posedge clk) begin
if (rst) begin
flag_frame_sync <= 0;
end
else if (frame_sync_pulse) begin
else if (cnt_chu_seq_sync == CNT_CHU_SEQ_SYNC_MAX) begin
flag_frame_sync <= 1;
end
else begin
flag_frame_sync <= flag_frame_sync;
end
end
// wire [9:0] DAGC_out_i;
// wire [9:0] DAGC_out_q;
wire [ 9:0] FrameSync_douti;
wire [ 9:0] FrameSync_doutq;
@@ -302,18 +324,12 @@ module RecvTop (
wire mgc_rdy;
wire rst_dagc;
//帧同步模块
assign FrameSync_dini = DAGC_out_i;
assign FrameSync_dinq = DAGC_out_q;
// wire framesync;
// * lost the connection with other nodes
reg [20:0] cnt_lost;
reg framelost;
always @(posedge clk) begin
if (Pilot_rdy_hide1_d1) begin
if (rst_frame_sync) begin
cnt_lost <= 21'd0;
framelost <= 1'b0;
end
@@ -353,13 +369,7 @@ module RecvTop (
);
//载波频偏补偿
// wire [9:0] freqdataout_i;
// wire [9:0] freqdataout_q;
// wire framesync_delay;
wire data_save; //debug用,暂不需使用
// wire rst_freq;
// CFO estimation
freqestm freqestm (
.clk (clk),
.rst (mgc_start),
@@ -376,10 +386,9 @@ module RecvTop (
//位同步
wire [1:0] cnt_tsync;
// wire framesync_tsync; //帧同步标志
TimeSync_top TimeSync_top (
.clk (clk),
.rst (Pilot_rdy_hide1_d1),
.rst (rst_frame_sync),
.dini (freqdataout_i),
.dinq (freqdataout_q),
.rdy (IntpARdy),
@@ -398,14 +407,12 @@ module RecvTop (
// SC-FDE
SC_FDE_TOP SC_FDE_TOP_djy (
.clk (clk),
.rst(Pilot_rdy_hide1_d1),
.rst (rst_frame_sync),
// param
.EQUenable_vio (EQUenable_vio), //为1时启用均衡
.Zerozone_vio (Zerozone_vio), //零域估计,默认值为8'd29
.flag_ow_left (framesync_tsync), //在一帧内,与第一个数据段的pilot的ow第一个nd对齐
.nd (IntpARdy),
.dini (IntpOuti),
@@ -414,20 +421,20 @@ module RecvTop (
.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)
.flagoverflow_fftpilot_26to14 (),
.flagoverflow_ChnZF_26to18 (),
.flagoverflow_comdiv_34to20i (),
.flagoverflow_comdiv_34to20q (),
.flagoverflow_ifftzero_29to17i (),
.flagoverflow_ifftzero_29to17q (),
.flagoverflow_MMSEdiv_divisor_31to28(),
.flagoverflow_divmmse_34to11 (),
.flagoverflow_ifftindata_28to20i (),
.flagoverflow_ifftindata_28to20q (),
.flagoverflow_fftdata_26to16i (),
.flagoverflow_fftdata_26to16q (),
.flagoverflow_FDE_dataout_29to10i (),
.flagoverflow_FDE_dataout_29to10q ()
);
@@ -436,7 +443,7 @@ module RecvTop (
wire [9:0] phase_adjust_doutq;
phase_adjust phase_adjust (
.clk (clk),
.rst (Pilot_rdy_hide1_d1),
.rst (rst_frame_sync),
.din_i (SC_FDE_douti),
.din_q (SC_FDE_doutq),
.nd (nd_SC_FDE_dout),
@@ -452,8 +459,8 @@ module RecvTop (
IQmerge IQmerge (
.clk (clk),
.clk2 (clk2),
.rst (rst2 || Pilot_rdy_hide1_d1),
.clk2 (clk_2x),
.rst (rst2 || rst_frame_sync),
.nd (phase_adjust_rdy),
.framesync (framesync_tsync),
.dini (phase_adjust_douti),
@@ -469,9 +476,10 @@ module RecvTop (
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),
.clk (clk_2x),
.Rst (rst2 || rst_frame_sync),
.FrameSync (ldpcsyncin),
.Nd (IQmergerdy),
.Din (IQmergedout),
@@ -487,89 +495,6 @@ module RecvTop (
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)
);
// ***** cdc *****
xpm_cdc_single #(
.DEST_SYNC_FF (2), // DECIMAL; range: 2-10
@@ -586,8 +511,8 @@ module RecvTop (
xpm_cdc_pulse #(
.DEST_SYNC_FF (4), // DECIMAL; range: 2-10
.INIT_SYNC_FF (0), // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
.REG_OUTPUT (0), // DECIMAL; 0=disable registered output, 1=enable registered output
.INIT_SYNC_FF (1), // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
.REG_OUTPUT (1), // DECIMAL; 0=disable registered output, 1=enable registered output
.RST_USED (0), // DECIMAL; 0=no reset, 1=implement reset
.SIM_ASSERT_CHK(1) // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
) xpm_cdc_frame_sync_pulse_inst (
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+4 -129
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
@@ -231,18 +231,18 @@ module SC_FDE_TOP(
.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 data
.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 data
.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
//flag
.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
@@ -322,10 +322,6 @@ module SC_FDE_TOP(
//------------------------------------------ifft核,及其输入输出控制器------------------------------------------//
reg ifft_config_tvalid = 1'd0;
wire ifft_config_tready;
@@ -447,10 +443,6 @@ module SC_FDE_TOP(
end
//----------------------------------------------------MMSE信道估计结果RAM--------------------------------------------------//
wire write_MMSE_wea;
wire [ 7:0] addrin_MMSE;
@@ -468,12 +460,6 @@ module SC_FDE_TOP(
.doutb(dout_MMSE) // output wire [21 : 0] doutb
);
//----------------------------------------------------MMSE信道估计模块--------------------------------------------------//
Chn_Estimate Chn_Estimate_djy (
.clk (clk),
@@ -521,12 +507,6 @@ module SC_FDE_TOP(
.flagoverflow_divmmse_34to11 (flagoverflow_divmmse_34to11) //第2个除法器结果截位,即MMSE信道估计结果的截位,34截到11
);
//------------------------------------------------------------均衡模块-------------------------------------------------------//
data_equalizer data_equalizer_djy (
@@ -576,109 +556,4 @@ module SC_FDE_TOP(
.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
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+78
View File
@@ -0,0 +1,78 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: VNU_1din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module VNU_1din(
input clk,
input [7:0] din01_CN_CU, //校验节点信息输入
input [7:0] din02_CHNL_CU, //信道信息输入
output reg [7:0] dout01_CU=8'd0,//校验节点更新输出
output reg [0:0] dout02_result_CU=1'd0//判决结果输出
);//输出相对输入延时8个周期(8)
reg [8:0] sum=9'd0;
reg [0:0] result_reg0=1'd0;
reg [0:0] result_reg1=1'd0;
reg [0:0] result_reg2=1'd0;
reg [0:0] result_reg3=1'd0;
reg [0:0] result_reg4=1'd0;
reg [8:0] din01_CN_CU_9bit=9'd0;
reg [8:0] din02_CHNL_CU_9bit=9'd0;
reg [7:0] din02_CHNL_CU_reg0=8'd0;
reg [7:0] din02_CHNL_CU_reg1=8'd0;
reg [7:0] din02_CHNL_CU_reg2=8'd0;
reg [7:0] din02_CHNL_CU_reg3=8'd0;
reg [7:0] din02_CHNL_CU_reg4=8'd0;
reg [7:0] din02_CHNL_CU_reg5=8'd0;
reg [7:0] din02_CHNL_CU_reg6=8'd0;
always @ (posedge clk) begin//先把输入转换为9bit
din01_CN_CU_9bit <= {din01_CN_CU[7],din01_CN_CU[7:0]};
din02_CHNL_CU_9bit <= {din02_CHNL_CU[7],din02_CHNL_CU[7:0]};
end
always @ (posedge clk) begin//结果更新过程
sum <= din01_CN_CU_9bit + din02_CHNL_CU_9bit;
result_reg0 <= {sum[8]};
result_reg1 <= result_reg0;
result_reg2 <= result_reg1;
result_reg3 <= result_reg2;
result_reg4 <= result_reg3;
dout02_result_CU <= result_reg4;
end
always @ (posedge clk) begin
din02_CHNL_CU_reg0 <= din02_CHNL_CU;
din02_CHNL_CU_reg1 <= din02_CHNL_CU_reg0;
din02_CHNL_CU_reg2 <= din02_CHNL_CU_reg1;
din02_CHNL_CU_reg3 <= din02_CHNL_CU_reg2;
din02_CHNL_CU_reg4 <= din02_CHNL_CU_reg3;
din02_CHNL_CU_reg5 <= din02_CHNL_CU_reg4;
din02_CHNL_CU_reg6 <= din02_CHNL_CU_reg5;
dout01_CU <= din02_CHNL_CU_reg6;
end
endmodule
+143
View File
@@ -0,0 +1,143 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: VNU_2din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module VNU_2din(//注意:所有的输入数据同时进来本模块,即数据clk是对齐的
input clk,
input [7:0] din01_CN_CU, //校验节点信息输入
input [7:0] din02_CN_CU, //校验节点信息输入
input [7:0] din03_CHNL_CU, //信道信息输入
output reg [7:0] dout01_CU=8'd0, //校验节点更新输出
output reg [7:0] dout02_CU=8'd0, //校验节点更新输出
output reg [0:0] dout03_result_CU=1'd0 //判决结果输出
);//输出相对输入延时8个周期(8)
reg [9:0] din01_CN_CU_10bit=10'd0,din01_CN_CU_10bit_reg0=10'd0,din01_CN_CU_10bit_reg1=10'd0;
reg [9:0] din02_CN_CU_10bit=10'd0,din02_CN_CU_10bit_reg0=10'd0,din02_CN_CU_10bit_reg1=10'd0;
reg [9:0] din03_CHNL_CU_10bit=10'd0;
reg [9:0] din03_CHNL_CU_10bit_reg0=10'd0;
reg [9:0] sum1=10'd0;
reg [9:0] sum=10'd0;
reg [9:0] minus1=10'd0;
reg [9:0] minus2=10'd0;
reg [9:0] minus1_reg0=10'd0;
reg [9:0] minus2_reg0=10'd0;
reg [9:0] minus1_reg1=10'd0;
reg [9:0] minus2_reg1=10'd0;
reg [9:0] minus1_reg2=10'd0;
reg [9:0] minus2_reg2=10'd0;
reg [9:0] minus1_abs=10'd0;
reg [9:0] minus2_abs=10'd0;
reg [0:0] result_reg0=1'd0;
reg [0:0] result_reg1=1'd0;
reg [0:0] result_reg2=1'd0;
reg [0:0] result_reg3=1'd0;
always @ (posedge clk) begin//先把输入转换为10bit
din01_CN_CU_10bit <= {{2{din01_CN_CU[7]}},din01_CN_CU[7:0]};
din02_CN_CU_10bit <= {{2{din02_CN_CU[7]}},din02_CN_CU[7:0]};
din03_CHNL_CU_10bit <= {{2{din03_CHNL_CU[7]}},din03_CHNL_CU[7:0]};
end
always @ (posedge clk) begin//流水延时过程
din01_CN_CU_10bit_reg0 <= din01_CN_CU_10bit;
din02_CN_CU_10bit_reg0 <= din02_CN_CU_10bit;
din01_CN_CU_10bit_reg1 <= din01_CN_CU_10bit_reg0;
din02_CN_CU_10bit_reg1 <= din02_CN_CU_10bit_reg0;
din03_CHNL_CU_10bit_reg0 <= din03_CHNL_CU_10bit;
minus1_reg0 <= minus1;
minus2_reg0 <= minus2;
minus1_reg1 <= minus1_reg0;
minus2_reg1 <= minus2_reg0;
minus1_reg2 <= minus1_reg1;
minus2_reg2 <= minus2_reg1;
end
always @ (posedge clk) begin //结果更新过程
sum1 <= din01_CN_CU_10bit + din02_CN_CU_10bit;
sum <= sum1 + din03_CHNL_CU_10bit_reg0;
result_reg0 <= {sum[9]};
result_reg1 <= result_reg0;
result_reg2 <= result_reg1;
result_reg3 <= result_reg2;
dout03_result_CU <= result_reg3;
minus1 <= sum - din01_CN_CU_10bit_reg1;
minus2 <= sum - din02_CN_CU_10bit_reg1;
if(minus1_reg1[9])//限幅前求绝对值操作
minus1_abs <= ~minus1_reg1 + 10'd1;
else
minus1_abs <= minus1_reg1;
if(minus1_reg2[9]) begin//限幅操作
if(minus1_abs>10'd127)
dout01_CU <= -8'd127;
else
dout01_CU <= {minus1_reg2[9],minus1_reg2[6:0]};
// dout01_CU <= minus1_reg2;
end else begin
if(minus1_abs>10'd127)
dout01_CU <= 8'd127;
else
dout01_CU <= {minus1_reg2[9],minus1_reg2[6:0]};
// dout01_CU <= minus1_reg2;
end
if(minus2_reg1[9])//限幅前求绝对值操作
minus2_abs <= ~minus2_reg1 + 10'd1;
else
minus2_abs <= minus2_reg1;
if(minus2_reg2[9]) begin//限幅操作
if(minus2_abs>10'd127)
dout02_CU <= -8'd127;
else
dout02_CU <= {minus2_reg2[9],minus2_reg2[6:0]};
// dout02_CU <= minus2_reg2;
end else begin
if(minus2_abs>10'd127)
dout02_CU <= 8'd127;
else
dout02_CU <= {minus2_reg2[9],minus2_reg2[6:0]};
// dout02_CU <= minus2_reg2;
end
end
endmodule
+179
View File
@@ -0,0 +1,179 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: VNU_3din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module VNU_3din(
input clk,
input [7:0] din01_CN_CU, //校验节点信息输入
input [7:0] din02_CN_CU, //校验节点信息输入
input [7:0] din03_CN_CU, //校验节点信息输入
input [7:0] din04_CHNL_CU, //信道信息输入
output reg [7:0] dout01_CU=8'd0,//校验节点更新输出
output reg [7:0] dout02_CU=8'd0,//校验节点更新输出
output reg [7:0] dout03_CU=8'd0,//校验节点更新输出
output reg [0:0] dout04_result_CU=1'd0//判决结果输出
);//输出相对输入延时8个周期(8)
reg [9:0] din01_CN_CU_10bit=10'd0;
reg [9:0] din02_CN_CU_10bit=10'd0;
reg [9:0] din03_CN_CU_10bit=10'd0;
reg [9:0] din01_CN_CU_10bit_reg0=10'd0;
reg [9:0] din02_CN_CU_10bit_reg0=10'd0;
reg [9:0] din03_CN_CU_10bit_reg0=10'd0;
reg [9:0] din01_CN_CU_10bit_reg1=10'd0;
reg [9:0] din02_CN_CU_10bit_reg1=10'd0;
reg [9:0] din03_CN_CU_10bit_reg1=10'd0;
reg [9:0] din04_CHNL_CU_10bit=10'd0;
reg [9:0] sum1=10'd0;
reg [9:0] sum2=10'd0;
reg [9:0] sum=10'd0;
reg [9:0] minus1=10'd0;
reg [9:0] minus2=10'd0;
reg [9:0] minus3=10'd0;
reg [9:0] minus1_reg0=10'd0;
reg [9:0] minus2_reg0=10'd0;
reg [9:0] minus3_reg0=10'd0;
reg [9:0] minus1_reg1=10'd0;
reg [9:0] minus2_reg1=10'd0;
reg [9:0] minus3_reg1=10'd0;
reg [9:0] minus1_reg2=10'd0;
reg [9:0] minus2_reg2=10'd0;
reg [9:0] minus3_reg2=10'd0;
reg [9:0] minus1_abs=10'd0;
reg [9:0] minus2_abs=10'd0;
reg [9:0] minus3_abs=10'd0;
reg [0:0] result_reg0=1'd0;
reg [0:0] result_reg1=1'd0;
reg [0:0] result_reg2=1'd0;
reg [0:0] result_reg3=1'd0;
always @ (posedge clk) begin//先把输入转换为10bit
din01_CN_CU_10bit <= {{2{din01_CN_CU[7]}},din01_CN_CU[7:0]};
din02_CN_CU_10bit <= {{2{din02_CN_CU[7]}},din02_CN_CU[7:0]};
din03_CN_CU_10bit <= {{2{din03_CN_CU[7]}},din03_CN_CU[7:0]};
din04_CHNL_CU_10bit <= {{2{din04_CHNL_CU[7]}},din04_CHNL_CU[7:0]};
end
always @ (posedge clk) begin//流水延时过程
din01_CN_CU_10bit_reg0 <= din01_CN_CU_10bit;
din02_CN_CU_10bit_reg0 <= din02_CN_CU_10bit;
din03_CN_CU_10bit_reg0 <= din03_CN_CU_10bit;
din01_CN_CU_10bit_reg1 <= din01_CN_CU_10bit_reg0;
din02_CN_CU_10bit_reg1 <= din02_CN_CU_10bit_reg0;
din03_CN_CU_10bit_reg1 <= din03_CN_CU_10bit_reg0;
minus1_reg0 <= minus1;
minus2_reg0 <= minus2;
minus3_reg0 <= minus3;
minus1_reg1 <= minus1_reg0;
minus2_reg1 <= minus2_reg0;
minus3_reg1 <= minus3_reg0;
minus1_reg2 <= minus1_reg1;
minus2_reg2 <= minus2_reg1;
minus3_reg2 <= minus3_reg1;
end
always @ (posedge clk) begin//结果更新过程
sum1 <= din01_CN_CU_10bit + din02_CN_CU_10bit;
sum2 <= din03_CN_CU_10bit + din04_CHNL_CU_10bit;
sum <= sum1 + sum2;
result_reg0 <= {sum[9]};
result_reg1 <= result_reg0;
result_reg2 <= result_reg1;
result_reg3 <= result_reg2;
dout04_result_CU <= result_reg3;
minus1 <= sum - din01_CN_CU_10bit_reg1;
minus2 <= sum - din02_CN_CU_10bit_reg1;
minus3 <= sum - din03_CN_CU_10bit_reg1;
if(minus1_reg1[9])//限幅前求绝对值操作
minus1_abs <= ~minus1_reg1 + 10'd1;
else
minus1_abs <= minus1_reg1;
if(minus1_reg2[9]) begin//限幅操作
if(minus1_abs>10'd127)
dout01_CU <= -8'd127;
else
dout01_CU <= {minus1_reg2[9],minus1_reg2[6:0]};
// dout01_CU <= minus1_reg2;
end else begin
if(minus1_abs>10'd127)
dout01_CU <= 8'd127;
else
dout01_CU <= {minus1_reg2[9],minus1_reg2[6:0]};
// dout01_CU <= minus1_reg2;
end
if(minus2_reg1[9])//限幅前求绝对值操作
minus2_abs <= ~minus2_reg1 + 10'd1;
else
minus2_abs <= minus2_reg1;
if(minus2_reg2[9]) begin//限幅操作
if(minus2_abs>10'd127)
dout02_CU <= -8'd127;
else
dout02_CU <= {minus2_reg2[9],minus2_reg2[6:0]};
// dout02_CU <= minus2_reg2;
end else begin
if(minus2_abs>10'd127)
dout02_CU <= 8'd127;
else
dout02_CU <= {minus2_reg2[9],minus2_reg2[6:0]};
// dout02_CU <= minus2_reg2;
end
if(minus3_reg1[9])//限幅前求绝对值操作
minus3_abs <= ~minus3_reg1 + 10'd1;
else
minus3_abs <= minus3_reg1;
if(minus3_reg2[9]) begin//限幅操作
if(minus3_abs>10'd127)
dout03_CU <= -8'd127;
else
dout03_CU <= {minus3_reg2[9],minus3_reg2[6:0]};
// dout03_CU <= minus3_reg2;
end else begin
if(minus3_abs>10'd127)
dout03_CU <= 8'd127;
else
dout03_CU <= {minus3_reg2[9],minus3_reg2[6:0]};
// dout03_CU <= minus3_reg2;
end
end
endmodule
+292
View File
@@ -0,0 +1,292 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: VNU_6din
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module VNU_6din(
input clk,
input [7:0] din01_CN_CU, //校验节点信息输入
input [7:0] din02_CN_CU, //校验节点信息输入
input [7:0] din03_CN_CU, //校验节点信息输入
input [7:0] din04_CN_CU, //校验节点信息输入
input [7:0] din05_CN_CU, //校验节点信息输入
input [7:0] din06_CN_CU, //校验节点信息输入
input [7:0] din07_CHNL_CU, //信道信息输入
output reg [7:0] dout01_CU=8'd0,//校验节点更新输出
output reg [7:0] dout02_CU=8'd0,//校验节点更新输出
output reg [7:0] dout03_CU=8'd0,//校验节点更新输出
output reg [7:0] dout04_CU=8'd0,//校验节点更新输出
output reg [7:0] dout05_CU=8'd0,//校验节点更新输出
output reg [7:0] dout06_CU=8'd0,//校验节点更新输出
output reg [0:0] dout07_result_CU=1'd0//判决结果输出
);//输出相对输入延时8个周期
reg [10:0] din01_CN_CU_11bit=11'd0;
reg [10:0] din02_CN_CU_11bit=11'd0;
reg [10:0] din03_CN_CU_11bit=11'd0;
reg [10:0] din04_CN_CU_11bit=11'd0;
reg [10:0] din05_CN_CU_11bit=11'd0;
reg [10:0] din06_CN_CU_11bit=11'd0;
reg [10:0] din01_CN_CU_11bit_reg0=11'd0;
reg [10:0] din02_CN_CU_11bit_reg0=11'd0;
reg [10:0] din03_CN_CU_11bit_reg0=11'd0;
reg [10:0] din04_CN_CU_11bit_reg0=11'd0;
reg [10:0] din05_CN_CU_11bit_reg0=11'd0;
reg [10:0] din06_CN_CU_11bit_reg0=11'd0;
reg [10:0] din01_CN_CU_11bit_reg1=11'd0;
reg [10:0] din02_CN_CU_11bit_reg1=11'd0;
reg [10:0] din03_CN_CU_11bit_reg1=11'd0;
reg [10:0] din04_CN_CU_11bit_reg1=11'd0;
reg [10:0] din05_CN_CU_11bit_reg1=11'd0;
reg [10:0] din06_CN_CU_11bit_reg1=11'd0;
reg [10:0] din01_CN_CU_11bit_reg2=11'd0;
reg [10:0] din02_CN_CU_11bit_reg2=11'd0;
reg [10:0] din03_CN_CU_11bit_reg2=11'd0;
reg [10:0] din04_CN_CU_11bit_reg2=11'd0;
reg [10:0] din05_CN_CU_11bit_reg2=11'd0;
reg [10:0] din06_CN_CU_11bit_reg2=11'd0;
reg [10:0] din07_CHNL_CU_11bit=11'd0;
reg [10:0] din07_CHNL_CU_11bit_reg0=11'd0;
reg [10:0] sum1=11'd0;
reg [10:0] sum2=11'd0;
reg [10:0] sum3=11'd0;
reg [10:0] sum4=11'd0;
reg [10:0] sum5=11'd0;
reg [10:0] sum=11'd0;
reg [10:0] minus1=11'd0;
reg [10:0] minus2=11'd0;
reg [10:0] minus3=11'd0;
reg [10:0] minus4=11'd0;
reg [10:0] minus5=11'd0;
reg [10:0] minus6=11'd0;
reg [10:0] minus1_reg0=11'd0;
reg [10:0] minus2_reg0=11'd0;
reg [10:0] minus3_reg0=11'd0;
reg [10:0] minus4_reg0=11'd0;
reg [10:0] minus5_reg0=11'd0;
reg [10:0] minus6_reg0=11'd0;
reg [10:0] minus1_reg1=11'd0;
reg [10:0] minus2_reg1=11'd0;
reg [10:0] minus3_reg1=11'd0;
reg [10:0] minus4_reg1=11'd0;
reg [10:0] minus5_reg1=11'd0;
reg [10:0] minus6_reg1=11'd0;
reg [10:0] minus1_abs=11'd0;
reg [10:0] minus2_abs=11'd0;
reg [10:0] minus3_abs=11'd0;
reg [10:0] minus4_abs=11'd0;
reg [10:0] minus5_abs=11'd0;
reg [10:0] minus6_abs=11'd0;
reg [0:0] result_reg0=1'd0;
reg [0:0] result_reg1=1'd0;
reg [0:0] result_reg2=1'd0;
always @ (posedge clk) begin//先把输入转换为11bit
din01_CN_CU_11bit <= {{3{din01_CN_CU[7]}},din01_CN_CU[7:0]};
din02_CN_CU_11bit <= {{3{din02_CN_CU[7]}},din02_CN_CU[7:0]};
din03_CN_CU_11bit <= {{3{din03_CN_CU[7]}},din03_CN_CU[7:0]};
din04_CN_CU_11bit <= {{3{din04_CN_CU[7]}},din04_CN_CU[7:0]};
din05_CN_CU_11bit <= {{3{din05_CN_CU[7]}},din05_CN_CU[7:0]};
din06_CN_CU_11bit <= {{3{din06_CN_CU[7]}},din06_CN_CU[7:0]};
din07_CHNL_CU_11bit <= {{3{din07_CHNL_CU[7]}},din07_CHNL_CU[7:0]};
end
always @ (posedge clk) begin//流水延时过程
din01_CN_CU_11bit_reg0 <= din01_CN_CU_11bit;
din02_CN_CU_11bit_reg0 <= din02_CN_CU_11bit;
din03_CN_CU_11bit_reg0 <= din03_CN_CU_11bit;
din04_CN_CU_11bit_reg0 <= din04_CN_CU_11bit;
din05_CN_CU_11bit_reg0 <= din05_CN_CU_11bit;
din06_CN_CU_11bit_reg0 <= din06_CN_CU_11bit;
din07_CHNL_CU_11bit_reg0 <= din07_CHNL_CU_11bit;
din01_CN_CU_11bit_reg1 <= din01_CN_CU_11bit_reg0;
din02_CN_CU_11bit_reg1 <= din02_CN_CU_11bit_reg0;
din03_CN_CU_11bit_reg1 <= din03_CN_CU_11bit_reg0;
din04_CN_CU_11bit_reg1 <= din04_CN_CU_11bit_reg0;
din05_CN_CU_11bit_reg1 <= din05_CN_CU_11bit_reg0;
din06_CN_CU_11bit_reg1 <= din06_CN_CU_11bit_reg0;
din01_CN_CU_11bit_reg2 <= din01_CN_CU_11bit_reg1;
din02_CN_CU_11bit_reg2 <= din02_CN_CU_11bit_reg1;
din03_CN_CU_11bit_reg2 <= din03_CN_CU_11bit_reg1;
din04_CN_CU_11bit_reg2 <= din04_CN_CU_11bit_reg1;
din05_CN_CU_11bit_reg2 <= din05_CN_CU_11bit_reg1;
din06_CN_CU_11bit_reg2 <= din06_CN_CU_11bit_reg1;
minus1_reg0 <= minus1;
minus2_reg0 <= minus2;
minus3_reg0 <= minus3;
minus4_reg0 <= minus4;
minus5_reg0 <= minus5;
minus6_reg0 <= minus6;
minus1_reg1 <= minus1_reg0;
minus2_reg1 <= minus2_reg0;
minus3_reg1 <= minus3_reg0;
minus4_reg1 <= minus4_reg0;
minus5_reg1 <= minus5_reg0;
minus6_reg1 <= minus6_reg0;
end
always @ (posedge clk) begin//结果更新过程
sum1 <= din01_CN_CU_11bit + din02_CN_CU_11bit;
sum2 <= din03_CN_CU_11bit + din04_CN_CU_11bit;
sum3 <= din05_CN_CU_11bit + din06_CN_CU_11bit;
sum4 <= sum1 + sum2;
sum5 <= sum3 + din07_CHNL_CU_11bit_reg0;
sum <= sum4 + sum5;
result_reg0 <= {sum[10]};
result_reg1 <= result_reg0;
result_reg2 <= result_reg1;
dout07_result_CU <= result_reg2;
minus1 <= sum - din01_CN_CU_11bit_reg2;
minus2 <= sum - din02_CN_CU_11bit_reg2;
minus3 <= sum - din03_CN_CU_11bit_reg2;
minus4 <= sum - din04_CN_CU_11bit_reg2;
minus5 <= sum - din05_CN_CU_11bit_reg2;
minus6 <= sum - din06_CN_CU_11bit_reg2;
if(minus1_reg0[10])//限幅前求绝对值操作
minus1_abs <= ~minus1_reg0 + 11'd1;
else
minus1_abs <= minus1_reg0;
if(minus1_reg1[10]) begin//限幅操作
if(minus1_abs>11'd127)
dout01_CU <= -8'd127;
else
dout01_CU <= {minus1_reg1[10],minus1_reg1[6:0]};
// dout01_CU <= minus1_reg1;
end else begin
if(minus1_abs>11'd127)
dout01_CU <= 8'd127;
else
dout01_CU <= {minus1_reg1[10],minus1_reg1[6:0]};
// dout01_CU <= minus1_reg1;
end
if(minus2_reg0[10])//限幅前求绝对值操作
minus2_abs <= ~minus2_reg0 + 11'd1;
else
minus2_abs <= minus2_reg0;
if(minus2_reg1[10]) begin//限幅操作
if(minus2_abs>11'd127)
dout02_CU <= -8'd127;
else
dout02_CU <= {minus2_reg1[10],minus2_reg1[6:0]};
// dout02_CU <= minus2_reg1;
end else begin
if(minus2_abs>11'd127)
dout02_CU <= 8'd127;
else
dout02_CU <= {minus2_reg1[10],minus2_reg1[6:0]};
// dout02_CU <= minus2_reg1;
end
if(minus3_reg0[10])//限幅前求绝对值操作
minus3_abs <= ~minus3_reg0 + 11'd1;
else
minus3_abs <= minus3_reg0;
if(minus3_reg1[10]) begin//限幅操作
if(minus3_abs>11'd127)
dout03_CU <= -8'd127;
else
dout03_CU <= {minus3_reg1[10],minus3_reg1[6:0]};
// dout03_CU <= minus3_reg1;
end else begin
if(minus3_abs>11'd127)
dout03_CU <= 8'd127;
else
dout03_CU <= {minus3_reg1[10],minus3_reg1[6:0]};
// dout03_CU <= minus3_reg1;
end
if(minus4_reg0[10])//限幅前求绝对值操作
minus4_abs <= ~minus4_reg0 + 11'd1;
else
minus4_abs <= minus4_reg0;
if(minus4_reg1[10]) begin//限幅操作
if(minus4_abs>11'd127)
dout04_CU <= -8'd127;
else
dout04_CU <= {minus4_reg1[10],minus4_reg1[6:0]};
// dout04_CU <= minus4_reg1;
end else begin
if(minus4_abs>11'd127)
dout04_CU <= 8'd127;
else
dout04_CU <= {minus4_reg1[10],minus4_reg1[6:0]};
// dout04_CU <= minus4_reg1;
end
if(minus5_reg0[10])//限幅前求绝对值操作
minus5_abs <= ~minus5_reg0 + 11'd1;
else
minus5_abs <= minus5_reg0;
if(minus5_reg1[10]) begin//限幅操作
if(minus5_abs>11'd127)
dout05_CU <= -8'd127;
else
dout05_CU <= {minus5_reg1[10],minus5_reg1[6:0]};
// dout05_CU <= minus5_reg1;
end else begin
if(minus5_abs>11'd127)
dout05_CU <= 8'd127;
else
dout05_CU <= {minus5_reg1[10],minus5_reg1[6:0]};
// dout05_CU <= minus5_reg1;
end
if(minus6_reg0[10])//限幅前求绝对值操作
minus6_abs <= ~minus6_reg0 + 11'd1;
else
minus6_abs <= minus6_reg0;
if(minus6_reg1[10]) begin//限幅操作
if(minus6_abs>11'd127)
dout06_CU <= -8'd127;
else
dout06_CU <= {minus6_reg1[10],minus6_reg1[6:0]};
// dout06_CU <= minus6_reg1;
end else begin
if(minus6_abs>11'd127)
dout06_CU <= 8'd127;
else
dout06_CU <= {minus6_reg1[10],minus6_reg1[6:0]};
// dout06_CU <= minus6_reg1;
end
end
endmodule
+937
View File
@@ -0,0 +1,937 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: VN_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module VN_PRO
#(
parameter MAX_ITER_NUM = 6'd14, //最大迭代次数
parameter WIDTH = 4'd8
)
(
input clk,
input rst_VN,
input start_VN, // VN更新启动脉冲
input start_frame_VN, // VN更新启动脉冲(新的1帧的开始)
input [WIDTH-1:0] CHNL_dout_01,//信道信息输入
input [WIDTH-1:0] CHNL_dout_02,
input [WIDTH-1:0] CHNL_dout_03,
input [WIDTH-1:0] CHNL_dout_04,
//校验节点信息输入,H阵第1行
input [WIDTH-1:0] CN1_dout_01_00,
input [WIDTH-1:0] CN1_dout_02_00, //后面的00代表H阵原模图的IM
input [WIDTH-1:0] CN1_dout_02_01, //后面的01代表H阵原模图的II1
input [WIDTH-1:0] CN2_dout_01_00,
input [WIDTH-1:0] CN2_dout_02_00,
input [WIDTH-1:0] CN2_dout_03_00,
input [WIDTH-1:0] CN2_dout_04_02, //后面的02代表H阵原模图的II2
input [WIDTH-1:0] CN2_dout_04_03, //后面的03代表H阵原模图的II3
input [WIDTH-1:0] CN2_dout_04_04, //后面的04代表H阵原模图的II4
//校验节点信息输入,H阵第3行
input [WIDTH-1:0] CN3_dout_01_00,
input [WIDTH-1:0] CN3_dout_02_05, //后面的05代表H阵原模图的II5
input [WIDTH-1:0] CN3_dout_02_06, //后面的06代表H阵原模图的II6
input [WIDTH-1:0] CN3_dout_03_07, //后面的07代表H阵原模图的II7
input [WIDTH-1:0] CN3_dout_03_08, //后面的08代表H阵原模图的II8
input [WIDTH-1:0] CN3_dout_04_00,
output ask_din, //向数据缓存区请求信道数据
//校验节点信息读地址,H阵第1行
output reg [8:0] CN1_addr_rd_01_00=9'd511,
output reg [9:0] CN1_addr_rd_02_00=10'd1023,
output reg [9:0] CN1_addr_rd_02_01=10'd511,
//校验节点信息读地址,H阵第2行
output reg [8:0] CN2_addr_rd_01_00=9'd511,
output reg [8:0] CN2_addr_rd_02_00=9'd511,
output reg [8:0] CN2_addr_rd_03_00=9'd511,
output reg [9:0] CN2_addr_rd_04_02=10'd1023,
output reg [9:0] CN2_addr_rd_04_03=10'd511,
output reg [8:0] CN2_addr_rd_04_04=9'd511,
//校验节点信息读地址,H阵第3行
output reg [8:0] CN3_addr_rd_01_00=9'd511,
output reg [9:0] CN3_addr_rd_02_05=10'd1023,
output reg [9:0] CN3_addr_rd_02_06=10'd511,
output reg [9:0] CN3_addr_rd_03_07=10'd1023,
output reg [9:0] CN3_addr_rd_03_08=10'd511,
output reg [8:0] CN3_addr_rd_04_00=9'd511,
//变量节点写使能
output reg [0:0] VN_wea=1'd0,
//变量节点写地址,H阵第1行
output reg [8:0] VN1_addr_wr_01_00=9'd511,
output reg [9:0] VN1_addr_wr_02_00=10'd1023,
output reg [9:0] VN1_addr_wr_02_01=10'd511,
//变量节点写地址,H阵第2行
output reg [8:0] VN2_addr_wr_01_00=9'd511,
output reg [8:0] VN2_addr_wr_02_00=9'd511,
output reg [8:0] VN2_addr_wr_03_00=9'd511,
output reg [9:0] VN2_addr_wr_04_02=10'd1023,
output reg [9:0] VN2_addr_wr_04_03=10'd511,
output reg [8:0] VN2_addr_wr_04_04=9'd511,
//变量节点写地址,H阵第3行
output reg [8:0] VN3_addr_wr_01_00=9'd511,
output reg [9:0] VN3_addr_wr_02_05=10'd1023,
output reg [9:0] VN3_addr_wr_02_06=10'd511,
output reg [9:0] VN3_addr_wr_03_07=10'd1023,
output reg [9:0] VN3_addr_wr_03_08=10'd511,
output reg [8:0] VN3_addr_wr_04_00=9'd511,
//变量节点写数据,H阵第1行
output reg [WIDTH-1:0] VN1_din_01_00=8'd0,
output reg [WIDTH-1:0] VN1_din_02_00=8'd0,
output reg [WIDTH-1:0] VN1_din_02_01=8'd0,
//变量节点写数据,H阵第2行
output reg [WIDTH-1:0] VN2_din_01_00=8'd0,
output reg [WIDTH-1:0] VN2_din_02_00=8'd0,
output reg [WIDTH-1:0] VN2_din_03_00=8'd0,
output reg [WIDTH-1:0] VN2_din_04_02=8'd0,
output reg [WIDTH-1:0] VN2_din_04_03=8'd0,
output reg [WIDTH-1:0] VN2_din_04_04=8'd0,
//变量节点写数据,H阵第3行
output reg [WIDTH-1:0] VN3_din_01_00=8'd0,
output reg [WIDTH-1:0] VN3_din_02_05=8'd0,
output reg [WIDTH-1:0] VN3_din_02_06=8'd0,
output reg [WIDTH-1:0] VN3_din_03_07=8'd0,
output reg [WIDTH-1:0] VN3_din_03_08=8'd0,
output reg [WIDTH-1:0] VN3_din_04_00=8'd0,
//判决结果写使能
output reg [0:0] DR_wea=8'd0,
//判决结果写地址
output reg [8:0] DR_addr_wr=9'd511,
output reg [0:0] DR_din_01=1'd0, //判决结果写数据
output reg [0:0] DR_din_02=1'd0,
output reg [0:0] DR_din_03=1'd0,
output reg [0:0] DR_din_04=1'd0,
output reg [0:0] DR_din_05=1'd0,
output data_start_ck_VN, //产生判决结果数据开始存储标志,高脉冲
output data_start_VN, //产生判决结果数据可以输出标志,高脉冲
output end_VN //模块结束标志,高脉冲
);
assign ask_din = (rst_VN) ? 1'd0 : ((start_VN) ? 1'd1:1'd0);
reg [5:0] iter_num = 6'd0;
// 迭代次数控制
always @ (posedge clk) begin
if (rst_VN || start_frame_VN) begin
iter_num <= 6'd0;
end else begin
if(end_VN)
if (iter_num < MAX_ITER_NUM)
iter_num <= iter_num + 6'd1;
else
iter_num <= iter_num;
else
iter_num <= iter_num;
end
end
reg [10:0] cnt_VN= 11'd0,cnt_2_VN= 11'd0;
reg flag_VN=1'd0;
// 产生该模块的计数基准
always @ (posedge clk) begin
if(rst_VN) begin
cnt_VN <= 11'd0;
cnt_2_VN <= 11'd0;
flag_VN <= 1'b0;
end else begin
if(start_VN) begin
flag_VN <= 1'b1;
cnt_VN <= 11'd0;
cnt_2_VN <= 11'd0;
end else begin
if(flag_VN) begin
if(cnt_VN<11'd560)begin
flag_VN <= flag_VN;
cnt_VN <= cnt_VN + 11'd1;
end else begin
cnt_VN <= cnt_VN;
flag_VN<= 1'b0;
end
if(cnt_2_VN<11'd560)begin
flag_VN <= flag_VN;
cnt_2_VN <= cnt_2_VN + 11'd1;
end else begin
cnt_2_VN <= cnt_2_VN;
flag_VN<= 1'b0;
end
end else begin
cnt_VN <= cnt_VN;
cnt_2_VN <= cnt_2_VN;
end
end
end
end
parameter DELAY_RD = 11'd3;
// 对所有IM进行CN地址操作
always @ (posedge clk) begin
if (rst_VN) begin
CN1_addr_rd_01_00 <= 9'd511;
CN1_addr_rd_02_00 <= 10'd1023;
CN2_addr_rd_01_00 <= 9'd511;
CN2_addr_rd_02_00 <= 9'd511;
CN2_addr_rd_03_00 <= 9'd511;
CN3_addr_rd_01_00 <= 9'd511;
CN3_addr_rd_04_00 <= 9'd511;
end else begin
if (cnt_VN >= 11'd1 + DELAY_RD && cnt_VN <= 11'd512 + DELAY_RD) begin
CN1_addr_rd_01_00 <= CN1_addr_rd_01_00 + 9'd1;
CN1_addr_rd_02_00 <= CN1_addr_rd_02_00 + 10'd1;
CN2_addr_rd_01_00 <= CN2_addr_rd_01_00 + 9'd1;
CN2_addr_rd_02_00 <= CN2_addr_rd_02_00 + 9'd1;
CN2_addr_rd_03_00 <= CN2_addr_rd_03_00 + 9'd1;
CN3_addr_rd_01_00 <= CN3_addr_rd_01_00 + 9'd1;
CN3_addr_rd_04_00 <= CN3_addr_rd_04_00 + 9'd1;
end else begin
CN1_addr_rd_01_00 <= 9'd511;
CN1_addr_rd_02_00 <= 10'd1023;
CN2_addr_rd_01_00 <= 9'd511;
CN2_addr_rd_02_00 <= 9'd511;
CN2_addr_rd_03_00 <= 9'd511;
CN3_addr_rd_01_00 <= 9'd511;
CN3_addr_rd_04_00 <= 9'd511;
end
end
end
reg first_flag_cn_01=1'd1,first_flag_cn_02=1'd1,first_flag_cn_03=1'd1,first_flag_cn_04=1'd1;
reg first_flag_cn_05=1'd1,first_flag_cn_06=1'd1,first_flag_cn_07=1'd1,first_flag_cn_08=1'd1;
reg first_flag_vn_01=1'd1,first_flag_vn_02=1'd1,first_flag_vn_03=1'd1,first_flag_vn_04=1'd1;
reg first_flag_vn_05=1'd1,first_flag_vn_06=1'd1,first_flag_vn_07=1'd1,first_flag_vn_08=1'd1;
// 对II1-II8进行CN地址操作
always @ (posedge clk) begin
if (rst_VN) begin
CN1_addr_rd_02_01 <= 10'd639;
CN2_addr_rd_04_02 <= 10'd24;
CN2_addr_rd_04_03 <= 10'd926;
CN2_addr_rd_04_04 <= 9'd294;
CN3_addr_rd_02_05 <= 10'd352;
CN3_addr_rd_02_06 <= 10'd639;
CN3_addr_rd_03_07 <= 10'd12;
CN3_addr_rd_03_08 <= 10'd929;
first_flag_cn_01 <= 1'd1;
first_flag_cn_02 <= 1'd1;
first_flag_cn_03 <= 1'd1;
first_flag_cn_04 <= 1'd1;
first_flag_cn_05 <= 1'd1;
first_flag_cn_06 <= 1'd1;
first_flag_cn_07 <= 1'd1;
first_flag_cn_08 <= 1'd1;
end else begin
if (cnt_VN >= 11'd1 + DELAY_RD && cnt_VN <= 11'd512 + DELAY_RD) begin
//对II1地址进行操作,确保初始化地址先加1
if (first_flag_cn_05) begin
CN1_addr_rd_02_01 <= CN1_addr_rd_02_01 + 10'd1;
first_flag_cn_05 <= 1'd0;
end else begin
if (CN1_addr_rd_02_01 == 10'd1023)
CN1_addr_rd_02_01 <= 10'd624;
else if (CN1_addr_rd_02_01 == 10'd639)
CN1_addr_rd_02_01 <= 10'd512;
else
CN1_addr_rd_02_01 <= CN1_addr_rd_02_01 + 10'd1;
end
// 对II2地址进行操作
if (first_flag_cn_06) begin
CN2_addr_rd_04_02 <= CN2_addr_rd_04_02 + 10'd1;
first_flag_cn_06<= 1'd0;
end else begin
if (CN2_addr_rd_04_02 == 10'd127)
CN2_addr_rd_04_02 <= 10'd0;
else if (CN2_addr_rd_04_02 == 10'd24)
CN2_addr_rd_04_02 <= 10'd203;
else if (CN2_addr_rd_04_02 == 10'd255)
CN2_addr_rd_04_02 <= 10'd128;
else if (CN2_addr_rd_04_02 == 10'd202)
CN2_addr_rd_04_02 <= 10'd376;
else if (CN2_addr_rd_04_02 == 10'd383)
CN2_addr_rd_04_02 <= 10'd256;
else if (CN2_addr_rd_04_02 == 10'd375)
CN2_addr_rd_04_02 <= 10'd477;
else if (CN2_addr_rd_04_02 == 10'd511)
CN2_addr_rd_04_02 <= 10'd384;
else
CN2_addr_rd_04_02 <= CN2_addr_rd_04_02 + 10'd1;
end
// 对II3地址进行操作
if (first_flag_cn_07) begin
CN2_addr_rd_04_03 <= CN2_addr_rd_04_03 + 10'd1;
first_flag_cn_07 <= 1'd0;
end else begin
if (CN2_addr_rd_04_03 == 10'd1023)
CN2_addr_rd_04_03 <= 10'd896;
else if (CN2_addr_rd_04_03 == 10'd926)
CN2_addr_rd_04_03 <= 10'd535;
else if (CN2_addr_rd_04_03 == 10'd639)
CN2_addr_rd_04_03 <= 10'd512;
else if (CN2_addr_rd_04_03 == 10'd534)
CN2_addr_rd_04_03 <= 10'd694;
else if (CN2_addr_rd_04_03 == 10'd767)
CN2_addr_rd_04_03 <= 10'd640;
else if (CN2_addr_rd_04_03 == 10'd693)
CN2_addr_rd_04_03 <= 10'd777;
else if (CN2_addr_rd_04_03 == 10'd895)
CN2_addr_rd_04_03 <= 10'd768;
else
CN2_addr_rd_04_03 <= CN2_addr_rd_04_03 + 10'd1;
end
// 对II4地址进行操作
if (first_flag_cn_08) begin
CN2_addr_rd_04_04 <= CN2_addr_rd_04_04 + 9'd1;
first_flag_cn_08 <= 1'd0;
end else begin
if (CN2_addr_rd_04_04 == 9'd383)
CN2_addr_rd_04_04 <= 9'd256;
else if (CN2_addr_rd_04_04 == 9'd294)
CN2_addr_rd_04_04 <= 9'd400;
else if (CN2_addr_rd_04_04 == 9'd511)
CN2_addr_rd_04_04 <= 9'd384;
else if (CN2_addr_rd_04_04 == 9'd399)
CN2_addr_rd_04_04 <= 9'd0;
else if (CN2_addr_rd_04_04 == 9'd127)
CN2_addr_rd_04_04 <= 9'd211;
else if (CN2_addr_rd_04_04 == 9'd255)
CN2_addr_rd_04_04 <= 9'd128;
else
CN2_addr_rd_04_04 <= CN2_addr_rd_04_04 + 9'd1;
end
// 对II5地址进行操作
if (first_flag_cn_01) begin //确保初始化地址先加1
CN3_addr_rd_02_05 <= CN3_addr_rd_02_05 + 10'd1;
first_flag_cn_01 <= 1'd0;
end else begin
if (CN3_addr_rd_02_05 == 10'd383)
CN3_addr_rd_02_05 <= 10'd256;
else if (CN3_addr_rd_02_05 == 10'd352)
CN3_addr_rd_02_05 <= 10'd448;
else if (CN3_addr_rd_02_05 == 10'd511)
CN3_addr_rd_02_05 <= 10'd384;
else if (CN3_addr_rd_02_05 == 10'd447)
CN3_addr_rd_02_05 <= 10'd78;
else if (CN3_addr_rd_02_05 == 10'd127)
CN3_addr_rd_02_05 <= 10'd0;
else if (CN3_addr_rd_02_05 == 10'd77)
CN3_addr_rd_02_05 <= 10'd209;
else if (CN3_addr_rd_02_05 == 10'd255)
CN3_addr_rd_02_05 <= 10'd128;
else
CN3_addr_rd_02_05 <= CN3_addr_rd_02_05 + 10'd1;
end
// 对II6地址进行操作
if (first_flag_cn_02) begin
CN3_addr_rd_02_06 <= CN3_addr_rd_02_06 + 10'd1;
first_flag_cn_02 <= 1'd0;
end else begin
if (CN3_addr_rd_02_06 == 10'd767)
CN3_addr_rd_02_06 <= 10'd774;
else if (CN3_addr_rd_02_06 == 10'd895)
CN3_addr_rd_02_06 <= 10'd768;
else if (CN3_addr_rd_02_06 == 10'd773)
CN3_addr_rd_02_06 <= 10'd931;
else if (CN3_addr_rd_02_06 == 10'd1023)
CN3_addr_rd_02_06 <= 10'd896;
else if (CN3_addr_rd_02_06 == 10'd930)
CN3_addr_rd_02_06 <= 10'd611;
else if (CN3_addr_rd_02_06 == 10'd639)
CN3_addr_rd_02_06 <= 10'd512;
else
CN3_addr_rd_02_06 <= CN3_addr_rd_02_06 + 10'd1;
end
// 对II7地址进行操作
if (first_flag_cn_03) begin //确保初始化地址先加1
CN3_addr_rd_03_07 <= CN3_addr_rd_03_07 + 10'd1;
first_flag_cn_03 <= 1'd0;
end else begin
if (CN3_addr_rd_03_07 == 10'd127)
CN3_addr_rd_03_07 <= 10'd0;
else if (CN3_addr_rd_03_07 == 10'd12)
CN3_addr_rd_03_07 <= 10'd197;
else if (CN3_addr_rd_03_07 == 10'd255)
CN3_addr_rd_03_07 <= 10'd128;
else if (CN3_addr_rd_03_07 == 10'd196)
CN3_addr_rd_03_07 <= 10'd383;
else if (CN3_addr_rd_03_07 == 10'd383)
CN3_addr_rd_03_07 <= 10'd256;
else if (CN3_addr_rd_03_07 == 10'd382)
CN3_addr_rd_03_07 <= 10'd413;
else if (CN3_addr_rd_03_07 == 10'd511)
CN3_addr_rd_03_07 <= 10'd384;
else
CN3_addr_rd_03_07 <= CN3_addr_rd_03_07 + 10'd1;
end
// 对II8地址进行操作
if (first_flag_cn_04) begin
CN3_addr_rd_03_08 <= CN3_addr_rd_03_08 + 10'd1;
first_flag_cn_04 <= 1'd0;
end else begin
if (CN3_addr_rd_03_08 == 10'd1023)
CN3_addr_rd_03_08 <= 10'd896;
else if (CN3_addr_rd_03_08 == 10'd929)
CN3_addr_rd_03_08 <= 10'd610;
else if (CN3_addr_rd_03_08 == 10'd639)
CN3_addr_rd_03_08 <= 10'd512;
else if (CN3_addr_rd_03_08 == 10'd609)
CN3_addr_rd_03_08 <= 10'd666;
else if (CN3_addr_rd_03_08 == 10'd767)
CN3_addr_rd_03_08 <= 10'd640;
else if (CN3_addr_rd_03_08 == 10'd665)
CN3_addr_rd_03_08 <= 10'd827;
else if (CN3_addr_rd_03_08 == 10'd895)
CN3_addr_rd_03_08 <= 10'd768;
else
CN3_addr_rd_03_08 <= CN3_addr_rd_03_08 + 10'd1;
end
end else begin
CN1_addr_rd_02_01 <= 10'd639;
CN2_addr_rd_04_02 <= 10'd24;
CN2_addr_rd_04_03 <= 10'd926;
CN2_addr_rd_04_04 <= 9'd294;
CN3_addr_rd_02_05 <= 10'd352;
CN3_addr_rd_02_06 <= 10'd639;
CN3_addr_rd_03_07 <= 10'd12;
CN3_addr_rd_03_08 <= 10'd929;
first_flag_cn_01 <= 1'd1;
first_flag_cn_02 <= 1'd1;
first_flag_cn_03 <= 1'd1;
first_flag_cn_04 <= 1'd1;
first_flag_cn_05 <= 1'd1;
first_flag_cn_06 <= 1'd1;
first_flag_cn_07 <= 1'd1;
first_flag_cn_08 <= 1'd1;
end
end
end
wire [WIDTH-1:0] din01_CN_CU01; //第1列更新处理单元信号定义
wire [WIDTH-1:0] din02_CN_CU01;
wire [WIDTH-1:0] din03_CHNL_CU01;
wire [WIDTH-1:0] dout01_CU01;
wire [WIDTH-1:0] dout02_CU01;
wire [0:0] dout03_result_CU01;
wire [WIDTH-1:0] din01_CN_CU02; //第2列更新处理单元信号定义
wire [WIDTH-1:0] din02_CN_CU02;
wire [WIDTH-1:0] din03_CN_CU02;
wire [WIDTH-1:0] din04_CHNL_CU02;
wire [WIDTH-1:0] dout01_CU02;
wire [WIDTH-1:0] dout02_CU02;
wire [WIDTH-1:0] dout03_CU02;
wire [0:0] dout04_result_CU02;
wire [WIDTH-1:0] din01_CN_CU03; //第3列更新处理单元信号定义
wire [WIDTH-1:0] din02_CHNL_CU03;
wire [WIDTH-1:0] dout01_CU03;
wire [0:0] dout02_result_CU03;
wire [WIDTH-1:0] din01_CN_CU04; //第4列更新处理单元信号定义
wire [WIDTH-1:0] din02_CN_CU04;
wire [WIDTH-1:0] din03_CN_CU04;
wire [WIDTH-1:0] din04_CHNL_CU04;
wire [WIDTH-1:0] dout01_CU04;
wire [WIDTH-1:0] dout02_CU04;
wire [WIDTH-1:0] dout03_CU04;
wire [0:0] dout04_result_CU04;
wire [WIDTH-1:0] din01_CN_CU05; //第5列更新处理单元信号定义
wire [WIDTH-1:0] din02_CN_CU05;
wire [WIDTH-1:0] din03_CN_CU05;
wire [WIDTH-1:0] din04_CN_CU05;
wire [WIDTH-1:0] din05_CN_CU05;
wire [WIDTH-1:0] din06_CN_CU05;
wire [WIDTH-1:0] din07_CHNL_CU05;
wire [WIDTH-1:0] dout01_CU05;
wire [WIDTH-1:0] dout02_CU05;
wire [WIDTH-1:0] dout03_CU05;
wire [WIDTH-1:0] dout04_CU05;
wire [WIDTH-1:0] dout05_CU05;
wire [WIDTH-1:0] dout06_CU05;
wire [0:0] dout07_result_CU05;
// CU模块的输入
assign din01_CN_CU01 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_01_00;
assign din02_CN_CU01 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_01_00;
assign din01_CN_CU02 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_02_00;
assign din02_CN_CU02 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_02_05;
assign din03_CN_CU02 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_02_06;
assign din01_CN_CU03 = (iter_num == 6'd0) ? 8'd0 : CN1_dout_01_00;
assign din01_CN_CU04 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_03_00;
assign din02_CN_CU04 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_03_07;
assign din03_CN_CU04 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_03_08;
assign din01_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN1_dout_02_00;
assign din02_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN1_dout_02_01;
assign din03_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_04_02;
assign din04_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_04_03;
assign din05_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN2_dout_04_04;
assign din06_CN_CU05 = (iter_num == 6'd0) ? 8'd0 : CN3_dout_04_00;
assign din03_CHNL_CU01 = CHNL_dout_01;
assign din04_CHNL_CU02 = CHNL_dout_02;
assign din02_CHNL_CU03 = CHNL_dout_03;
assign din04_CHNL_CU04 = CHNL_dout_04;
assign din07_CHNL_CU05 = 8'd0; //信道传输的数据只有2048bit,这里H矩阵是2560bit,所以在后512位上补0
VNU_2din CU_01 (
.clk(clk),
.din01_CN_CU(din01_CN_CU01),
.din02_CN_CU(din02_CN_CU01),
.din03_CHNL_CU(din03_CHNL_CU01),
.dout01_CU(dout01_CU01),
.dout02_CU(dout02_CU01),
.dout03_result_CU(dout03_result_CU01));
VNU_3din CU_02 (
.clk(clk),
.din01_CN_CU(din01_CN_CU02),
.din02_CN_CU(din02_CN_CU02),
.din03_CN_CU(din03_CN_CU02),
.din04_CHNL_CU(din04_CHNL_CU02),
.dout01_CU(dout01_CU02),
.dout02_CU(dout02_CU02),
.dout03_CU(dout03_CU02),
.dout04_result_CU(dout04_result_CU02)
);
VNU_1din CU_03 (.clk(clk),
.din01_CN_CU(din01_CN_CU03),
.din02_CHNL_CU(din02_CHNL_CU03),
.dout01_CU(dout01_CU03),
.dout02_result_CU(dout02_result_CU03));
VNU_3din CU_04 (
.clk(clk),
.din01_CN_CU(din01_CN_CU04),
.din02_CN_CU(din02_CN_CU04),
.din03_CN_CU(din03_CN_CU04),
.din04_CHNL_CU(din04_CHNL_CU04),
.dout01_CU(dout01_CU04),
.dout02_CU(dout02_CU04),
.dout03_CU(dout03_CU04),
.dout04_result_CU(dout04_result_CU04)
);
VNU_6din CU_05 (
.clk(clk),
.din01_CN_CU(din01_CN_CU05),
.din02_CN_CU(din02_CN_CU05),
.din03_CN_CU(din03_CN_CU05),
.din04_CN_CU(din04_CN_CU05),
.din05_CN_CU(din05_CN_CU05),
.din06_CN_CU(din06_CN_CU05),
.din07_CHNL_CU(din07_CHNL_CU05),
.dout01_CU(dout01_CU05),
.dout02_CU(dout02_CU05),
.dout03_CU(dout03_CU05),
.dout04_CU(dout04_CU05),
.dout05_CU(dout05_CU05),
.dout06_CU(dout06_CU05),
.dout07_result_CU(dout07_result_CU05)
);
// 设置写操作的时延
parameter DELAY_WR = 11'd17;
// 控制VN的写使能
always @ (posedge clk) begin
if(rst_VN) begin
VN_wea <= 1'd0;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR)
VN_wea <= 1'd1;
else
VN_wea <= 1'd0;
end
end
// 控制VN存储的写地址(所有IM)
always @ (posedge clk) begin
if (rst_VN) begin
VN1_addr_wr_01_00 <= 9'd511;
VN1_addr_wr_02_00 <= 10'd1023;
VN2_addr_wr_01_00 <= 9'd511;
VN2_addr_wr_02_00 <= 9'd511;
VN2_addr_wr_03_00 <= 9'd511;
VN3_addr_wr_01_00 <= 9'd511;
VN3_addr_wr_04_00 <= 9'd511;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR) begin
VN1_addr_wr_01_00 <= VN1_addr_wr_01_00 + 9'd1;
VN1_addr_wr_02_00 <= VN1_addr_wr_02_00 + 10'd1;
VN2_addr_wr_01_00 <= VN2_addr_wr_01_00 + 9'd1;
VN2_addr_wr_02_00 <= VN2_addr_wr_02_00 + 9'd1;
VN2_addr_wr_03_00 <= VN2_addr_wr_03_00 + 9'd1;
VN3_addr_wr_01_00 <= VN3_addr_wr_01_00 + 9'd1;
VN3_addr_wr_04_00 <= VN3_addr_wr_04_00 + 9'd1;
end else begin
VN1_addr_wr_01_00 <= 9'd511;
VN1_addr_wr_02_00 <= 10'd1023;
VN2_addr_wr_01_00 <= 9'd511;
VN2_addr_wr_02_00 <= 9'd511;
VN2_addr_wr_03_00 <= 9'd511;
VN3_addr_wr_01_00 <= 9'd511;
VN3_addr_wr_04_00 <= 9'd511;
end
end
end
// 控制VN存储的写地址(II1-II8)
always @ (posedge clk) begin
if (rst_VN) begin
VN1_addr_wr_02_01 <= 10'd639;
VN2_addr_wr_04_02 <= 10'd24;
VN2_addr_wr_04_03 <= 10'd926;
VN2_addr_wr_04_04 <= 9'd294;
VN3_addr_wr_02_05 <= 10'd352;
VN3_addr_wr_02_06 <= 10'd639;
VN3_addr_wr_03_07 <= 10'd12;
VN3_addr_wr_03_08 <= 10'd929;
first_flag_vn_01 <= 1'd1;
first_flag_vn_02 <= 1'd1;
first_flag_vn_03 <= 1'd1;
first_flag_vn_04 <= 1'd1;
first_flag_vn_05 <= 1'd1;
first_flag_vn_06 <= 1'd1;
first_flag_vn_07 <= 1'd1;
first_flag_vn_08 <= 1'd1;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR) begin
//对II1地址进行操作,确保初始化地址先加1
if (first_flag_vn_05) begin
VN1_addr_wr_02_01 <= VN1_addr_wr_02_01 + 10'd1;
first_flag_vn_05 <= 1'd0;
end else begin
if (VN1_addr_wr_02_01 == 10'd1023)
VN1_addr_wr_02_01 <= 10'd624;
else if (VN1_addr_wr_02_01 == 10'd639)
VN1_addr_wr_02_01 <= 10'd512;
else
VN1_addr_wr_02_01 <= VN1_addr_wr_02_01 + 10'd1;
end
// 对II2地址进行操作
if (first_flag_vn_06) begin
VN2_addr_wr_04_02 <= VN2_addr_wr_04_02 + 10'd1;
first_flag_vn_06<= 1'd0;
end else begin
if (VN2_addr_wr_04_02 == 10'd127)
VN2_addr_wr_04_02 <= 10'd0;
else if (VN2_addr_wr_04_02 == 10'd24)
VN2_addr_wr_04_02 <= 10'd203;
else if (VN2_addr_wr_04_02 == 10'd255)
VN2_addr_wr_04_02 <= 10'd128;
else if (VN2_addr_wr_04_02 == 10'd202)
VN2_addr_wr_04_02 <= 10'd376;
else if (VN2_addr_wr_04_02 == 10'd383)
VN2_addr_wr_04_02 <= 10'd256;
else if (VN2_addr_wr_04_02 == 10'd375)
VN2_addr_wr_04_02 <= 10'd477;
else if (VN2_addr_wr_04_02 == 10'd511)
VN2_addr_wr_04_02 <= 10'd384;
else
VN2_addr_wr_04_02 <= VN2_addr_wr_04_02 + 10'd1;
end
// 对II3地址进行操作
if (first_flag_vn_07) begin
VN2_addr_wr_04_03 <= VN2_addr_wr_04_03 + 10'd1;
first_flag_vn_07 <= 1'd0;
end else begin
if (VN2_addr_wr_04_03 == 10'd1023)
VN2_addr_wr_04_03 <= 10'd896;
else if (VN2_addr_wr_04_03 == 10'd926)
VN2_addr_wr_04_03 <= 10'd535;
else if (VN2_addr_wr_04_03 == 10'd639)
VN2_addr_wr_04_03 <= 10'd512;
else if (VN2_addr_wr_04_03 == 10'd534)
VN2_addr_wr_04_03 <= 10'd694;
else if (VN2_addr_wr_04_03 == 10'd767)
VN2_addr_wr_04_03 <= 10'd640;
else if (VN2_addr_wr_04_03 == 10'd693)
VN2_addr_wr_04_03 <= 10'd777;
else if (VN2_addr_wr_04_03 == 10'd895)
VN2_addr_wr_04_03 <= 10'd768;
else
VN2_addr_wr_04_03 <= VN2_addr_wr_04_03 + 10'd1;
end
// 对II4地址进行操作
if (first_flag_vn_08) begin
VN2_addr_wr_04_04 <= VN2_addr_wr_04_04 + 9'd1;
first_flag_vn_08 <= 1'd0;
end else begin
if (VN2_addr_wr_04_04 == 9'd383)
VN2_addr_wr_04_04 <= 9'd256;
else if (VN2_addr_wr_04_04 == 9'd294)
VN2_addr_wr_04_04 <= 9'd400;
else if (VN2_addr_wr_04_04 == 9'd511)
VN2_addr_wr_04_04 <= 9'd384;
else if (VN2_addr_wr_04_04 == 9'd399)
VN2_addr_wr_04_04 <= 9'd0;
else if (VN2_addr_wr_04_04 == 9'd127)
VN2_addr_wr_04_04 <= 9'd211;
else if (VN2_addr_wr_04_04 == 9'd255)
VN2_addr_wr_04_04 <= 9'd128;
else
VN2_addr_wr_04_04 <= VN2_addr_wr_04_04 + 9'd1;
end
// 对II5地址进行操作
if (first_flag_vn_01) begin //确保初始化地址先加1
VN3_addr_wr_02_05 <= VN3_addr_wr_02_05 + 10'd1;
first_flag_vn_01 <= 1'd0;
end else begin
if (VN3_addr_wr_02_05 == 10'd383)
VN3_addr_wr_02_05 <= 10'd256;
else if (VN3_addr_wr_02_05 == 10'd352)
VN3_addr_wr_02_05 <= 10'd448;
else if (VN3_addr_wr_02_05 == 10'd511)
VN3_addr_wr_02_05 <= 10'd384;
else if (VN3_addr_wr_02_05 == 10'd447)
VN3_addr_wr_02_05 <= 10'd78;
else if (VN3_addr_wr_02_05 == 10'd127)
VN3_addr_wr_02_05 <= 10'd0;
else if (VN3_addr_wr_02_05 == 10'd77)
VN3_addr_wr_02_05 <= 10'd209;
else if (VN3_addr_wr_02_05 == 10'd255)
VN3_addr_wr_02_05 <= 10'd128;
else
VN3_addr_wr_02_05 <= VN3_addr_wr_02_05 + 10'd1;
end
// 对II6地址进行操作
if (first_flag_vn_02) begin
VN3_addr_wr_02_06 <= VN3_addr_wr_02_06 + 10'd1;
first_flag_vn_02 <= 1'd0;
end else begin
if (VN3_addr_wr_02_06 == 10'd767)
VN3_addr_wr_02_06 <= 10'd774;
else if (VN3_addr_wr_02_06 == 10'd895)
VN3_addr_wr_02_06 <= 10'd768;
else if (VN3_addr_wr_02_06 == 10'd773)
VN3_addr_wr_02_06 <= 10'd931;
else if (VN3_addr_wr_02_06 == 10'd1023)
VN3_addr_wr_02_06 <= 10'd896;
else if (VN3_addr_wr_02_06 == 10'd930)
VN3_addr_wr_02_06 <= 10'd611;
else if (VN3_addr_wr_02_06 == 10'd639)
VN3_addr_wr_02_06 <= 10'd512;
else
VN3_addr_wr_02_06 <= VN3_addr_wr_02_06 + 10'd1;
end
// 对II7地址进行操作
if (first_flag_vn_03) begin //确保初始化地址先加1
VN3_addr_wr_03_07 <= VN3_addr_wr_03_07 + 10'd1;
first_flag_vn_03 <= 1'd0;
end else begin
if (VN3_addr_wr_03_07 == 10'd127)
VN3_addr_wr_03_07 <= 10'd0;
else if (VN3_addr_wr_03_07 == 10'd12)
VN3_addr_wr_03_07 <= 10'd197;
else if (VN3_addr_wr_03_07 == 10'd255)
VN3_addr_wr_03_07 <= 10'd128;
else if (VN3_addr_wr_03_07 == 10'd196)
VN3_addr_wr_03_07 <= 10'd383;
else if (VN3_addr_wr_03_07 == 10'd383)
VN3_addr_wr_03_07 <= 10'd256;
else if (VN3_addr_wr_03_07 == 10'd382)
VN3_addr_wr_03_07 <= 10'd413;
else if (VN3_addr_wr_03_07 == 10'd511)
VN3_addr_wr_03_07 <= 10'd384;
else
VN3_addr_wr_03_07 <= VN3_addr_wr_03_07 + 10'd1;
end
// 对II8地址进行操作
if (first_flag_vn_04) begin
VN3_addr_wr_03_08 <= VN3_addr_wr_03_08 + 10'd1;
first_flag_vn_04 <= 1'd0;
end else begin
if (VN3_addr_wr_03_08 == 10'd1023)
VN3_addr_wr_03_08 <= 10'd896;
else if (VN3_addr_wr_03_08 == 10'd929)
VN3_addr_wr_03_08 <= 10'd610;
else if (VN3_addr_wr_03_08 == 10'd639)
VN3_addr_wr_03_08 <= 10'd512;
else if (VN3_addr_wr_03_08 == 10'd609)
VN3_addr_wr_03_08 <= 10'd666;
else if (VN3_addr_wr_03_08 == 10'd767)
VN3_addr_wr_03_08 <= 10'd640;
else if (VN3_addr_wr_03_08 == 10'd665)
VN3_addr_wr_03_08 <= 10'd827;
else if (VN3_addr_wr_03_08 == 10'd895)
VN3_addr_wr_03_08 <= 10'd768;
else
VN3_addr_wr_03_08 <= VN3_addr_wr_03_08 + 10'd1;
end
end else begin
VN1_addr_wr_02_01 <= 10'd639;
VN2_addr_wr_04_02 <= 10'd24;
VN2_addr_wr_04_03 <= 10'd926;
VN2_addr_wr_04_04 <= 9'd294;
VN3_addr_wr_02_05 <= 10'd352;
VN3_addr_wr_02_06 <= 10'd639;
VN3_addr_wr_03_07 <= 10'd12;
VN3_addr_wr_03_08 <= 10'd929;
first_flag_vn_01 <= 1'd1;
first_flag_vn_02 <= 1'd1;
first_flag_vn_03 <= 1'd1;
first_flag_vn_04 <= 1'd1;
first_flag_vn_05 <= 1'd1;
first_flag_vn_06 <= 1'd1;
first_flag_vn_07 <= 1'd1;
first_flag_vn_08 <= 1'd1;
end
end
end
// 控制VN的写数据
always @ (posedge clk) begin
if (rst_VN) begin
VN1_din_01_00 <= 8'd0;
VN1_din_02_00 <= 8'd0;
VN2_din_01_00 <= 8'd0;
VN2_din_02_00 <= 8'd0;
VN2_din_03_00 <= 8'd0;
VN3_din_01_00 <= 8'd0;
VN3_din_04_00 <= 8'd0;
VN1_din_02_01 <= 8'd0;
VN2_din_04_02 <= 8'd0;
VN2_din_04_03 <= 8'd0;
VN2_din_04_04 <= 8'd0;
VN3_din_02_05 <= 8'd0;
VN3_din_02_06 <= 8'd0;
VN3_din_03_07 <= 8'd0;
VN3_din_03_08 <= 8'd0;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR) begin
VN1_din_01_00 <= dout01_CU03;
VN1_din_02_00 <= dout01_CU05;
VN2_din_01_00 <= dout01_CU01;
VN2_din_02_00 <= dout01_CU02;
VN2_din_03_00 <= dout01_CU04;
VN3_din_01_00 <= dout02_CU01;
VN3_din_04_00 <= dout06_CU05;
VN1_din_02_01 <= dout02_CU05;
VN2_din_04_02 <= dout03_CU05;
VN2_din_04_03 <= dout04_CU05;
VN2_din_04_04 <= dout05_CU05;
VN3_din_02_05 <= dout02_CU02;
VN3_din_02_06 <= dout03_CU02;
VN3_din_03_07 <= dout02_CU04;
VN3_din_03_08 <= dout03_CU04;
end else begin
VN1_din_01_00 <= 8'd0;
VN1_din_02_00 <= 8'd0;
VN2_din_01_00 <= 8'd0;
VN2_din_02_00 <= 8'd0;
VN2_din_03_00 <= 8'd0;
VN3_din_01_00 <= 8'd0;
VN3_din_04_00 <= 8'd0;
VN1_din_02_01 <= 8'd0;
VN2_din_04_02 <= 8'd0;
VN2_din_04_03 <= 8'd0;
VN2_din_04_04 <= 8'd0;
VN3_din_02_05 <= 8'd0;
VN3_din_02_06 <= 8'd0;
VN3_din_03_07 <= 8'd0;
VN3_din_03_08 <= 8'd0;
end
end
end
// 控制DR的写使能
always @ (posedge clk) begin
if(rst_VN) begin
DR_wea <= 1'd0;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR && iter_num == MAX_ITER_NUM - 1)
// 对写全能用迭代次数进行限制,防止输出译码结果时有新的数据写入
DR_wea <= 1'd1;
else
DR_wea <= 1'd0;
end
end
// 控制DR存储的写地址
always @ (posedge clk) begin
if (rst_VN) begin
DR_addr_wr <= 9'd511;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR)
DR_addr_wr <= DR_addr_wr + 9'd1;
else
DR_addr_wr <= 9'd511;
end
end
// 控制DR存储的写数据
always @ (posedge clk) begin
if (rst_VN) begin
DR_din_01 <= 1'd0;
DR_din_02 <= 1'd0;
DR_din_03 <= 1'd0;
DR_din_04 <= 1'd0;
DR_din_05 <= 1'd0;
end else begin
if (cnt_2_VN >= 11'd1 + DELAY_WR && cnt_2_VN <= 11'd512 + DELAY_WR) begin
DR_din_01 <= dout03_result_CU01;
DR_din_02 <= dout04_result_CU02;
DR_din_03 <= dout02_result_CU03;
DR_din_04 <= dout04_result_CU04;
DR_din_05 <= dout07_result_CU05;
end else begin
DR_din_01 <= 1'd0;
DR_din_02 <= 1'd0;
DR_din_03 <= 1'd0;
DR_din_04 <= 1'd0;
DR_din_05 <= 1'd0;
end
end
end
//状态指示
assign data_start_ck_VN = (cnt_VN == 11'd1 + DELAY_WR - 11'd1 && iter_num == MAX_ITER_NUM - 1) ? 1'd1 : 1'd0;
assign data_start_VN = (cnt_VN == 11'd512 + DELAY_WR + 11'd1 && iter_num == MAX_ITER_NUM - 1) ? 1'd1 : 1'd0;
assign end_VN = (cnt_VN == 11'd512 + DELAY_WR + 11'd2 && iter_num <= MAX_ITER_NUM - 2) ? 1'd1 : 1'd0;
endmodule
+51
View File
@@ -0,0 +1,51 @@
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 21:36:07 01/20/2018
// Design Name:
// Module Name: abs_min_4din
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module abs_min_4din #(
parameter WIDTH = 4'd8
) (
input clk,
input [WIDTH-1:0] din01, //din01<din02
input [WIDTH-1:0] din02,
input [WIDTH-1:0] din03, //din03<din04
input [WIDTH-1:0] din04,
output reg [WIDTH-1:0] dout_min = 8'd0,
output reg [WIDTH-1:0] dout_sec = 8'd0
); //输出相对输入延时1个周期
always @(posedge clk) begin
if (din02 <= din03) begin
dout_min <= din01;
dout_sec <= din02;
end
else begin
if (din01 <= din03) begin
dout_min <= din01;
dout_sec <= din03;
end
else begin
dout_min <= din03;
dout_sec <= (din01 < din04) ? din01 : din04;
end
end
end
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: liu yongxin
+22 -13
View File
@@ -21,7 +21,7 @@ module ad9361_mgc_pin_ctrl (
input [11:0] rx_data_q,
// this port is from zynq to ad9361
output wire [ 3:0] ad9361_ctrl_in,
output reg flag_mgc_done // active high level signal
output reg flag_mgc_done = 0 // active high level signal
);
@@ -117,15 +117,24 @@ module ad9361_mgc_pin_ctrl (
if (cnt_pulse_width == 0) begin
ns = S_DONE;
end
else begin
ns = S_IDLE;
end
end
S_DEC: begin
if (cnt_pulse_width == 0) begin
ns = S_DONE;
end
else begin
ns = S_IDLE;
end
end
S_DONE: begin
ns = S_IDLE;
end
default: begin
ns = S_IDLE;
end
endcase
end
@@ -151,18 +160,18 @@ module ad9361_mgc_pin_ctrl (
// .probe_out0(start) // output wire [0 : 0] probe_out0
// );
ila_ad9361_mgc u_ila_ad9361_mgc (
.clk (clk), // input wire clk
.probe0(start_posedge), // input wire [0:0] probe0
.probe1(rx_data_i), // input wire [11:0] probe1
.probe2(u_power_measure.cs), // input wire [2:0] probe2
.probe3(u_power_measure.sign_bit_num_i), // input wire [3:0] probe3
.probe4(u_power_measure.sign_bit_num_min_i), // input wire [3:0] probe4
.probe5(flag_too_high), // input wire [0:0] probe5
.probe6(flag_too_low), // input wire [0:0] probe6
.probe7(u_power_measure.cnt_amp_too_high), // input wire [0:0] probe6
.probe8(u_power_measure.cnt_startup) // input wire [11:0] probe6
);
// ila_ad9361_mgc u_ila_ad9361_mgc (
// .clk (clk), // input wire clk
// .probe0(start_posedge), // input wire [0:0] probe0
// .probe1(rx_data_i), // input wire [11:0] probe1
// .probe2(u_power_measure.cs), // input wire [2:0] probe2
// .probe3(u_power_measure.sign_bit_num_i), // input wire [3:0] probe3
// .probe4(u_power_measure.sign_bit_num_min_i), // input wire [3:0] probe4
// .probe5(flag_too_high), // input wire [0:0] probe5
// .probe6(flag_too_low), // input wire [0:0] probe6
// .probe7(u_power_measure.cnt_amp_too_high), // input wire [0:0] probe6
// .probe8(u_power_measure.cnt_startup) // input wire [11:0] probe6
// );
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
// * Engineer:
// * *************************************************** *
// * ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗ *
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
// * Engineer:
// * *************************************************** *
// * ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗ *
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+76
View File
@@ -0,0 +1,76 @@
`timescale 1ns / 1ns
module tb_recv_top ();
reg clk = 0;
reg clk_2x = 0;
reg clk_4x = 0;
reg rst = 1;
always #(4) clk = ~clk;
always #(2) clk_2x = ~clk_2x;
always #(1) clk_4x = ~clk_4x;
initial begin
#20 rst <= 0;
end
reg signed [11:0] ad9361_rx_data_i;
reg signed [11:0] ad9361_rx_data_q;
reg [ 9:0] k1;
reg [ 9:0] k2;
reg [11:0] mem_i [0:637049];
reg [11:0] mem_q [0:637049];
initial begin
$readmemh("C:/Users/ZoroGH/dev/vivadoPrj/MM7020/source/sim/sim_data/frame_i2_new2.txt", mem_i);
$readmemh("C:/Users/ZoroGH/dev/vivadoPrj/MM7020/source/sim/sim_data/frame_q2_new2.txt", mem_q);
$display("Read mem done ");
end
// reg [31:0] idx = 46500 - 8000;
reg [31:0] idx = 0;
always @(posedge clk) begin
idx <= idx + 1;
end
always @(posedge clk) begin
if (rst) begin
ad9361_rx_data_i <= 0;
ad9361_rx_data_q <= 0;
k1 <= 0;
k2 <= 0;
end
else begin
ad9361_rx_data_i <= $signed(k1);
ad9361_rx_data_q <= $signed(k2);
k1 <= mem_i[idx];
k2 <= mem_q[idx];
end
end
RecvTop u_RecvTop (
.clk (clk),
.clk_2x (clk_2x),
.clk_4x (clk_4x),
.rst (rst),
.rst2 (rst),
.dini (ad9361_rx_data_i),
.dinq (ad9361_rx_data_q),
.ad9361_ctrl_in (),
.vio_tsync_inter16(1),
.EQUenable_vio (1),
.Zerozone_vio (8'd29),
.vio_stopbit (7'd60),
.flag_stop (flag_stop),
.addr_stop (addr_stop),
.recvNetData (recvNetData),
.recvNetDataNd (recvNetDataNd)
);
endmodule
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
+1 -1
View File
@@ -1,4 +1,4 @@
`timescale 1ns / 1ps
`timescale 1ns / 1ns
module tb_width_convert ();