第五章 電路分析與結果
5.7 傳統霍納法以RS(7,3)的分析
圖46. 傳統霍納法以RS(7,3)的分析結果
由圖46.可以看到傳統霍納法以RS(7,3)中clk最大可到達923.36MHz 5.8 傳統霍納法以RS(204,188)的分析結果
傳統霍納法以RS(204,188)的分析結果如圖47
由圖47.可以看到傳統霍納法以RS(204,188)中clk最大可到達589.97MHz
圖47. 傳統霍納法以RS(204,188)的分析結果
第六章 結論
本論文的研究方向改良RS Code中症狀子的計算速度和硬體化,在提升 速度上本論文有三個研究方向,第一是將接收到的訊息多項式進行分群,第 二把多項式改良成霍納法的形式,最後,再使用p多項式進行運算差值量法。
針對本論文中提出的方法與傳統的霍納法的比較與分析,發現傳統的霍納 法電路執行速度會受到乘法模組的影響,m的值越大,速度會越慢,而在本 論文的方法,較不會受限於m的大小,在分析的結果中執行的延遲最大在於 位移模組把值傳到pipeline模組中的過程,m越大時,在這兩個模組傳遞中,
延遲不會在往上提升。針對m=3和8之設計上,其設計法一樣將輸入以三個 為一組進行傳遞,經由比較clk的時間來分析速度如表3,整體計算症狀子效 能,比傳統霍納法實作電路改進約32%的速度。
表3. 分析結果比較
傳統霍納法 本論文方法 提升
m=3 923.36MHz 1084.6MHz 16%
m=8 589.97MHz 868.06MHz 32%
參考文獻
[1] Stephen B. Wicker,“Error Control systems for Digital Communication and Storage,” Prentice hall international, Inc.
[2] S. B. Wicker and V. K. Bhargava, Reed–Solomon Codes and Their Application.New York: IEEE Press, 1994.
[3] Eklund, R. B. Marks, K. L. Stanwood, and S. Wang, “IEEE standard 802.16:
A technical overview of theWirelessMAN air interface for broadband wireless access,” IEEE Commun. Mag., vol. 40, no. 6, pp. 98–107, 2002.
[4] S. B. Wicker, Error Control systems for Digital Communication and Storage, Englewood Cliffs, N.J.: Prentice-Hall, 1994.
[5] Yeh,C.S.,Reed, I. S., and Troung, T.K., “Systolic Multipliers for Finite Fileds𝐺𝐹(2𝑚), ”IEEE Trans. Computers. Papers C-33, 357-360, 1984.
[6] X. Tang, and S. Wang “A Low Hardware Overhead Self-Diagnosis Technique Using Reed-Solomon Codes for Self-Repairing Chips,” IEEE Trans. Computers, vol. 59, no. 10, pp.1309-1319, 2010.
[7] Lin, T. C., Truong, T. K., and Chen, P. D., "A fast algorithm for the syndrome calculation in algebraic decoding of Reed–Solomon codes,"
IEEE Trans. Commun. Papers 5(12), 2240-2244 2009.
[8] Sergei V. Fedorenko, and Peter V. Trifonov, “Finding Roots of Polynomials Over Finite Fields,” IEEE Trans. Commun., vol. 50, pp. 1709–1711, 2002.
[9] T. K. Truong, J. H. Jeng, and I. S. Reed, “Fast algorithm for computing the roots of error locator polynomials up to degree 11 in Reed–Solomon decoders,” IEEE Trans. Commun., vol. 49, pp. 779–783, 2001.
[10] E. Costa , S. V. Fedorenko and P. V. Trifonov, “On computing the syndrome polynomial in Reed–Solomon decoder,” Euro. Trans. Telecom., vol. 15, no. 4, pp.337 -342, 2004.
[11] Berlekamp, E. R., [Algebraic Coding Theory]. New York: McGraw-Hill, 1968.
附錄
以(7,3, 5) RS碼,完整的Verilog code:
module ok(cls,clk,clk3,data,S0,S1,S2,S3,L0,L1,L2,SF0,SF1,SF2,count1,LST);
input clk;
output clk3,cls;
input [2:0] data;
output [2:0] S0,S1,S2,S3;
output [2:0] L0,L1,L2;
output [2:0] SF0,SF1,SF2,LST;
output [1:0] count1;
reg [2:0] reg0,reg1,reg2,ll0,ll1,ll2;
reg [1:0] count;
reg [2:0] ccls;
wire [2:0] w0,w1,w2,w3;
wire [2:0] wL0,wL1,wL2;
reg clst;
assign cls=clst;
always@(posedge clk) begin
always@(posedge clk) begin
reg0<=data;
reg1<=reg0;
reg2<=reg1;
end
always@(posedge clk3, negedge cls) begin
madeL LM0(reg1,3’b001,3’b001,3’b001,ll0,ll1,ll2,cls,clk3,wL0,w0,SF0); // alpha1, alpha2, alpha3 madeL LM1(reg1,3’b010,3’b100,3’b011,ll0,ll1,ll2,cls,clk3,wL1,w1,SF1);
madeL LM2(reg1,3’b100,3’b110,3’b101,ll0,ll1,ll2,cls,clk3,wL2,w2,SF2);
pmode LM3(reg1,3’b011,3’b100,3’b111,wL0,wL1,wL2,SF2,cls,clk3,w3,LST); //alpha1, alpha3, z assign L0=wL0;
assign L1=wL1;
assign L2=wL2;
assign S0=w0;
assign S1=w1;
assign S2=w2;
assign S3=w3;
assign clk3=!(!count[0]&count[1]);
always@(negedge clk) begin
assign count1=count;
endmodule module mul(a,b,c);
input [2:0]a,b;
output [2:0]c;
wire [2:0] w1,w2;
assign w1={a[2],a[2],a[2]}&b;
assign w2={a[1],a[1],a[1]}&b^{1’b0,w1[2],w1[2]}^{w1[1],w1[0],1’b0};
assign c={a[0],a[0],a[0]}&b^{1’b0,w2[2],w2[2]}^{w2[1],w2[0],1’b0};
endmodule
module madeL(data,alpha1,alpha2,alpha3,d1,d2,d3,cls,clk3,Lx,Sx,SFx);
input [2:0] alpha1, alpha2, alpha3, d1, d2, d3, data;
input cls,clk3;
output [2:0] Lx,Sx,SFx;
reg [2:0] St;
reg [2:0] Sx;
wire [2:0] w0, w1,aw0,aw1,w0t,w1t,w2t;
assign aw1=alpha2;
assign aw0=alpha1;
mul u1(aw1,d3,w1);
mul u0(aw0,d2,w0);
assign Lx=w1^w0;
assign w0t=Lx^d1^St;
assign SFx=Lx^d1;
mul Syn(w0t,alpha3,w1t);
mul Syn1(w0t,alpha1,w2t);
always@(negedge cls) begin
Sx=w2t^data;
end
always@(posedge clk3, negedge cls) begin
module pmode(data,alpha1,alpha3,Z,L0,L1,L2,SFx,cls,clk3,Sx,LST);
input cls, clk3;
input [2:0] data, alpha1, alpha3, Z, L0, L1, L2, SFx;
output[2:0] Sx,LST;
wire [2:0] ztemp,w0t,w1t,w2t;
reg [2:0] St;
reg [2:0] Sx;
assign ztemp= (L0&{3{Z[0]}}) ^ (L1&{3{Z[1]}})^ (L2&{3{Z[2]}}) ^ SFx;
assign w0t=ztemp^St;
mul Syn(w0t,alpha3,w1t);
mul Syn1(w0t,3’b011,w2t);
//assign Sx=w0t;
assign LST=w0t;
always@(negedge cls) begin
Sx=w2t^data;
end
always@(negedge clk3, negedge cls) begin
以(204,188, t=8)RS 碼,完整的 Verilog code:
module
ok(cls,clk,clk3,data,S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,L0,L1,L2,L3,L4,L5,L6,L7,SF7);
parameter size=8;
input clk;
output clk3,cls;
input [size-1:0] data;
output [size-1:0] S0,S1,S2,S3,S4,S5,S6,S7;
output [size-1:0] S8,S9,S10,S11,S12,S13,S14,S15;
output [size-1:0] L0,L1,L2,L3,L4,L5,L6,L7;
output [size-1:0] SF7;
wire [size-1:0] SF0,SF1,SF2,SF3,SF4,SF5,SF6;
//output [1:0] count1;
reg [size-1:0] reg0,reg1,reg2,ll0,ll1,ll2;
reg [1:0] count;
reg [size-1:0] ccls;
wire [size-1:0] w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14,w15;
wire [size-1:0] wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7;
reg clst;
assign cls=clst;
always@(posedge clk) begin
if (ccls==8'hd0) begin
end
always@(posedge clk) begin
reg0<=data;
reg1<=reg0;
reg2<=reg1;
end
always@(posedge clk3, negedge cls) begin
madeL LM0(reg1,8'b00000001,8'b00000001,8'b00000001,ll0,ll1,ll2,cls,clk3,wL0,w0,SF0);//0 madeL LM1(reg1,8'b00000010,8'b00000100,8'b00001000,ll0,ll1,ll2,cls,clk3,wL1,w1,SF1);//1 madeL LM2(reg1,8'b00000100,8'b00010000,8'b01000000,ll0,ll1,ll2,cls,clk3,wL2,w2,SF2);//2 madeL LM3(reg1,8'b00001000,8'b01000000,8'b00111010,ll0,ll1,ll2,cls,clk3,wL3,w3,SF3);//3 madeL LM4(reg1,8'b00010000,8'b00011101,8'b11001101,ll0,ll1,ll2,cls,clk3,wL4,w4,SF4);//4 madeL LM5(reg1,8'b00100000,8'b01101100,8'b00100110,ll0,ll1,ll2,cls,clk3,wL5,w5,SF5);//5 madeL LM6(reg1,8'b01000000,8'b10101101,8'b00101101,ll0,ll1,ll2,cls,clk3,wL6,w6,SF6);//6 madeL LM7(reg1,8'b10000000,8'b10001110,8'b01110101,ll0,ll1,ll2,cls,clk3,wL7,w7,SF7);//7
pmode LM8(reg1,3'b011,3'b100,3'b111,wL0,wL1,wL2,SF2,cls,clk3,w3);
pmode LM9(reg1,8'h1d,8'hc9,8'h9d,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w8);
pmode LM10(reg1,8'h3a,8'h06,8'hba,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w9); //alpha1, alpha3, z
pmode LM11(reg1,8'h74,8'h30,8'hf4,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w10);
pmode LM12(reg1,8'he8,8'h9d,8'h68,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w11);
pmode LM13(reg1,8'hcd,8'h9c,8'h4d,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w12);
pmode LM14(reg1,8'h87,8'h94,8'h07,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w13);
pmode LM15(reg1,8'h13,8'hd4,8'h93,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w14);
pmode LM16(reg1,8'h26,8'hee,8'ha6,wL0,wL1,wL2,wL3,wL4,wL5,wL6,wL7,SF7,cls,clk3,w15);
//pmode LM3(reg1,3'b011,3'b100,3'b111,wL0,wL1,wL2,SF2,cls,clk3,w3); //alpha1, alpha3, z
assign L0=wL0;
assign L1=wL1;
assign L2=wL2;
assign L3=wL3;
assign L4=wL4;
assign L5=wL5;
assign L6=wL6;
assign L7=wL7;
assign S0=w0;
assign S1=w1;
assign S2=w2;
assign S3=w3;
assign S4=w4;
assign S5=w5;
assign S6=w6;
assign S7=w7;
assign S8=w8;
assign S9=w9;
assign S10=w10;
assign S11=w11;
assign S12=w12;
assign S13=w13;
assign S14=w14;
assign S15=w15;
assign clk3=!(!count[0]&count[1]);
always@(negedge clk) begin
//assign count1=count;
endmodule
module mul (a,b,c);
input [7:0] a,b;
output [7:0] c;
wire [7:0] w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13;
assign w0={a[7],a[7],a[7],a[7],a[7],a[7],a[7],a[7]}&b;
assign
assign
module madeL(data,alpha1,alpha2,alpha3,d1,d2,d3,cls,clk3,Lx,Sx,SFx);
parameter size=8;
input [size-1:0] alpha1, alpha2, alpha3, d1, d2, d3, data;
input cls,clk3;
output [size-1:0] Lx,Sx,SFx;
reg [size-1:0] St;
reg [size-1:0] Sx;
wire [size-1:0] w0, w1,aw0,aw1,w0t,w1t,w2t;
assign aw1=alpha2;
assign aw0=alpha1;
mul u1(aw1,d3,w1);
mul u0(aw0,d2,w0);
assign Lx=w1^w0;
assign w0t=Lx^d1^St;
assign SFx=Lx^d1;
mul Syn(w0t,alpha3,w1t);
mul Syn1(w0t,alpha1,w2t);
always@(negedge cls) begin
Sx=w2t^data;
end
always@(posedge clk3, negedge cls) begin
module pmode(data,alpha1,alpha3,Z,L0,L1,L2,L3,L4,L5,L6,L7,SFx,cls,clk3,Sx);
parameter size=8;
input cls, clk3;
input [size-1:0] data, alpha1, alpha3, Z, L0, L1, L2,L3,L4,L5,L6,L7,SFx;
output[size-1:0] Sx;
wire [size-1:0] ztemp,w0t,w1t,w2t;
reg [size-1:0] St;
reg [size-1:0] Sx;
assign ztemp= (L0&{size{Z[0]}}) ^ (L1&{size{Z[1]}})^ (L2&{size{Z[2]}})^(L3&{size{Z[3]}}) ^ (L4&{size{Z[4]}})^ (L5&{size{Z[5]}})^(L6&{size{Z[6]}}) ^ (L7&{size{Z[7]}})^ SFx;
assign w0t=ztemp^St;
mul Syn(w0t,alpha3,w1t);
mul Syn1(w0t,alpha1,w2t);
//assign Sx=w0t;
//assign LST=w0t;
always@(negedge cls) begin
Sx=w2t^data;
end
always@(negedge clk3, negedge cls) begin
module syndH(clk,d,s0,s1,s2,s3);
input clk;
input [2:0] d;
output[2:0]s0,s1,s2,s3;
SX u1 (clk,d,3'b001,s0);
SX u2 (clk,d,3'b010,s1);
SX u3 (clk,d,3'b100,s2);
SX u4 (clk,d,3'b011,s3);
endmodule
module mul(a,b,c);
input [2:0]a,b;
output [2:0]c;
wire [2:0] w1,w2;
assign w1={a[2],a[2],a[2]}&b;
assign w2={a[1],a[1],a[1]}&b^{1'b0,w1[2],w1[2]}^{w1[1],w1[0],1'b0};
assign c={a[0],a[0],a[0]}&b^{1'b0,w2[2],w2[2]}^{w2[1],w2[0],1'b0};
endmodule
module SX(clk,data,alpha,So);
input [2:0] alpha;
input clk;
reg [2:0] So;
wire [2:0] w0,w1;
assign w0=data^So;
mul u0(w0,alpha,w1);
always@(posedge clk) begin
So=w1;
end
endmodule
(204,188, t=8) RS 碼,霍納法完整 verilog code:
module syndH(clk,d,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);
parameter size=8;
input clk;
input [size-1:0] d;
output[size-1:0]s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15;
SX u0 (clk,d,8'b00000001,s0);
SX u1 (clk,d,8'b00000010,s1);
SX u2 (clk,d,8'b00000100,s2);
SX u3 (clk,d,8'b00001000,s3);
SX u4 (clk,d,8'b00010000,s4);
SX u5 (clk,d,8'b00100000,s5);
SX u6 (clk,d,8'b01000000,s6);
SX u7 (clk,d,8'b10000000,s7);
SX u8 (clk,d,8'b00011101,s8);
SX u9 (clk,d,8'b00111010,s9);
SX u10 (clk,d,8'b01110100,s10);
SX u11 (clk,d,8'b11101000,s11);
SX u12 (clk,d,8'hcd,s12);
SX u13 (clk,d,8'h87,s13);
SX u14 (clk,d,8'h13,s14);
SX u15 (clk,d,8'h26,s15);
endmodule
module mul (a,b,c);
input [7:0] a,b;
output [7:0] c;
wire [7:0] w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13;
assign w0={a[7],a[7],a[7],a[7],a[7],a[7],a[7],a[7]}&b;
assign
3[4],w3[3],w3[2],w3[1],w3[0],1'b0};
module SX(clk,data,alpha,So);
parameter size=8;
input [size-1:0] alpha;
input clk;
input [size-1:0] data;
output [size-1:0] So;
reg [size-1:0] So;
wire [size-1:0] w0,w1;
assign w0=data^So;
mul u0(w0,alpha,w1);
always@(posedge clk) begin
So=w1;
end
endmodule
Dev C++ 軟體模擬的程式碼:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
int m=3;
int t=2;
unsigned int p;
unsigned int GFM(unsigned int a, unsigned int b) {
unsigned mask=pow(2,m)-1;
for(int i=m-1;i>=1;i--) {
c=c^a*((b>>i)&0x01);
c=((c<<1)&mask)^(p*((c>>(m-1))&0x01));
return c;
}
unsigned int powa(unsigned int alpha, int pv) {
int main(int argc, char *argv[]) {
} //--for i
cout << "---" << endl;
for(int j=0;j<2*t;j++){
A[j]=A[j]^a[0];
// cout << "S" << j << "=" << A[j] << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}