📄 ldpc.v
字号:
2module LDPC (clk,reset, data_in, data_in_en, velocity, /*输入信号码率选择*/ data_out, data_out_en, indication /*输出信号,第一个127要删除前5成7488,指示第一个127*/ );input clk,reset;input data_in,data_in_en;input[1:0] velocity; //码率选择信号output[126:0] data_out; output data_out_en;output indication;parameter row_4 = 6'd24-1'b1; // parameter column_4 = 6'd35-1'b1; //0.4码率parameter row_6 = 6'd36-1'b1; // parameter column_6 = 6'd23-1'b1; //0.6码率parameter row_8 = 6'd48-1'b1; // parameter column_8 = 6'd11-1'b1; //0.8码率parameter order = 7'd127-1'b1;parameter state0 = 1'b0; parameter state1 = 1'b1;reg[5:0] row_num; // reg[5:0] column_num;//reset时,选择合适的行,列数reg[5:0] count_row; // reg[4:0] count_col; // 行列计数器reg[6:0] count_127;reg coder_first;always @ (posedge clk) // 计数器运转 begin if (!reset) begin count_127 <= 7'd0; coder_first <= 1'b0; case (velocity) 2'b01 : //0.4码率 begin count_row <= 6'd23; // 减法计数器 row_num <= row_4; //column_num <= column_4; end 2'b10 : //0.6码率 begin count_row <= 6'd35; row_num <= row_6; //column_num <= column_6; end 2'b11 : //0.8码率 begin count_row <= 6'd47; row_num <= row_8; //column_num <= column_8; end default : // 默认0.4码率 begin count_row <= 6'd23; row_num <= row_4; //column_num <= column_4; end endcase end else begin if(data_in_en) begin case (velocity) 2'b01 : //0.4码率 begin if((count_row==6'd23)&&(count_127==0)) begin coder_first<= 1'b1; end else begin coder_first<= 1'b0; end end 2'b10 : //0.6码率 begin if((count_row==6'd35)&&(count_127==0)) begin coder_first<= 1'b1; end else begin coder_first<= 1'b0; end end 2'b11 : //0.8码率 begin if((count_row==6'd47)&&(count_127==0)) begin coder_first<= 1'b1; end else begin coder_first<= 1'b0; end end default : // 默认0.4码率 begin if((count_row==6'd23)&&(count_127==0)) begin coder_first<= 1'b1; end else begin coder_first<= 1'b0; end end endcase if(count_127 == order) begin count_127 <= 7'd0; if(count_row == 6'd0) begin count_row <= row_num; end else begin count_row <= count_row - 1'b1; end end else begin count_127 <= count_127 + 1'b1; end end end endreg bit_in, bit_in_en;reg[34:0] media_en;reg[34:0] media_en0;reg state;reg[9:0] address_04;reg[9:0] address_06;reg[9:0] address_08;always @(posedge clk) // 控制个运算模块初始化等 begin if (!reset) begin //coder_first <= 1'b0; bit_in <= 1'b0; bit_in_en <= 1'b0; media_en <= 35'b00000_0000000000_0000000000_0000000001; // 初始化时就写入第一个media address_04 <= 10'd0; address_06 <= 10'd0; address_08 <= 10'd0; state <= state0; end else begin case (velocity) 2'b01 : // 0.4 码率 begin bit_in <= data_in; bit_in_en <= data_in_en; // 输入数据 if(data_in_en) begin case (state) state0 : //前35个符号,需要按顺序对media写初始信息 begin if(media_en == 35'b10000_0000000000_0000000000_0000000000) begin state <= state1; media_en <= 35'd0; if(count_row == 0) //最后一行最后一个矩信息,复位rom地址 begin address_04 <= 10'd0; end else begin address_04 <= address_04+1'b1; end end else begin address_04 <= address_04+1'b1; // 状态地址累加 media_en <= media_en << 1; //按顺序更改35个运算模块的media_en,写入初始信息 end end state1 : // 后面输入数据,循环运算即可,不需写矩阵初始信息 begin if(count_127 == order) begin media_en <= 35'b00000_0000000000_0000000000_0000000001; //与第127个数据输入同时,写入初始信息 state <= state0; end end endcase end end 2'b10 : // 0.6码率 begin bit_in <= data_in; bit_in_en <= data_in_en; // 输入数据 if(data_in_en) begin case (state) state0 : //前23个符号,需要按顺序对media写初始信息 begin if(media_en == 35'b00000_0000000100_0000000000_0000000000) begin state <= state1; media_en <= 35'd0; if(count_row == 0) //最后一行最后一个矩信息,复位rom地址 begin address_06 <= 10'd0; end else begin address_06 <= address_06+1'b1; end end else begin address_06 <= address_06+1'b1; // 状态地址累加 media_en <= media_en << 1; //按顺序更改35个运算模块的media_en,写入初始信息 end end state1 : // 后面输入数据,循环运算即可,不需写矩阵初始信息 begin if(count_127 == order) begin media_en <= 35'b00000_0000000000_0000000000_0000000001; //与第127个数据输入同时,写入初始信息 state <= state0; end end endcase end end 2'b11 : begin bit_in <= data_in; bit_in_en <= data_in_en; // 输入数据 if(data_in_en) begin case (state) state0 : //前35个符号,需要按顺序对media写初始信息 begin if(media_en == 35'b00000_000000000_0000000001_0000000000) begin state <= state1; media_en <= 35'd0; if(count_row == 0) //最后一行最后一个矩信息,复位rom地址 begin address_08 <= 10'd0; end else begin address_08 <= address_08+1'b1; end end else begin address_08 <= address_08+1'b1; // 状态地址累加 media_en <= media_en << 1; //按顺序更改35个运算模块的media_en,写入初始信息 end end state1 : // 后面输入数据,循环运算即可,不需写矩阵初始信息 begin if(count_127 == order) begin media_en <= 35'b00000_0000000000_0000000000_0000000001; //与第127个数据输入同时,写入初始信息 state <= state0; end end endcase end end default : begin bit_in <= data_in; bit_in_en <= data_in_en; // 输入数据 if(data_in_en) begin case (state) state0 : //前35个符号,需要按顺序对media写初始信息 begin if(media_en == 35'b10000_0000000000_0000000000_0000000000) begin state <= state1; media_en <= 35'd0; if(count_row == 0) //最后一行最后一个矩信息,复位rom地址 begin address_04 <= 9'd0; end else begin address_04 <= address_04+1'b1; end end else begin address_04 <= address_04+1'b1; // 状态地址累加 media_en <= media_en << 1; //按顺序更改35个运算模块的media_en,写入初始信息 end end state1 : // 后面输入数据,循环运算即可,不需写矩阵初始信息 begin if(count_127 == order) begin media_en <= 35'b00000_0000000000_0000000000_0000000001; //与第127个数据输入同时,写入初始信息 state <= state0; end end endcase end end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -