Files
MM7020/hdl/LDPC_DEC_PRO.v

1075 lines
40 KiB
Verilog
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: LDPC_DEC_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module LDPC_DEC_PRO #(
parameter MAX_ITER_NUM = 6'd14,
parameter WIDTH = 4'd8,
parameter OUT_ONLY_INFORMATION = 1'd0
) (
input clk, //工作时钟
input rst, //同步复位信号, 高有效
input start, //开始译码标志, 高脉冲
input framesync, //帧同步标志,高脉冲
input nd, //译码输入数据有效标志,高有效
input [WIDTH-1:0] din01, //译码输入数据, 软信息, 对应时刻 N
input [WIDTH-1:0] din02, //译码输入数据, 软信息, 对应时刻 N+1*512
input [WIDTH-1:0] din03, //译码输入数据, 软信息, 对应时刻 N+2*512
input [WIDTH-1:0] din04, //译码输入数据, 软信息, 对应时刻 N+3*512
output reg ask_din = 1'd0, //向上层索要译码数据标志,高脉冲
output reg [8:0] gd_frames = 9'd0, //译码好帧计数
output reg [8:0] bd_frames = 9'd0, //译码坏帧计数
output reg [8:0] tl_frames = 9'd0, //译码总帧数计数
output reg ldpc_syncout = 1'd0, //LDPC 模块帧同步输出信号,高脉冲,指示帧起点
output reg rdy = 1'd0, //译码输出信号有效标志,高有效
output reg ldpc_dout = 1'd0 //译码输出信号
);
//*****列更新模块信号定义
reg rst_VN = 1'd0;
reg start_VN = 1'd0;
reg start_frame_VN = 1'd0; //7.23 xhx 在新的一帧数据来临前清零迭代次数的计数
reg [WIDTH-1:0] CHNL_dout_01_VN = 8'd0; //信道信息输入
reg [WIDTH-1:0] CHNL_dout_02_VN = 8'd0;
reg [WIDTH-1:0] CHNL_dout_03_VN = 8'd0;
reg [WIDTH-1:0] CHNL_dout_04_VN = 8'd0;
reg [WIDTH-1:0] CN1_dout_01_00_VN = 8'd0;
reg [WIDTH-1:0] CN1_dout_02_00_VN = 8'd0; //后面的00代表H阵原模图的IM
reg [WIDTH-1:0] CN1_dout_02_01_VN = 8'd0; //后面的01代表H阵原模图的II1
reg [WIDTH-1:0] CN2_dout_01_00_VN = 8'd0;
reg [WIDTH-1:0] CN2_dout_02_00_VN = 8'd0;
reg [WIDTH-1:0] CN2_dout_03_00_VN = 8'd0;
reg [WIDTH-1:0] CN2_dout_04_02_VN = 8'd0; //后面的02代表H阵原模图的II2
reg [WIDTH-1:0] CN2_dout_04_03_VN = 8'd0; //后面的03代表H阵原模图的II3
reg [WIDTH-1:0] CN2_dout_04_04_VN = 8'd0; //后面的04代表H阵原模图的II4
reg [WIDTH-1:0] CN3_dout_01_00_VN = 8'd0;
reg [WIDTH-1:0] CN3_dout_02_05_VN = 8'd0; //后面的05代表H阵原模图的II5
reg [WIDTH-1:0] CN3_dout_02_06_VN = 8'd0; //后面的06代表H阵原模图的II6
reg [WIDTH-1:0] CN3_dout_03_07_VN = 8'd0; //后面的07代表H阵原模图的II7
reg [WIDTH-1:0] CN3_dout_03_08_VN = 8'd0; //后面的08代表H阵原模图的II8
reg [WIDTH-1:0] CN3_dout_04_00_VN = 8'd0;
wire data_start_VN;
wire data_start_ck_VN;
wire end_VN;
wire ask_din_VN;
wire VN_wea_VN;
wire [ 9:0] CN1_addr_rd_02_00_VN;
wire [ 9:0] CN1_addr_rd_02_01_VN;
wire [ 9:0] CN2_addr_rd_04_02_VN;
wire [ 9:0] CN2_addr_rd_04_03_VN;
wire [ 9:0] CN3_addr_rd_02_05_VN;
wire [ 9:0] CN3_addr_rd_02_06_VN;
wire [ 9:0] CN3_addr_rd_03_07_VN;
wire [ 9:0] CN3_addr_rd_03_08_VN;
wire [ 8:0] CN1_addr_rd_01_00_VN;
wire [ 8:0] CN2_addr_rd_01_00_VN;
wire [ 8:0] CN2_addr_rd_02_00_VN;
wire [ 8:0] CN2_addr_rd_03_00_VN;
wire [ 8:0] CN2_addr_rd_04_04_VN;
wire [ 8:0] CN3_addr_rd_01_00_VN;
wire [ 8:0] CN3_addr_rd_04_00_VN;
wire [ 8:0] VN1_addr_wr_01_00_VN;
wire [ 9:0] VN1_addr_wr_02_00_VN;
wire [ 9:0] VN1_addr_wr_02_01_VN;
wire [ 8:0] VN2_addr_wr_01_00_VN;
wire [ 8:0] VN2_addr_wr_02_00_VN;
wire [ 8:0] VN2_addr_wr_03_00_VN;
wire [ 9:0] VN2_addr_wr_04_02_VN;
wire [ 9:0] VN2_addr_wr_04_03_VN;
wire [ 8:0] VN2_addr_wr_04_04_VN;
wire [ 8:0] VN3_addr_wr_01_00_VN;
wire [ 9:0] VN3_addr_wr_02_05_VN;
wire [ 9:0] VN3_addr_wr_02_06_VN;
wire [ 9:0] VN3_addr_wr_03_07_VN;
wire [ 9:0] VN3_addr_wr_03_08_VN;
wire [ 8:0] VN3_addr_wr_04_00_VN;
wire [WIDTH-1:0] VN1_din_01_00_VN;
wire [WIDTH-1:0] VN1_din_02_00_VN;
wire [WIDTH-1:0] VN1_din_02_01_VN;
wire [WIDTH-1:0] VN2_din_01_00_VN;
wire [WIDTH-1:0] VN2_din_02_00_VN;
wire [WIDTH-1:0] VN2_din_03_00_VN;
wire [WIDTH-1:0] VN2_din_04_02_VN;
wire [WIDTH-1:0] VN2_din_04_03_VN;
wire [WIDTH-1:0] VN2_din_04_04_VN;
wire [WIDTH-1:0] VN3_din_01_00_VN;
wire [WIDTH-1:0] VN3_din_02_05_VN;
wire [WIDTH-1:0] VN3_din_02_06_VN;
wire [WIDTH-1:0] VN3_din_03_07_VN;
wire [WIDTH-1:0] VN3_din_03_08_VN;
wire [WIDTH-1:0] VN3_din_04_00_VN;
wire DR_wea_VN;
wire [ 8:0] DR_addr_wr_VN;
wire DR_din_01_VN;
wire DR_din_02_VN;
wire DR_din_03_VN;
wire DR_din_04_VN;
wire DR_din_05_VN;
//*****行更新模块信号定义
reg start_CN = 1'd0; //模块启动信号,高脉冲
reg rst_CN = 1'd0;
reg [WIDTH-1:0] VN1_dout_01_00_CN = 8'd0;
reg [WIDTH-1:0] VN1_dout_02_00_CN = 8'd0; //后面的00代表H阵原模图的IM
reg [WIDTH-1:0] VN1_dout_02_01_CN = 8'd0; //后面的01代表H阵原模图的II1
reg [WIDTH-1:0] VN2_dout_01_00_CN = 8'd0;
reg [WIDTH-1:0] VN2_dout_02_00_CN = 8'd0;
reg [WIDTH-1:0] VN2_dout_03_00_CN = 8'd0;
reg [WIDTH-1:0] VN2_dout_04_02_CN = 8'd0; //后面的02代表H阵原模图的II2
reg [WIDTH-1:0] VN2_dout_04_03_CN = 8'd0; //后面的03代表H阵原模图的II3
reg [WIDTH-1:0] VN2_dout_04_04_CN = 8'd0; //后面的04代表H阵原模图的II4
reg [WIDTH-1:0] VN3_dout_01_00_CN = 8'd0;
reg [WIDTH-1:0] VN3_dout_02_05_CN = 8'd0; //后面的05代表H阵原模图的II5
reg [WIDTH-1:0] VN3_dout_02_06_CN = 8'd0; //后面的06代表H阵原模图的II6
reg [WIDTH-1:0] VN3_dout_03_07_CN = 8'd0; //后面的07代表H阵原模图的II7
reg [WIDTH-1:0] VN3_dout_03_08_CN = 8'd0; //后面的08代表H阵原模图的II8
reg [WIDTH-1:0] VN3_dout_04_00_CN = 8'd0;
wire [ 9:0] VN1_addr_rd_02_00_CN;
wire [ 9:0] VN1_addr_rd_02_01_CN;
wire [ 9:0] VN2_addr_rd_04_02_CN;
wire [ 9:0] VN2_addr_rd_04_03_CN;
wire [ 9:0] VN3_addr_rd_02_05_CN;
wire [ 9:0] VN3_addr_rd_02_06_CN;
wire [ 9:0] VN3_addr_rd_03_07_CN;
wire [ 9:0] VN3_addr_rd_03_08_CN;
wire [ 8:0] VN1_addr_rd_01_00_CN;
wire [ 8:0] VN2_addr_rd_01_00_CN;
wire [ 8:0] VN2_addr_rd_02_00_CN;
wire [ 8:0] VN2_addr_rd_03_00_CN;
wire [ 8:0] VN2_addr_rd_04_04_CN;
wire [ 8:0] VN3_addr_rd_01_00_CN;
wire [ 8:0] VN3_addr_rd_04_00_CN;
wire CN_wea_CN;
wire [ 8:0] CN1_addr_wr_01_00_CN;
wire [ 9:0] CN1_addr_wr_02_00_CN;
wire [ 9:0] CN1_addr_wr_02_01_CN;
wire [ 8:0] CN2_addr_wr_01_00_CN;
wire [ 8:0] CN2_addr_wr_02_00_CN;
wire [ 8:0] CN2_addr_wr_03_00_CN;
wire [ 9:0] CN2_addr_wr_04_02_CN;
wire [ 9:0] CN2_addr_wr_04_03_CN;
wire [ 8:0] CN2_addr_wr_04_04_CN;
wire [ 8:0] CN3_addr_wr_01_00_CN;
wire [ 9:0] CN3_addr_wr_02_05_CN;
wire [ 9:0] CN3_addr_wr_02_06_CN;
wire [ 9:0] CN3_addr_wr_03_07_CN;
wire [ 9:0] CN3_addr_wr_03_08_CN;
wire [ 8:0] CN3_addr_wr_04_00_CN;
wire [WIDTH-1:0] CN1_din_01_00_CN;
wire [WIDTH-1:0] CN1_din_02_00_CN;
wire [WIDTH-1:0] CN1_din_02_01_CN;
wire [WIDTH-1:0] CN2_din_01_00_CN;
wire [WIDTH-1:0] CN2_din_02_00_CN;
wire [WIDTH-1:0] CN2_din_03_00_CN;
wire [WIDTH-1:0] CN2_din_04_02_CN;
wire [WIDTH-1:0] CN2_din_04_03_CN;
wire [WIDTH-1:0] CN2_din_04_04_CN;
wire [WIDTH-1:0] CN3_din_01_00_CN;
wire [WIDTH-1:0] CN3_din_02_05_CN;
wire [WIDTH-1:0] CN3_din_02_06_CN;
wire [WIDTH-1:0] CN3_din_03_07_CN;
wire [WIDTH-1:0] CN3_din_03_08_CN;
wire [WIDTH-1:0] CN3_din_04_00_CN;
wire end_CN; //模块结束标志,高脉冲
//*****校验节点信息存储RAM信号定义
reg CN_wea = 1'd0;
//RAM写地址,H阵第1行
reg [ 8:0] CN1_addr_wr_01_00 = 9'd511;
reg [ 9:0] CN1_addr_wr_02_00 = 10'd1023;
reg [ 9:0] CN1_addr_wr_02_01 = 10'd511;
//RAM写地址,H阵第2行
reg [ 8:0] CN2_addr_wr_01_00 = 9'd511;
reg [ 8:0] CN2_addr_wr_02_00 = 9'd511;
reg [ 8:0] CN2_addr_wr_03_00 = 9'd511;
reg [ 9:0] CN2_addr_wr_04_02 = 10'd1023;
reg [ 9:0] CN2_addr_wr_04_03 = 10'd511;
reg [ 8:0] CN2_addr_wr_04_04 = 9'd511;
//RAM写地址,H阵第3行
reg [ 8:0] CN3_addr_wr_01_00 = 9'd511;
reg [ 9:0] CN3_addr_wr_02_05 = 10'd1023;
reg [ 9:0] CN3_addr_wr_02_06 = 10'd511;
reg [ 9:0] CN3_addr_wr_03_07 = 10'd1023;
reg [ 9:0] CN3_addr_wr_03_08 = 10'd511;
reg [ 8:0] CN3_addr_wr_04_00 = 9'd511;
//RAM写数据,H阵第1行
reg [WIDTH-1:0] CN1_din_01_00 = 8'd0;
reg [WIDTH-1:0] CN1_din_02_00 = 8'd0;
reg [WIDTH-1:0] CN1_din_02_01 = 8'd0;
//RAM写数据,H阵第2行
reg [WIDTH-1:0] CN2_din_01_00 = 8'd0;
reg [WIDTH-1:0] CN2_din_02_00 = 8'd0;
reg [WIDTH-1:0] CN2_din_03_00 = 8'd0;
reg [WIDTH-1:0] CN2_din_04_02 = 8'd0;
reg [WIDTH-1:0] CN2_din_04_03 = 8'd0;
reg [WIDTH-1:0] CN2_din_04_04 = 8'd0;
//RAM写数据,H阵第3行
reg [WIDTH-1:0] CN3_din_01_00 = 8'd0;
reg [WIDTH-1:0] CN3_din_02_05 = 8'd0;
reg [WIDTH-1:0] CN3_din_02_06 = 8'd0;
reg [WIDTH-1:0] CN3_din_03_07 = 8'd0;
reg [WIDTH-1:0] CN3_din_03_08 = 8'd0;
reg [WIDTH-1:0] CN3_din_04_00 = 8'd0;
//RAM读地址,H阵第1行
reg [ 8:0] CN1_addr_rd_01_00 = 9'd511;
//RAM读地址,H阵第2行
reg [ 8:0] CN2_addr_rd_01_00 = 9'd511;
reg [ 8:0] CN2_addr_rd_02_00 = 9'd511; //7.23 xhx 因为IM&II1,II2&II3,II5&II6,II7&II8是两两写在真双口RAM中,读写地址是同一个,需要分情况考虑
reg [ 8:0] CN2_addr_rd_03_00 = 9'd511;
reg [ 8:0] CN2_addr_rd_04_04 = 9'd511;
//RAM读地址,H阵第3行
reg [ 8:0] CN3_addr_rd_01_00 = 9'd511;
reg [ 8:0] CN3_addr_rd_04_00 = 9'd511;
//RAM数据输出,H阵第1行
wire [WIDTH-1:0] CN1_dout_01_00;
wire [WIDTH-1:0] CN1_dout_02_00; //后面的00代表H阵原模图的IM
wire [WIDTH-1:0] CN1_dout_02_01; //后面的01代表H阵原模图的II1
//RAM数据输出,H阵第2行
wire [WIDTH-1:0] CN2_dout_01_00;
wire [WIDTH-1:0] CN2_dout_02_00;
wire [WIDTH-1:0] CN2_dout_03_00;
wire [WIDTH-1:0] CN2_dout_04_02; //后面的02代表H阵原模图的II2
wire [WIDTH-1:0] CN2_dout_04_03; //后面的03代表H阵原模图的II3
wire [WIDTH-1:0] CN2_dout_04_04; //后面的04代表H阵原模图的II4
//RAM数据输出,H阵第3行
wire [WIDTH-1:0] CN3_dout_01_00;
wire [WIDTH-1:0] CN3_dout_02_05; //后面的05代表H阵原模图的II5
wire [WIDTH-1:0] CN3_dout_02_06; //后面的06代表H阵原模图的II6
wire [WIDTH-1:0] CN3_dout_03_07; //后面的07代表H阵原模图的II7
wire [WIDTH-1:0] CN3_dout_03_08; //后面的08代表H阵原模图的II8
wire [WIDTH-1:0] CN3_dout_04_00;
//*****变量节点信息存储RAM信号定义
reg VN_wea = 1'd0;
//RAM写地址,H阵第1行
reg [ 8:0] VN1_addr_wr_01_00 = 9'd511;
reg [ 9:0] VN1_addr_wr_02_00 = 10'd1023;
reg [ 9:0] VN1_addr_wr_02_01 = 10'd511;
//RAM写地址,H阵第2行
reg [ 8:0] VN2_addr_wr_01_00 = 9'd511;
reg [ 8:0] VN2_addr_wr_02_00 = 9'd511;
reg [ 8:0] VN2_addr_wr_03_00 = 9'd511;
reg [ 9:0] VN2_addr_wr_04_02 = 10'd1023;
reg [ 9:0] VN2_addr_wr_04_03 = 10'd511;
reg [ 8:0] VN2_addr_wr_04_04 = 9'd511;
//RAM写地址,H阵第3行
reg [ 8:0] VN3_addr_wr_01_00 = 9'd511;
reg [ 9:0] VN3_addr_wr_02_05 = 10'd1023;
reg [ 9:0] VN3_addr_wr_02_06 = 10'd511;
reg [ 9:0] VN3_addr_wr_03_07 = 10'd1023;
reg [ 9:0] VN3_addr_wr_03_08 = 10'd511;
reg [ 8:0] VN3_addr_wr_04_00 = 9'd511;
//RAM写数据,H阵第1行
reg [WIDTH-1:0] VN1_din_01_00 = 8'd0;
reg [WIDTH-1:0] VN1_din_02_00 = 8'd0;
reg [WIDTH-1:0] VN1_din_02_01 = 8'd0;
//RAM写数据,H阵第2行
reg [WIDTH-1:0] VN2_din_01_00 = 8'd0;
reg [WIDTH-1:0] VN2_din_02_00 = 8'd0;
reg [WIDTH-1:0] VN2_din_03_00 = 8'd0;
reg [WIDTH-1:0] VN2_din_04_02 = 8'd0;
reg [WIDTH-1:0] VN2_din_04_03 = 8'd0;
reg [WIDTH-1:0] VN2_din_04_04 = 8'd0;
//RAM写数据,H阵第3行
reg [WIDTH-1:0] VN3_din_01_00 = 8'd0;
reg [WIDTH-1:0] VN3_din_02_05 = 8'd0;
reg [WIDTH-1:0] VN3_din_02_06 = 8'd0;
reg [WIDTH-1:0] VN3_din_03_07 = 8'd0;
reg [WIDTH-1:0] VN3_din_03_08 = 8'd0;
reg [WIDTH-1:0] VN3_din_04_00 = 8'd0;
//RAM读地址,H阵第1行
reg [ 8:0] VN1_addr_rd_01_00 = 9'd511;
//RAM读地址,H阵第2行
reg [ 8:0] VN2_addr_rd_01_00 = 9'd511;
reg [ 8:0] VN2_addr_rd_02_00 = 9'd511;
reg [ 8:0] VN2_addr_rd_03_00 = 9'd511; //7.23 xhx 同CN_RAM读地址
reg [ 8:0] VN2_addr_rd_04_04 = 9'd511;
//RAM读地址,H阵第3行
reg [ 8:0] VN3_addr_rd_01_00 = 9'd511;
reg [ 8:0] VN3_addr_rd_04_00 = 9'd511;
//RAM数据输出,H阵第1行
wire [WIDTH-1:0] VN1_dout_01_00;
wire [WIDTH-1:0] VN1_dout_02_00; //后面的00代表H阵原模图的IM
wire [WIDTH-1:0] VN1_dout_02_01; //后面的01代表H阵原模图的II1
//RAM数据输出,H阵第2行
wire [WIDTH-1:0] VN2_dout_01_00;
wire [WIDTH-1:0] VN2_dout_02_00;
wire [WIDTH-1:0] VN2_dout_03_00;
wire [WIDTH-1:0] VN2_dout_04_02; //后面的02代表H阵原模图的II2
wire [WIDTH-1:0] VN2_dout_04_03; //后面的03代表H阵原模图的II3
wire [WIDTH-1:0] VN2_dout_04_04; //后面的04代表H阵原模图的II4
//RAM数据输出,H阵第3行
wire [WIDTH-1:0] VN3_dout_01_00;
wire [WIDTH-1:0] VN3_dout_02_05; //后面的05代表H阵原模图的II5
wire [WIDTH-1:0] VN3_dout_02_06; //后面的06代表H阵原模图的II6
wire [WIDTH-1:0] VN3_dout_03_07; //后面的07代表H阵原模图的II7
wire [WIDTH-1:0] VN3_dout_03_08; //后面的08代表H阵原模图的II8
wire [WIDTH-1:0] VN3_dout_04_00;
//*****判决结果存储RAM信号定义
reg [ 0:0] DR_wea = 1'd0;
reg [ 8:0] DR_addr_wr = 9'd511;
reg [ 0:0] DR_din_01 = 1'd0;
reg [ 0:0] DR_din_02 = 1'd0;
reg [ 0:0] DR_din_03 = 1'd0;
reg [ 0:0] DR_din_04 = 1'd0;
// reg [0:0] DR_din_05=1'd0;
reg [ 8:0] DR_addr_rd_01 = 9'd511;
reg [ 8:0] DR_addr_rd_02 = 9'd511;
reg [ 8:0] DR_addr_rd_03 = 9'd511;
reg [ 8:0] DR_addr_rd_04 = 9'd511;
// reg [8:0] DR_addr_rd_05=9'd511;
wire DR_dout_01;
wire DR_dout_02;
wire DR_dout_03;
wire DR_dout_04;
// wire DR_dout_05;
reg Switch_VN_CN = 1'd0;
// Switch_VN_CN用于指示当前处于VN更新状态(值为0)还是CN更新状态(值为1)
// 由于存储器用的是True dual RAM,因此要考虑读写地址线相同的RAM在VN及CN
// 状态对应不同的地址,因此不能在上述两种状态下对其赋不同的值,故需要该
// 该变量指示当前状态。
always @(posedge clk) begin
if (rst) Switch_VN_CN <= 1'd0;
else begin
if (start_VN) Switch_VN_CN <= 1'd0;
else if (start_CN) Switch_VN_CN <= 1'd1;
else Switch_VN_CN <= Switch_VN_CN;
end
end
//******列更新模块
//输入信号
always @(posedge clk) begin
rst_VN <= rst;
start_VN <= (rst) ? 1'd0 : ((start || end_CN) ? 1'd1 : 1'd0);
start_frame_VN <= start;
CHNL_dout_01_VN <= din01;
CHNL_dout_02_VN <= din02;
CHNL_dout_03_VN <= din03;
CHNL_dout_04_VN <= din04;
CN1_dout_01_00_VN <= CN1_dout_01_00;
CN1_dout_02_00_VN <= CN1_dout_02_00;
CN1_dout_02_01_VN <= CN1_dout_02_01;
CN2_dout_01_00_VN <= CN2_dout_01_00;
CN2_dout_02_00_VN <= CN2_dout_02_00;
CN2_dout_03_00_VN <= CN2_dout_03_00;
CN2_dout_04_02_VN <= CN2_dout_04_02;
CN2_dout_04_03_VN <= CN2_dout_04_03;
CN2_dout_04_04_VN <= CN2_dout_04_04;
CN3_dout_01_00_VN <= CN3_dout_01_00;
CN3_dout_02_05_VN <= CN3_dout_02_05;
CN3_dout_02_06_VN <= CN3_dout_02_06;
CN3_dout_03_07_VN <= CN3_dout_03_07;
CN3_dout_03_08_VN <= CN3_dout_03_08;
CN3_dout_04_00_VN <= CN3_dout_04_00;
end
// 输出信号 // Switch_VN_CN用于指示当前处于VN更新状态(值为0)还是CN更新状态(值为1)
always @(posedge clk) begin
CN1_addr_wr_02_00 <= (Switch_VN_CN == 1'd0) ? CN1_addr_rd_02_00_VN : CN1_addr_wr_02_00_CN;
CN1_addr_wr_02_01 <= (Switch_VN_CN == 1'd0) ? CN1_addr_rd_02_01_VN : CN1_addr_wr_02_01_CN;
CN2_addr_wr_04_02 <= (Switch_VN_CN == 1'd0) ? CN2_addr_rd_04_02_VN : CN2_addr_wr_04_02_CN;
CN2_addr_wr_04_03 <= (Switch_VN_CN == 1'd0) ? CN2_addr_rd_04_03_VN : CN2_addr_wr_04_03_CN;
CN3_addr_wr_02_05 <= (Switch_VN_CN == 1'd0) ? CN3_addr_rd_02_05_VN : CN3_addr_wr_02_05_CN;
CN3_addr_wr_02_06 <= (Switch_VN_CN == 1'd0) ? CN3_addr_rd_02_06_VN : CN3_addr_wr_02_06_CN;
CN3_addr_wr_03_07 <= (Switch_VN_CN == 1'd0) ? CN3_addr_rd_03_07_VN : CN3_addr_wr_03_07_CN;
CN3_addr_wr_03_08 <= (Switch_VN_CN == 1'd0) ? CN3_addr_rd_03_08_VN : CN3_addr_wr_03_08_CN;
CN1_addr_rd_01_00 <= CN1_addr_rd_01_00_VN;
CN2_addr_rd_01_00 <= CN2_addr_rd_01_00_VN;
CN2_addr_rd_02_00 <= CN2_addr_rd_02_00_VN;
CN2_addr_rd_03_00 <= CN2_addr_rd_03_00_VN;
CN2_addr_rd_04_04 <= CN2_addr_rd_04_04_VN;
CN3_addr_rd_01_00 <= CN3_addr_rd_01_00_VN;
CN3_addr_rd_04_00 <= CN3_addr_rd_04_00_VN;
VN1_addr_wr_01_00 <= VN1_addr_wr_01_00_VN;
VN2_addr_wr_01_00 <= VN2_addr_wr_01_00_VN;
VN2_addr_wr_02_00 <= VN2_addr_wr_02_00_VN;
VN2_addr_wr_03_00 <= VN2_addr_wr_03_00_VN;
VN2_addr_wr_04_04 <= VN2_addr_wr_04_04_VN;
VN3_addr_wr_01_00 <= VN3_addr_wr_01_00_VN;
VN3_addr_wr_04_00 <= VN3_addr_wr_04_00_VN;
VN_wea <= VN_wea_VN;
VN1_din_01_00 <= VN1_din_01_00_VN;
VN1_din_02_00 <= VN1_din_02_00_VN;
VN1_din_02_01 <= VN1_din_02_01_VN;
VN2_din_01_00 <= VN2_din_01_00_VN;
VN2_din_02_00 <= VN2_din_02_00_VN;
VN2_din_03_00 <= VN2_din_03_00_VN;
VN2_din_04_02 <= VN2_din_04_02_VN;
VN2_din_04_03 <= VN2_din_04_03_VN;
VN2_din_04_04 <= VN2_din_04_04_VN;
VN3_din_01_00 <= VN3_din_01_00_VN;
VN3_din_02_05 <= VN3_din_02_05_VN;
VN3_din_02_06 <= VN3_din_02_06_VN;
VN3_din_03_07 <= VN3_din_03_07_VN;
VN3_din_03_08 <= VN3_din_03_08_VN;
VN3_din_04_00 <= VN3_din_04_00_VN;
DR_wea <= DR_wea_VN;
DR_addr_wr <= DR_addr_wr_VN;
DR_din_01 <= DR_din_01_VN;
DR_din_02 <= DR_din_02_VN;
DR_din_03 <= DR_din_03_VN;
DR_din_04 <= DR_din_04_VN;
// DR_din_05 <= DR_din_05_VN;
end
//******行更新模块
// 输入信号
always @(posedge clk) begin
rst_CN <= rst;
start_CN <= end_VN;
VN1_dout_01_00_CN <= VN1_dout_01_00;
VN1_dout_02_00_CN <= VN1_dout_02_00;
VN1_dout_02_01_CN <= VN1_dout_02_01;
VN2_dout_01_00_CN <= VN2_dout_01_00;
VN2_dout_02_00_CN <= VN2_dout_02_00;
VN2_dout_03_00_CN <= VN2_dout_03_00;
VN2_dout_04_02_CN <= VN2_dout_04_02;
VN2_dout_04_03_CN <= VN2_dout_04_03;
VN2_dout_04_04_CN <= VN2_dout_04_04;
VN3_dout_01_00_CN <= VN3_dout_01_00;
VN3_dout_02_05_CN <= VN3_dout_02_05;
VN3_dout_02_06_CN <= VN3_dout_02_06;
VN3_dout_03_07_CN <= VN3_dout_03_07;
VN3_dout_03_08_CN <= VN3_dout_03_08;
VN3_dout_04_00_CN <= VN3_dout_04_00;
end
// 输出信号 // Switch_VN_CN用于指示当前处于VN更新状态(值为0)还是CN更新状态(值为1)
always @(posedge clk) begin
VN1_addr_wr_02_00 <= (Switch_VN_CN == 1'd1) ? VN1_addr_rd_02_00_CN : VN1_addr_wr_02_00_VN;
VN1_addr_wr_02_01 <= (Switch_VN_CN == 1'd1) ? VN1_addr_rd_02_01_CN : VN1_addr_wr_02_01_VN;
VN2_addr_wr_04_02 <= (Switch_VN_CN == 1'd1) ? VN2_addr_rd_04_02_CN : VN2_addr_wr_04_02_VN;
VN2_addr_wr_04_03 <= (Switch_VN_CN == 1'd1) ? VN2_addr_rd_04_03_CN : VN2_addr_wr_04_03_VN;
VN3_addr_wr_02_05 <= (Switch_VN_CN == 1'd1) ? VN3_addr_rd_02_05_CN : VN3_addr_wr_02_05_VN;
VN3_addr_wr_02_06 <= (Switch_VN_CN == 1'd1) ? VN3_addr_rd_02_06_CN : VN3_addr_wr_02_06_VN;
VN3_addr_wr_03_07 <= (Switch_VN_CN == 1'd1) ? VN3_addr_rd_03_07_CN : VN3_addr_wr_03_07_VN;
VN3_addr_wr_03_08 <= (Switch_VN_CN == 1'd1) ? VN3_addr_rd_03_08_CN : VN3_addr_wr_03_08_VN;
VN1_addr_rd_01_00 <= VN1_addr_rd_01_00_CN;
VN2_addr_rd_01_00 <= VN2_addr_rd_01_00_CN;
VN2_addr_rd_02_00 <= VN2_addr_rd_02_00_CN;
VN2_addr_rd_03_00 <= VN2_addr_rd_03_00_CN;
VN2_addr_rd_04_04 <= VN2_addr_rd_04_04_CN;
VN3_addr_rd_01_00 <= VN3_addr_rd_01_00_CN;
VN3_addr_rd_04_00 <= VN3_addr_rd_04_00_CN;
CN_wea <= CN_wea_CN;
CN1_addr_wr_01_00 <= CN1_addr_wr_01_00_CN;
CN2_addr_wr_01_00 <= CN2_addr_wr_01_00_CN;
CN2_addr_wr_02_00 <= CN2_addr_wr_02_00_CN;
CN2_addr_wr_03_00 <= CN2_addr_wr_03_00_CN;
CN2_addr_wr_04_04 <= CN2_addr_wr_04_04_CN;
CN3_addr_wr_01_00 <= CN3_addr_wr_01_00_CN;
CN3_addr_wr_04_00 <= CN3_addr_wr_04_00_CN;
CN1_din_01_00 <= CN1_din_01_00_CN;
CN1_din_02_00 <= CN1_din_02_00_CN;
CN1_din_02_01 <= CN1_din_02_01_CN;
CN2_din_01_00 <= CN2_din_01_00_CN;
CN2_din_02_00 <= CN2_din_02_00_CN;
CN2_din_03_00 <= CN2_din_03_00_CN;
CN2_din_04_02 <= CN2_din_04_02_CN;
CN2_din_04_03 <= CN2_din_04_03_CN;
CN2_din_04_04 <= CN2_din_04_04_CN;
CN3_din_01_00 <= CN3_din_01_00_CN;
CN3_din_02_05 <= CN3_din_02_05_CN;
CN3_din_02_06 <= CN3_din_02_06_CN;
CN3_din_03_07 <= CN3_din_03_07_CN;
CN3_din_03_08 <= CN3_din_03_08_CN;
CN3_din_04_00 <= CN3_din_04_00_CN;
end
VN_PRO #(
.MAX_ITER_NUM(MAX_ITER_NUM),
.WIDTH(WIDTH)
) inst_VN_PRO (
.clk (clk),
.rst_VN (rst_VN),
.start_VN (start_VN),
.start_frame_VN (start_frame_VN),
.CHNL_dout_01 (CHNL_dout_01_VN),
.CHNL_dout_02 (CHNL_dout_02_VN),
.CHNL_dout_03 (CHNL_dout_03_VN),
.CHNL_dout_04 (CHNL_dout_04_VN),
.CN1_dout_01_00 (CN1_dout_01_00_VN),
.CN1_dout_02_00 (CN1_dout_02_00_VN),
.CN1_dout_02_01 (CN1_dout_02_01_VN),
.CN2_dout_01_00 (CN2_dout_01_00_VN),
.CN2_dout_02_00 (CN2_dout_02_00_VN),
.CN2_dout_03_00 (CN2_dout_03_00_VN),
.CN2_dout_04_02 (CN2_dout_04_02_VN),
.CN2_dout_04_03 (CN2_dout_04_03_VN),
.CN2_dout_04_04 (CN2_dout_04_04_VN),
.CN3_dout_01_00 (CN3_dout_01_00_VN),
.CN3_dout_02_05 (CN3_dout_02_05_VN),
.CN3_dout_02_06 (CN3_dout_02_06_VN),
.CN3_dout_03_07 (CN3_dout_03_07_VN),
.CN3_dout_03_08 (CN3_dout_03_08_VN),
.CN3_dout_04_00 (CN3_dout_04_00_VN),
.ask_din (ask_din_VN),
.CN1_addr_rd_01_00(CN1_addr_rd_01_00_VN),
.CN1_addr_rd_02_00(CN1_addr_rd_02_00_VN),
.CN1_addr_rd_02_01(CN1_addr_rd_02_01_VN),
.CN2_addr_rd_01_00(CN2_addr_rd_01_00_VN),
.CN2_addr_rd_02_00(CN2_addr_rd_02_00_VN),
.CN2_addr_rd_03_00(CN2_addr_rd_03_00_VN),
.CN2_addr_rd_04_02(CN2_addr_rd_04_02_VN),
.CN2_addr_rd_04_03(CN2_addr_rd_04_03_VN),
.CN2_addr_rd_04_04(CN2_addr_rd_04_04_VN),
.CN3_addr_rd_01_00(CN3_addr_rd_01_00_VN),
.CN3_addr_rd_02_05(CN3_addr_rd_02_05_VN),
.CN3_addr_rd_02_06(CN3_addr_rd_02_06_VN),
.CN3_addr_rd_03_07(CN3_addr_rd_03_07_VN),
.CN3_addr_rd_03_08(CN3_addr_rd_03_08_VN),
.CN3_addr_rd_04_00(CN3_addr_rd_04_00_VN),
.VN_wea (VN_wea_VN),
.VN1_addr_wr_01_00(VN1_addr_wr_01_00_VN),
.VN1_addr_wr_02_00(VN1_addr_wr_02_00_VN),
.VN1_addr_wr_02_01(VN1_addr_wr_02_01_VN),
.VN2_addr_wr_01_00(VN2_addr_wr_01_00_VN),
.VN2_addr_wr_02_00(VN2_addr_wr_02_00_VN),
.VN2_addr_wr_03_00(VN2_addr_wr_03_00_VN),
.VN2_addr_wr_04_02(VN2_addr_wr_04_02_VN),
.VN2_addr_wr_04_03(VN2_addr_wr_04_03_VN),
.VN2_addr_wr_04_04(VN2_addr_wr_04_04_VN),
.VN3_addr_wr_01_00(VN3_addr_wr_01_00_VN),
.VN3_addr_wr_02_05(VN3_addr_wr_02_05_VN),
.VN3_addr_wr_02_06(VN3_addr_wr_02_06_VN),
.VN3_addr_wr_03_07(VN3_addr_wr_03_07_VN),
.VN3_addr_wr_03_08(VN3_addr_wr_03_08_VN),
.VN3_addr_wr_04_00(VN3_addr_wr_04_00_VN),
.VN1_din_01_00 (VN1_din_01_00_VN),
.VN1_din_02_00 (VN1_din_02_00_VN),
.VN1_din_02_01 (VN1_din_02_01_VN),
.VN2_din_01_00 (VN2_din_01_00_VN),
.VN2_din_02_00 (VN2_din_02_00_VN),
.VN2_din_03_00 (VN2_din_03_00_VN),
.VN2_din_04_02 (VN2_din_04_02_VN),
.VN2_din_04_03 (VN2_din_04_03_VN),
.VN2_din_04_04 (VN2_din_04_04_VN),
.VN3_din_01_00 (VN3_din_01_00_VN),
.VN3_din_02_05 (VN3_din_02_05_VN),
.VN3_din_02_06 (VN3_din_02_06_VN),
.VN3_din_03_07 (VN3_din_03_07_VN),
.VN3_din_03_08 (VN3_din_03_08_VN),
.VN3_din_04_00 (VN3_din_04_00_VN),
.DR_wea (DR_wea_VN),
.DR_addr_wr (DR_addr_wr_VN),
.DR_din_01 (DR_din_01_VN),
.DR_din_02 (DR_din_02_VN),
.DR_din_03 (DR_din_03_VN),
.DR_din_04 (DR_din_04_VN),
.DR_din_05 (DR_din_05_VN),
.data_start_ck_VN (data_start_ck_VN),
.data_start_VN (data_start_VN),
.end_VN (end_VN)
);
CN_PRO #(
.WIDTH(WIDTH)
) inst_CN_PRO (
.clk (clk),
.rst_CN (rst_CN),
.start_CN (start_CN),
.VN1_dout_01_00 (VN1_dout_01_00_CN),
.VN1_dout_02_00 (VN1_dout_02_00_CN),
.VN1_dout_02_01 (VN1_dout_02_01_CN),
.VN2_dout_01_00 (VN2_dout_01_00_CN),
.VN2_dout_02_00 (VN2_dout_02_00_CN),
.VN2_dout_03_00 (VN2_dout_03_00_CN),
.VN2_dout_04_02 (VN2_dout_04_02_CN),
.VN2_dout_04_03 (VN2_dout_04_03_CN),
.VN2_dout_04_04 (VN2_dout_04_04_CN),
.VN3_dout_01_00 (VN3_dout_01_00_CN),
.VN3_dout_02_05 (VN3_dout_02_05_CN),
.VN3_dout_02_06 (VN3_dout_02_06_CN),
.VN3_dout_03_07 (VN3_dout_03_07_CN),
.VN3_dout_03_08 (VN3_dout_03_08_CN),
.VN3_dout_04_00 (VN3_dout_04_00_CN),
.VN1_addr_rd_01_00(VN1_addr_rd_01_00_CN),
.VN1_addr_rd_02_00(VN1_addr_rd_02_00_CN),
.VN1_addr_rd_02_01(VN1_addr_rd_02_01_CN),
.VN2_addr_rd_01_00(VN2_addr_rd_01_00_CN),
.VN2_addr_rd_02_00(VN2_addr_rd_02_00_CN),
.VN2_addr_rd_03_00(VN2_addr_rd_03_00_CN),
.VN2_addr_rd_04_02(VN2_addr_rd_04_02_CN),
.VN2_addr_rd_04_03(VN2_addr_rd_04_03_CN),
.VN2_addr_rd_04_04(VN2_addr_rd_04_04_CN),
.VN3_addr_rd_01_00(VN3_addr_rd_01_00_CN),
.VN3_addr_rd_02_05(VN3_addr_rd_02_05_CN),
.VN3_addr_rd_02_06(VN3_addr_rd_02_06_CN),
.VN3_addr_rd_03_07(VN3_addr_rd_03_07_CN),
.VN3_addr_rd_03_08(VN3_addr_rd_03_08_CN),
.VN3_addr_rd_04_00(VN3_addr_rd_04_00_CN),
.CN_wea (CN_wea_CN),
.CN1_addr_wr_01_00(CN1_addr_wr_01_00_CN),
.CN1_addr_wr_02_00(CN1_addr_wr_02_00_CN),
.CN1_addr_wr_02_01(CN1_addr_wr_02_01_CN),
.CN2_addr_wr_01_00(CN2_addr_wr_01_00_CN),
.CN2_addr_wr_02_00(CN2_addr_wr_02_00_CN),
.CN2_addr_wr_03_00(CN2_addr_wr_03_00_CN),
.CN2_addr_wr_04_02(CN2_addr_wr_04_02_CN),
.CN2_addr_wr_04_03(CN2_addr_wr_04_03_CN),
.CN2_addr_wr_04_04(CN2_addr_wr_04_04_CN),
.CN3_addr_wr_01_00(CN3_addr_wr_01_00_CN),
.CN3_addr_wr_02_05(CN3_addr_wr_02_05_CN),
.CN3_addr_wr_02_06(CN3_addr_wr_02_06_CN),
.CN3_addr_wr_03_07(CN3_addr_wr_03_07_CN),
.CN3_addr_wr_03_08(CN3_addr_wr_03_08_CN),
.CN3_addr_wr_04_00(CN3_addr_wr_04_00_CN),
.CN1_din_01_00 (CN1_din_01_00_CN),
.CN1_din_02_00 (CN1_din_02_00_CN),
.CN1_din_02_01 (CN1_din_02_01_CN),
.CN2_din_01_00 (CN2_din_01_00_CN),
.CN2_din_02_00 (CN2_din_02_00_CN),
.CN2_din_03_00 (CN2_din_03_00_CN),
.CN2_din_04_02 (CN2_din_04_02_CN),
.CN2_din_04_03 (CN2_din_04_03_CN),
.CN2_din_04_04 (CN2_din_04_04_CN),
.CN3_din_01_00 (CN3_din_01_00_CN),
.CN3_din_02_05 (CN3_din_02_05_CN),
.CN3_din_02_06 (CN3_din_02_06_CN),
.CN3_din_03_07 (CN3_din_03_07_CN),
.CN3_din_03_08 (CN3_din_03_08_CN),
.CN3_din_04_00 (CN3_din_04_00_CN),
.end_CN (end_CN)
);
//******译码结果校验模块
// 输入信号
reg rst_CK = 1'd0;
reg start_CK = 1'd0;
reg nd_CK = 1'd0;
reg DR_din_01_CK = 1'd0;
reg DR_din_02_CK = 1'd0;
reg DR_din_03_CK = 1'd0;
reg DR_din_04_CK = 1'd0;
reg DR_din_05_CK = 1'd0;
always @(posedge clk) begin
rst_CK <= rst;
start_CK <= data_start_ck_VN;
nd_CK <= DR_wea_VN;
DR_din_01_CK <= DR_din_01_VN;
DR_din_02_CK <= DR_din_02_VN;
DR_din_03_CK <= DR_din_03_VN;
DR_din_04_CK <= DR_din_04_VN;
DR_din_05_CK <= DR_din_05_VN;
end
// 输出信号
wire [8:0] gd_frames_CK;
wire [8:0] bd_frames_CK;
wire [8:0] tl_frames_CK;
always @(posedge clk) begin
gd_frames <= gd_frames_CK;
bd_frames <= bd_frames_CK;
tl_frames <= tl_frames_CK;
end
CK_PRO inst_CK_PRO (
.clk (clk),
.rst_OUTCK (rst_CK),
.start_OUTCK(start_CK),
.nd_OUTCK (nd_CK),
.DR_din_01 (DR_din_01_CK),
.DR_din_02 (DR_din_02_CK),
.DR_din_03 (DR_din_03_CK),
.DR_din_04 (DR_din_04_CK),
.DR_din_05 (DR_din_05_CK),
.gd_frames (gd_frames_CK),
.bd_frames (bd_frames_CK),
.tl_frames (tl_frames_CK)
);
//******译码结果输出模块
// 输入信号
reg start_OUT = 1'd0;
reg rst_OUT = 1'd0;
reg DR_dout_01_OUT = 1'd0;
reg DR_dout_02_OUT = 1'd0;
reg DR_dout_03_OUT = 1'd0;
reg DR_dout_04_OUT = 1'd0;
always @(posedge clk) begin
start_OUT <= data_start_VN;
rst_OUT <= rst;
DR_dout_01_OUT <= DR_dout_01;
DR_dout_02_OUT <= DR_dout_02;
DR_dout_03_OUT <= DR_dout_03;
DR_dout_04_OUT <= DR_dout_04;
end
// 输出信号
wire ldpc_syncout_OUT;
wire rdy_OUT;
wire ldpc_dout_OUT;
wire [8:0] DR_addr_rd_01_OUT;
wire [8:0] DR_addr_rd_02_OUT;
wire [8:0] DR_addr_rd_03_OUT;
wire [8:0] DR_addr_rd_04_OUT;
always @(posedge clk) begin
DR_addr_rd_01 <= DR_addr_rd_01_OUT;
DR_addr_rd_02 <= DR_addr_rd_02_OUT;
DR_addr_rd_03 <= DR_addr_rd_03_OUT;
DR_addr_rd_04 <= DR_addr_rd_04_OUT;
ldpc_syncout <= ldpc_syncout_OUT;
rdy <= rdy_OUT;
ldpc_dout <= ldpc_dout_OUT;
ask_din <= ask_din_VN;
end
OUT_PRO #(
.OUT_ONLY_INFORMATION(OUT_ONLY_INFORMATION)
) inst_OUT_PRO (
.clk (clk),
.rst_OUT (rst_OUT),
.start_OUT (start_OUT),
.DR_dout_01 (DR_dout_01_OUT),
.DR_dout_02 (DR_dout_02_OUT),
.DR_dout_03 (DR_dout_03_OUT),
.DR_dout_04 (DR_dout_04_OUT),
.DR_addr_rd_01 (DR_addr_rd_01_OUT),
.DR_addr_rd_02 (DR_addr_rd_02_OUT),
.DR_addr_rd_03 (DR_addr_rd_03_OUT),
.DR_addr_rd_04 (DR_addr_rd_04_OUT),
.ldpc_syncout_OUT(ldpc_syncout_OUT),
.rdy_OUT (rdy_OUT),
.ldpc_dout_OUT (ldpc_dout_OUT)
);
//******校验节点信息存储RAM
// H阵第1行
RAM_512X1_8 RAM_CN_01 (
.clka (clk),
.wea (CN_wea),
.addra(CN1_addr_wr_01_00),
.dina (CN1_din_01_00),
.clkb (clk),
.addrb(CN1_addr_rd_01_00),
.doutb(CN1_dout_01_00)
);
RAM_512X2_8 RAM_CN_02 (
.clka (clk),
.wea (CN_wea),
.addra(CN1_addr_wr_02_00),
.dina (CN1_din_02_00),
.douta(CN1_dout_02_00),
.clkb (clk),
.web (CN_wea),
.addrb(CN1_addr_wr_02_01),
.dinb (CN1_din_02_01),
.doutb(CN1_dout_02_01)
);
// H阵第2行
RAM_512X1_8 RAM_CN_03 (
.clka (clk),
.wea (CN_wea),
.addra(CN2_addr_wr_01_00),
.dina (CN2_din_01_00),
.clkb (clk),
.addrb(CN2_addr_rd_01_00),
.doutb(CN2_dout_01_00)
);
RAM_512X1_8 RAM_CN_04 (
.clka (clk),
.wea (CN_wea),
.addra(CN2_addr_wr_02_00),
.dina (CN2_din_02_00),
.clkb (clk),
.addrb(CN2_addr_rd_02_00),
.doutb(CN2_dout_02_00)
);
RAM_512X1_8 RAM_CN_05 (
.clka (clk),
.wea (CN_wea),
.addra(CN2_addr_wr_03_00),
.dina (CN2_din_03_00),
.clkb (clk),
.addrb(CN2_addr_rd_03_00),
.doutb(CN2_dout_03_00)
);
RAM_512X2_8 RAM_CN_06 (
.clka (clk),
.wea (CN_wea),
.addra(CN2_addr_wr_04_02),
.dina (CN2_din_04_02),
.douta(CN2_dout_04_02),
.clkb (clk),
.web (CN_wea),
.addrb(CN2_addr_wr_04_03),
.dinb (CN2_din_04_03),
.doutb(CN2_dout_04_03)
);
RAM_512X1_8 RAM_CN_07 (
.clka (clk),
.wea (CN_wea),
.addra(CN2_addr_wr_04_04),
.dina (CN2_din_04_04),
.clkb (clk),
.addrb(CN2_addr_rd_04_04),
.doutb(CN2_dout_04_04)
);
// H阵第3行
RAM_512X1_8 RAM_CN_08 (
.clka (clk),
.wea (CN_wea),
.addra(CN3_addr_wr_01_00),
.dina (CN3_din_01_00),
.clkb (clk),
.addrb(CN3_addr_rd_01_00),
.doutb(CN3_dout_01_00)
);
RAM_512X2_8 RAM_CN_09 (
.clka (clk),
.wea (CN_wea),
.addra(CN3_addr_wr_02_05),
.dina (CN3_din_02_05),
.douta(CN3_dout_02_05),
.clkb (clk),
.web (CN_wea),
.addrb(CN3_addr_wr_02_06),
.dinb (CN3_din_02_06),
.doutb(CN3_dout_02_06)
);
RAM_512X2_8 RAM_CN_10 (
.clka (clk),
.wea (CN_wea),
.addra(CN3_addr_wr_03_07),
.dina (CN3_din_03_07),
.douta(CN3_dout_03_07),
.clkb (clk),
.web (CN_wea),
.addrb(CN3_addr_wr_03_08),
.dinb (CN3_din_03_08),
.doutb(CN3_dout_03_08)
);
RAM_512X1_8 RAM_CN_11 (
.clka (clk),
.wea (CN_wea),
.addra(CN3_addr_wr_04_00),
.dina (CN3_din_04_00),
.clkb (clk),
.addrb(CN3_addr_rd_04_00),
.doutb(CN3_dout_04_00)
);
//******变量节点信息存储RAM
// H阵第1行,注意H阵第1行第3列不进行列VN的列更新
RAM_512X1_8 RAM_VN_01 (
.clka (clk),
.wea (VN_wea),
.addra(VN1_addr_wr_01_00),
.dina (VN1_din_01_00),
.clkb (clk),
.addrb(VN1_addr_rd_01_00),
.doutb(VN1_dout_01_00)
);
RAM_512X2_8 RAM_VN_02 (
.clka (clk),
.wea (VN_wea),
.addra(VN1_addr_wr_02_00),
.dina (VN1_din_02_00),
.douta(VN1_dout_02_00),
.clkb (clk),
.web (VN_wea),
.addrb(VN1_addr_wr_02_01),
.dinb (VN1_din_02_01),
.doutb(VN1_dout_02_01)
);
// H阵第2行
RAM_512X1_8 RAM_VN_03 (
.clka (clk),
.wea (VN_wea),
.addra(VN2_addr_wr_01_00),
.dina (VN2_din_01_00),
.clkb (clk),
.addrb(VN2_addr_rd_01_00),
.doutb(VN2_dout_01_00)
);
RAM_512X1_8 RAM_VN_04 (
.clka (clk),
.wea (VN_wea),
.addra(VN2_addr_wr_02_00),
.dina (VN2_din_02_00),
.clkb (clk),
.addrb(VN2_addr_rd_02_00),
.doutb(VN2_dout_02_00)
);
RAM_512X1_8 RAM_VN_05 (
.clka (clk),
.wea (VN_wea),
.addra(VN2_addr_wr_03_00),
.dina (VN2_din_03_00),
.clkb (clk),
.addrb(VN2_addr_rd_03_00),
.doutb(VN2_dout_03_00)
);
RAM_512X2_8 RAM_VN_06 (
.clka (clk),
.wea (VN_wea),
.addra(VN2_addr_wr_04_02),
.dina (VN2_din_04_02),
.douta(VN2_dout_04_02),
.clkb (clk),
.web (VN_wea),
.addrb(VN2_addr_wr_04_03),
.dinb (VN2_din_04_03),
.doutb(VN2_dout_04_03)
);
RAM_512X1_8 RAM_VN_07 (
.clka (clk),
.wea (VN_wea),
.addra(VN2_addr_wr_04_04),
.dina (VN2_din_04_04),
.clkb (clk),
.addrb(VN2_addr_rd_04_04),
.doutb(VN2_dout_04_04)
);
// H阵第3行
RAM_512X1_8 RAM_VN_08 (
.clka (clk),
.wea (VN_wea),
.addra(VN3_addr_wr_01_00),
.dina (VN3_din_01_00),
.clkb (clk),
.addrb(VN3_addr_rd_01_00),
.doutb(VN3_dout_01_00)
);
RAM_512X2_8 RAM_VN_09 (
.clka (clk),
.wea (VN_wea),
.addra(VN3_addr_wr_02_05),
.dina (VN3_din_02_05),
.douta(VN3_dout_02_05),
.clkb (clk),
.web (VN_wea),
.addrb(VN3_addr_wr_02_06),
.dinb (VN3_din_02_06),
.doutb(VN3_dout_02_06)
);
RAM_512X2_8 RAM_VN_10 (
.clka (clk),
.wea (VN_wea),
.addra(VN3_addr_wr_03_07),
.dina (VN3_din_03_07),
.douta(VN3_dout_03_07),
.clkb (clk),
.web (VN_wea),
.addrb(VN3_addr_wr_03_08),
.dinb (VN3_din_03_08),
.doutb(VN3_dout_03_08)
);
RAM_512X1_8 RAM_VN_11 (
.clka (clk),
.wea (VN_wea),
.addra(VN3_addr_wr_04_00),
.dina (VN3_din_04_00),
.clkb (clk),
.addrb(VN3_addr_rd_04_00),
.doutb(VN3_dout_04_00)
);
//******判决结果信息存储RAM
//注意:对于码率为1/2的CCSDS码而言,真正的码字存储在RAM_DR_01~RAM_DR_04中,RAM_DR_05只是在验证HC’==0时用。
RAM_512_1 RAM_DR_01 (
.clka (clk),
.wea (DR_wea),
.addra(DR_addr_wr),
.dina (DR_din_01),
.clkb (clk),
.addrb(DR_addr_rd_01),
.doutb(DR_dout_01)
);
RAM_512_1 RAM_DR_02 (
.clka (clk),
.wea (DR_wea),
.addra(DR_addr_wr),
.dina (DR_din_02),
.clkb (clk),
.addrb(DR_addr_rd_02),
.doutb(DR_dout_02)
);
RAM_512_1 RAM_DR_03 (
.clka (clk),
.wea (DR_wea),
.addra(DR_addr_wr),
.dina (DR_din_03),
.clkb (clk),
.addrb(DR_addr_rd_03),
.doutb(DR_dout_03)
);
RAM_512_1 RAM_DR_04 (
.clka (clk),
.wea (DR_wea),
.addra(DR_addr_wr),
.dina (DR_din_04),
.clkb (clk),
.addrb(DR_addr_rd_04),
.doutb(DR_dout_04)
);
// RAM_512_1 RAM_DR_05 (.clka(clk),.wea(DR_wea),.addra(DR_addr_wr),.dina(DR_din_05),.clkb(clk),.addrb(DR_addr_rd_05),.doutb(DR_dout_05));
endmodule