📄 awgn.v
字号:
module AWGN(clk,reset,asset,state,noise);
input clk;
input reset;
input asset;
input [1:0] state;
output [7:0] noise;
reg [7:0] noise;
reg clk_out;
wire [126:0] Transmatrix1;
wire [126:0] Transmatrix2;
wire [126:0] left1;
wire [126:0] left2;
wire [126:0] right1;
wire [126:0] right2;
wire [126:0] up1;
wire [126:0] up2;
wire [126:0] down1;
wire [126:0] down2;
reg [126:0] state1;
reg [126:0] state2;
wire [2:0] sum00,sum01,sum02,sum03,sum04,sum05,sum06,sum07,sum08,sum09;
wire [2:0] sum0A,sum0B,sum0C,sum0D,sum0E,sum0F,sum0G,sum0H,sum0I;
wire [2:0] sum10,sum11,sum12,sum13,sum14,sum15,sum16,sum17,sum18,sum19;
wire [2:0] sum1A,sum1B,sum1C,sum1D,sum1E,sum1F,sum1G,sum1H,sum1I;
reg [4:0] sum0J,sum0K,sum0L,sum0M,sum0N;
reg [4:0] sum1J,sum1K,sum1L,sum1M,sum1N;
wire [5:0] sumA,sumB,sumC,sumD,sumE;
wire [7:0] sum;
always@(posedge clk or posedge reset)
begin
if (reset == 1'b1)
clk_out <= 1'b1;
else
clk_out <= !clk_out;
end
assign Transmatrix1 = 127'h2000_0000_0000_0000_0000_0000_0400_0000; //characteristic polynomial
assign Transmatrix2 = 127'h0000_0000_0000_0000_0000_0000_0000_0000;
assign left1[126] = 1'b0;
assign left1[125:0] = state1[126:1];
assign left2[126] = 1'b0;
assign left2[125:0] = state2[126:1];
assign right1[0] = 1'b0;
assign right1[126:1]= state1[125:0];
assign right2[0] = 1'b0;
assign right2[126:1]= state2[125:0];
assign up1 = 127'h0000_0000_0000_0000_0000_0000_0000_0000;
assign up2 = state1;
assign down1 = state2;
assign down2 = 127'h0000_0000_0000_0000_0000_0000_0000_0000;
always@(posedge clk or posedge reset)
begin
if (reset == 1'b1)
begin
state1 <= 127'haaaa_aaaa_aaaa_aaaa_aaaa_aaaa_aaaa_aaaa;
state2 <= 127'h5555_5555_5555_5555_5555_5555_5555_5555;
end
else
begin
if (asset == 1'b1)
begin
if (state == 2'b00)
begin
state1 <= 127'h4b4b_4b4b_4b4b_4b4b_4b4b_4b4b_4b4b_4b4b;
state2 <= 127'hb4b4_b4b4_b4b4_b4b4_b4b4_b4b4_b4b4_b4b4;
end
else if (state == 2'b01)
begin
state1 <= 127'h6666_6666_6666_6666_6666_6666_6666_6666;
state2 <= 127'h9999_9999_9999_9999_9999_9999_9999_9999;
end
else if (state == 2'b10)
begin
state1 <= 127'h1818_1818_1818_1818_1818_1818_1818_1818;
state2 <= 127'he7e7_e7e7_e7e7_e7e7_e7e7_e7e7_e7e7_e7e7;
end
else
begin
state1 <= 127'hffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff;
state2 <= 127'hffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff;
end
end
else
begin
state1 <= (Transmatrix1 & state1) ^ left1 ^ right1 ^ up1 ^ down1;
state2 <= (Transmatrix2 & state2) ^ left2 ^ right2 ^ up2 ^ down2;
end
end
end
assign sum00 = add3(state1[126],state1[125],state1[124],state1[123],state1[122],state1[121],state1[120]);
assign sum01 = add3(state1[119],state1[118],state1[117],state1[116],state1[115],state1[114],state1[113]);
assign sum02 = add3(state1[112],state1[111],state1[110],state1[109],state1[108],state1[107],state1[106]);
assign sum03 = add3(state1[105],state1[104],state1[103],state1[102],state1[101],state1[100],state1[99]);
assign sum04 = add3(state1[98],state1[97],state1[96],state1[95],state1[94],state1[93],state1[92]);
assign sum05 = add3(state1[91],state1[90],state1[89],state1[88],state1[87],state1[86],state1[85]);
assign sum06 = add3(state1[84],state1[83],state1[82],state1[81],state1[80],state1[79],state1[78]);
assign sum07 = add3(state1[77],state1[76],state1[75],state1[74],state1[73],state1[72],state1[71]);
assign sum08 = add3(state1[70],state1[69],state1[68],state1[67],state1[66],state1[65],state1[64]);
assign sum09 = add3(state1[63],state1[62],state1[61],state1[60],state1[59],state1[58],state1[57]);
assign sum0A = add3(state1[56],state1[55],state1[54],state1[53],state1[52],state1[51],state1[50]);
assign sum0B = add3(state1[49],state1[48],state1[47],state1[46],state1[45],state1[44],state1[43]);
assign sum0C = add3(state1[42],state1[41],state1[40],state1[39],state1[38],state1[37],state1[36]);
assign sum0D = add3(state1[35],state1[34],state1[33],state1[32],state1[31],state1[30],state1[29]);
assign sum0E = add3(state1[28],state1[27],state1[26],state1[25],state1[24],state1[23],state1[22]);
assign sum0F = add3(state1[21],state1[20],state1[19],state1[18],state1[17],state1[16],state1[15]);
assign sum0G = add3(state1[14],state1[13],state1[12],state1[11],state1[10],state1[9],state1[8]);
assign sum0H = add3(state1[7],state1[6],state1[5],state1[4],state1[3],state1[2],state1[1]);
assign sum0I = add3(state1[0],0,0,0,0,0,0);
assign sum10 = add3(state2[126],state2[125],state2[124],state2[123],state2[122],state2[121],state2[120]);
assign sum11 = add3(state2[119],state2[118],state2[117],state2[116],state2[115],state2[114],state2[113]);
assign sum12 = add3(state2[112],state2[111],state2[110],state2[109],state2[108],state2[107],state2[106]);
assign sum13 = add3(state2[105],state2[104],state2[103],state2[102],state2[101],state2[100],state2[99]);
assign sum14 = add3(state2[98],state2[97],state2[96],state2[95],state2[94],state2[93],state2[92]);
assign sum15 = add3(state2[91],state2[90],state2[89],state2[88],state2[87],state2[86],state2[85]);
assign sum16 = add3(state2[84],state2[83],state2[82],state2[81],state2[80],state2[79],state2[78]);
assign sum17 = add3(state2[77],state2[76],state2[75],state2[74],state2[73],state2[72],state2[71]);
assign sum18 = add3(state2[70],state2[69],state2[68],state2[67],state2[66],state2[65],state2[64]);
assign sum19 = add3(state2[63],state2[62],state2[61],state2[60],state2[59],state2[58],state2[57]);
assign sum1A = add3(state2[56],state2[55],state2[54],state2[53],state2[52],state2[51],state2[50]);
assign sum1B = add3(state2[49],state2[48],state2[47],state2[46],state2[45],state2[44],state2[43]);
assign sum1C = add3(state2[42],state2[41],state2[40],state2[39],state2[38],state2[37],state2[36]);
assign sum1D = add3(state2[35],state2[34],state2[33],state2[32],state2[31],state2[30],state2[29]);
assign sum1E = add3(state2[28],state2[27],state2[26],state2[25],state2[24],state2[23],state2[22]);
assign sum1F = add3(state2[21],state2[20],state2[19],state2[18],state2[17],state2[16],state2[15]);
assign sum1G = add3(state2[14],state2[13],state2[12],state2[11],state2[10],state2[9],state2[8]);
assign sum1H = add3(state2[7],state2[6],state2[5],state2[4],state2[3],state2[2],state2[1]);
assign sum1I = add3(state2[0],1,0,0,0,0,0);
always@(posedge clk)
begin
sum0J <= add5(sum00,sum01,sum02,sum03);
sum0K <= add5(sum04,sum05,sum06,sum07);
sum0L <= add5(sum08,sum09,sum0A,sum0B);
sum0M <= add5(sum0C,sum0D,sum0E,sum0F);
sum0N <= add5(sum0G,sum0H,sum0I,0);
sum1J <= add5(sum10,sum11,sum12,sum13);
sum1K <= add5(sum14,sum15,sum16,sum17);
sum1L <= add5(sum18,sum19,sum1A,sum1B);
sum1M <= add5(sum1C,sum1D,sum1E,sum1F);
sum1N <= add5(sum1G,sum1H,sum1I,0);
end
assign sumA = add6(sum0J,sum1J);
assign sumB = add6(sum0K,sum1K);
assign sumC = add6(sum0L,sum1L);
assign sumD = add6(sum0M,sum1M);
assign sumE = add6(sum0N,sum1N);
assign sum = add8(sumA,sumB,sumC,sumD,sumE);
always@(posedge clk_out)
begin
noise <= {!sum[7],sum[6:0]};
end
function [2:0] add3;
input A,B,C,D,E,F,G;
begin
add3 = A + B + C + D + E + F + G;
end
endfunction
function [4:0] add5;
input [2:0] A,B,C,D;
begin
add5 = A + B + C + D;
end
endfunction
function [5:0] add6;
input [4:0] A,B;
begin
add6 = A + B;
end
endfunction
function [7:0] add8;
input [5:0] A,B,C,D,E;
begin
add8 = A + B + C + D + E;
end
endfunction
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -