?? matrix_op.v
字號:
module matrix_op( clk,reset,bit_in,bit_in_en, media_in,media_in_en,
coder_first,
bit_out,bit_out_en, first_out,
data_out);
input clk,reset;
input bit_in,bit_in_en;
input[126:0] media_in;
input media_in_en;
input coder_first; //每一組編碼第一個數(shù)據(jù)輸入指示,便于處理相乘后直接存儲到out,不必異或
//input coder_last;
output[126:0] data_out;
//output data_out_en;
output bit_out;
output bit_out_en;
output first_out;
reg first_out;
reg[126:0] media;
reg bit_out;
reg bit_out_en;
reg[126:0] data_out;
//reg data_out_en;
always @(posedge clk)
begin
if (!reset)
begin
media <= 127'd0;
data_out <= 127'd0;
//data_out_en <= 1'b0;
bit_out <= 1'b0;
bit_out_en <= 1'b0;
end
else
begin
if (bit_in_en)
begin
if(coder_first)
begin
if(bit_in)
begin
data_out <= media;
end
else
begin
data_out <= 127'd0;
end
end
else
begin
if(bit_in)
begin
data_out <= data_out^media;
end
end
/* if(coder_last)
begin
data_out_en <= 1'b1;
end
else
begin
data_out_en <= 1'b0;
end
*/
media <= {media[0],media[126:1]};
first_out <= coder_first;
bit_out <= bit_in;
bit_out_en <= 1'b1;
end
else
begin
bit_out_en<=1'b0;
//data_out_en <= 1'b0;
end
if(media_in_en) //外部保證第127個符號輸入時(shí)同步輸入media初始信息
begin
media <= media_in;
end
end
end
endmodule
module 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時(shí),選擇合適的行,列數(shù)
reg[5:0] count_row; // reg[4:0] count_col; // 行列計(jì)數(shù)器
reg[6:0] count_127;
reg coder_first;
always @ (posedge clk) // 計(jì)數(shù)器運(yùn)轉(zhuǎn)
begin
if (!reset)
begin
count_127 <= 7'd0;
coder_first <= 1'b0;
case (velocity)
2'b01 : //0.4碼率
begin
count_row <= 6'd23; // 減法計(jì)數(shù)器
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 : // 默認(rèn)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 : // 默認(rèn)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
end
reg 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) // 控制個運(yùn)算模塊初始化等
begin
if (!reset)
begin
//coder_first <= 1'b0;
bit_in <= 1'b0; bit_in_en <= 1'b0;
media_en <= 35'b00000_0000000000_0000000000_0000000001; // 初始化時(shí)就寫入第一個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; // 輸入數(shù)據(jù)
if(data_in_en)
begin
case (state)
state0 : //前35個符號,需要按順序?qū)edia寫初始信息
begin
if(media_en == 35'b10000_0000000000_0000000000_0000000000)
begin
state <= state1;
media_en <= 35'd0;
if(count_row == 0) //最后一行最后一個矩信息,復(fù)位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; // 狀態(tài)地址累加
media_en <= media_en << 1; //按順序更改35個運(yùn)算模塊的media_en,寫入初始信息
end
end
state1 : // 后面輸入數(shù)據(jù),循環(huán)運(yùn)算即可,不需寫矩陣初始信息
begin
if(count_127 == order)
begin
media_en <= 35'b00000_0000000000_0000000000_0000000001; //與第127個數(shù)據(jù)輸入同時(shí),寫入初始信息
state <= state0;
end
end
endcase
end
end
2'b10 : // 0.6碼率
begin
bit_in <= data_in; bit_in_en <= data_in_en; // 輸入數(shù)據(jù)
if(data_in_en)
begin
case (state)
state0 : //前23個符號,需要按順序?qū)edia寫初始信息
begin
if(media_en == 35'b00000_0000000100_0000000000_0000000000)
begin
state <= state1;
media_en <= 35'd0;
if(count_row == 0) //最后一行最后一個矩信息,復(fù)位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; // 狀態(tài)地址累加
media_en <= media_en << 1; //按順序更改35個運(yùn)算模塊的media_en,寫入初始信息
end
end
state1 : // 后面輸入數(shù)據(jù),循環(huán)運(yùn)算即可,不需寫矩陣初始信息
begin
if(count_127 == order)
begin
media_en <= 35'b00000_0000000000_0000000000_0000000001; //與第127個數(shù)據(jù)輸入同時(shí),寫入初始信息
state <= state0;
end
end
endcase
end
end
2'b11 :
begin
bit_in <= data_in; bit_in_en <= data_in_en; // 輸入數(shù)據(jù)
if(data_in_en)
begin
case (state)
state0 : //前35個符號,需要按順序?qū)edia寫初始信息
begin
if(media_en == 35'b00000_000000000_0000000001_0000000000)
begin
state <= state1;
media_en <= 35'd0;
if(count_row == 0) //最后一行最后一個矩信息,復(fù)位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; // 狀態(tài)地址累加
media_en <= media_en << 1; //按順序更改35個運(yùn)算模塊的media_en,寫入初始信息
end
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -