Quantcast
Channel: ずるやすみねこのリサイズ研究
Viewing all 1278 articles
Browse latest View live

しかし

$
0
0
地デジができる前のとき、地デジの仕様が決まったころ、リードソロモン(255、239)を設計していたら、稼げたかもしれないというのが残念でならない。
アルテラのリードソロモンコンパイラはFPGAでしか使えないみたい。
なので、この符号器、復号器のIPを売ってる会社は商売になっているようだ。
大企業がお得意さんだからね。
大企業では、今となっては、自分でつくらず、下請けが作ったIPを搭載してるふうにみえる。
LSIに搭載すれば、高速で動作しそうだ。

電子ビーム

$
0
0
陰極線管、ブラウン管など、電子自体が加速されて動いている回路系では、電子ビームがターゲットにぶつかって速度がおちるので、陰極線菅、ブラウン管に電気を供給する導線に一定の電流がながれる。

これは、滝とその上流と下流の川にたとえることができる。

電子ビームの流れているところでは、電界、磁界が光速という一定速度で流れている。
電子の速度は変化しているがである。

このあたりを研究した人はいないのかなあといつも思う。

ほっ

$
0
0
普通の人が仕事でやることを、お金もらわないでやってるわたしっていったい・・・・。
普通の人が仕事でやることを自由時間を削ってやってるわたしっていったい・・・・。

一般の人からみたら、変な人であるが、
本人はいたって楽しいのである。

地デジリードソロモン生成多項式展開結果

$
0
0
(X+1)(X+α)(X+α^2)(X+α^3)・・・(X+α^15)
=X^16+(α^120)X^15+(α^104)X^14+(α^107)X^13
+(α^109)X^12+(α^102)X^11+(α^161)X^10
+(α^76)X^9+(α^3)X^8+(α^91)X^7+(α^191)X^6
+(α^147)X^5+(α^169)X^4+(α^182)X^3
+(α^194)X^2+(α^225)X+α^120

これで、地デジリードソロモン符号器はできたようなもんだ。

理系はおたく

$
0
0
理系は、おたく。いってみればかたわである。しかし、理系は利益を生み出すものを作れる。よって、理系が生み出した利益をもとに経済がまわっていく。税金もはいる。
よって国は、理系がかたわ(バランスがとれた人間ではないということ)であるとはいわず、理系に進むように推奨する。しかし、バランスがとれた人間は文系に進む。おたくなことはやりたくないからである。
文系もハイレベルな人間は、複雑な難しい問題を考えられる。しかも、バランス感覚がすぐれているので
物事をうまくもっていくことができる。理系は専門的なことは得意だが、バランスが欠如している。
よって、理系は、「俺たちが、外貨をかせいでいるのに、文系は楽をして給料をもらっている。しかも、理系より高額な給料をもらっている。」と吠える。
しかし、理系のほとんどは、専門的なことを考えるのは得意だが、バランス感覚をもって物事を進めることができない。文系でも給料が高い連中は、複雑な問題を、バランス感覚をもって考え、進めることができるのである。しかし、世の中はよくできていて、作業しかできない文系は給料が安いのである。
理系頭でも文系の扱う問題を考えられる人間もいる。そういう人は、経営を行えばいい。専門知識もあるし
組織の司令塔として利益を最大にもっていくことができるからである。
文系の人間でも作業ができて、さらに複雑な難しい問題を考えることができないと上にはいけない。
作業ができないで、考えるだけのいばっている文系はさらに上にはいけない。係長どまりであろう。
ソニーのストリンガーさんは、複雑なことを考えられる人だったが、専門知識がないので、だめだった。
文系には、複雑な物事を考え、うまくもっていく人間になりたくて文系に進むハイレベルな人間と勉強が嫌いだから文系に進むローレベルな人間に分けられる。
理系には、ローレベルな人間がいない。ローレベルだとまずついていけない。
まあ、間違えて理系に進んでしまった人を救う受け皿も企業は用意しているのではあるがである。

ベクトル多項式除算器(予告)

$
0
0
verilogを書いたら、ブログのページを分けて分割してどどんと載せる予定です。
ゴールデンウィークも忙しいので、今しばらくお待ちを。
RSのIP作ってる会社は、性能を上げるために、工夫してるはずなので、営業妨害になならないはず。
ピーターソン法+チェン探索+フォーニーの元になる式の方法による復号器もいちおうつくったらどどんとのせます。

そうそう、たぶん、この世の中にピーターソン法で地デジリードソロモンの復号器を作った人はいないと思うので、著作権違反には絶対ならないのであった
8x8の正方行列の行列式の計算回路がいるのだが、FPGAにのせることを考えて、マージンをみて20クロックくらいのマルチサイクルパスでつくる予定です。なにしろ余因子展開は符号を全部+でやればいいので簡単なのです。

地デジリードソロモン符号器のFPGA用回路つくりはじめた。

$
0
0
地デジリードソロモン用GF(2^8)ガロア拡大体乗算器のVerilogソースです。
動作確認してあります。
マルチサイクルパスを使ってます。
ガロア拡大の元を8ビットで表現したものをa[7:0],b[7:0]とします。
1クロック幅のパルスinenにのせて、a,bをいれてやると
inenから10クロック後に1クロック幅のパルスoutenが出力され、outenが立ち上がって立ち下がったあとにcにa,bの積が出力されます。
inenから10クロックの間は、データを読まないほうがよいです。
ま、このまま使う人はいないと思うので、演算回路のゲートだけコピペして使ってください。


module GF256MULT (
clk,
rst_n,
a,
b,
c,
inen,
outen
);

input clk;
input rst_n;
input [7:0] a;
input [7:0] b;
output [7:0] c;
input inen;
output outen;

reg [3:0] cnt;
reg cnt_en,outen;
reg [7:0] c;
reg [7:0] la,lb;
wire KEI14,KEI13,KEI12,KEI11,KEI10,KEI9,KEI8,KEI7,KEI6,KEI5,KEI4,KEI3,KEI2,KEI1,KEI0;
wire [7:0] wc;


assign KEI14 = la[7] & lb[7];
assign KEI13 = (la[7] & lb[6]) ^ (la[6] & lb[7]);
assign KEI12 = (la[7] & la[5]) ^ (la[6] & lb[6]) ^ (la[5] & lb[7]);
assign KEI11 = (la[7] & lb[4]) ^ (la[6] & lb[5]) ^ (la[5] & lb[6]) ^ (la[4] & lb[7]);
assign KEI10 = (la[7] & lb[3]) ^ (la[6] & lb[4]) ^ (la[5] & lb[5]) ^ (la[4] & lb[6]) ^ (la[3] & lb[7]);
assign KEI9 = (la[7] & lb[2]) ^ (la[6] & lb[3]) ^ (la[5] & lb[4]) ^ (la[4] & lb[5]) ^ (la[3] & lb[6]) ^ (la[2] & lb[7]);
assign KEI8 = (la[7] & lb[1]) ^ (la[6] & lb[2]) ^ (la[5] & lb[3]) ^ (la[4] & lb[4]) ^ (la[3] & lb[5]) ^ (la[2] & lb[6]) ^ (la[1] & lb[7]);
assign KEI7 = (la[7] & lb[0]) ^ (la[6] & lb[1]) ^ (la[5] & lb[2]) ^ (la[4] & lb[3]) ^ (la[3] & lb[4]) ^ (la[2] & lb[5]) ^ (la[1] & lb[6]) ^ (la[0] & lb[7]);
assign KEI6 = (la[6] & lb[0]) ^ (la[5] & lb[1]) ^ (la[4] & lb[2]) ^ (la[3] & lb[3]) ^ (la[2] & lb[4]) ^ (la[1] & lb[5]) ^ (la[0] & lb[6]);
assign KEI5 = (la[5] & lb[0]) ^ (la[4] & lb[1]) ^ (la[3] & lb[2]) ^ (la[2] & lb[3]) ^ (la[1] & lb[4]) ^ (la[0] & lb[5]);
assign KEI4 = (la[4] & lb[0]) ^ (la[3] & lb[1]) ^ (la[2] & lb[2]) ^ (la[1] & lb[3]) ^ (la[0] & lb[4]);
assign KEI3 = (la[3] & lb[0]) ^ (la[2] & lb[1]) ^ (la[1] & lb[2]) ^ (la[0] & lb[3]);
assign KEI2 = (la[2] & lb[0]) ^ (la[1] & lb[1]) ^ (la[0] & lb[2]);
assign KEI1 = (la[1] & lb[0]) ^ (la[0] & lb[1]);
assign KEI0 = la[0] & lb[0];



//KEI14=a7*b7
//KEI13=a7*b6+a6*b7
//KEI12=a7*a5+a6*b6+a5*b7
//KEI11=a7*b4+a6*b5+a5*b6+a4*b7
//KEI10=a7*b3+a6*b4+a5*b5+a4*b6+a3*b7
//KEI9 =a7*b2+a6*b3+a5*b4+a4*b5+a3*b6+a2*b7
//KEI8 =a7*b1+a6*b2+a5*b3+a4*b4+a3*b5+a2*b6+a1*b7
//KEI7 =a7*b0+a6*b1+a5*b2+a4*b3+a3*b4+a2*b5+a1*b6+a0*b7
//KEI6 =a6*b0+a5*b1+a4*b2+a3*b3+a2*b4+a1*b5+a0*b6
//KEI5 =a5*b0+a4*b1+a3*b2+a2*b3+a1*b4+a0*b5
//KEI4 =a4*b0+a3*b1+a2*b2+a1*b3+a0*b4
//KEI3 =a3*b0+a2*b1+a1*b2+a0*b3
//KEI2 =a2*b0+a1*b1+a0*b2
//KEI1 =a1*b0+a0*b1
//KEI0 =a0*b0


//(KEI13+KEI12+KEI11+KEI7)*X^7
//+(KEI12+KEI11+KEI10+KEI6)*X^6
//+(KEI11+KEI10+KEI9+KEI5)*X^5
//+(KEI14+KEI10+KEI9+KEI8+KEI4)*X^4
//+(KEI12+KEI11+KEI9+KEI8+KEI3)*X^3
//+(KEI13+KEI12+KEI10+KEI8+KEI2)*X^2
//+(KEI14+KEI13+KEI9+KEI1)*X
//+(KEI14+KEI13+KEI12+KEI8+KEI0)

assign wc[7] = KEI13 ^ KEI12 ^ KEI11 ^ KEI7;
assign wc[6] = KEI12 ^ KEI11 ^ KEI10 ^ KEI6;
assign wc[5] = KEI11 ^ KEI10 ^ KEI9 ^ KEI5;
assign wc[4] = KEI14 ^ KEI10 ^ KEI9 ^ KEI8 ^ KEI4;
assign wc[3] = KEI12 ^ KEI11 ^ KEI9 ^ KEI8 ^ KEI3;
assign wc[2] = KEI13 ^ KEI12 ^ KEI10 ^ KEI8 ^ KEI2;
assign wc[1] = KEI14 ^ KEI13 ^ KEI9 ^ KEI1;
assign wc[0] = KEI14 ^ KEI13 ^ KEI12 ^ KEI8 ^ KEI0;

//multi cycle pass

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
outen <= 1'b0;
else if(cnt_en == 1'b1 && cnt == 4'd10)
outen <= 1'b1;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
cnt <= 4'd0;
else if(inen)
cnt <= 4'd1;

else if(cnt_en)
cnt <= cnt + 1'b1;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
cnt_en <= 1'b0;
else if(inen)
cnt_en <= 1'b1;
else if(cnt_en == 1'b1 && cnt == 4'd10)
cnt_en <= 1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
outen <= 1'b0;
else
outen <= (cnt_en == 1'b1 && cnt == 4'd9) ? 1'b1 : 1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
c <= 7'd0;
else if(outen)
c <= wc;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n) begin
la <= 7'd0;
lb <= 7'd0;
end
else if(inen) begin
la <= a;
lb <= b;
end
end

endmodule

結局

$
0
0
マルチサイクルパスを使うくらいなら、クロックを遅くしたほうがいいことはいいのだが、ハードは並列処理をすることができる。
10クロックに1回、1バイト処理するなら、10バイトを10クロックに1回処理すれば、1クロックに1バイト処理することができる。
パラレルCRCに使われる技術を使えばよい。
1バイトをDEMUXして10バイトにして10クロックに1回データが変化するようにつくればいい。
処理後10バイトのデータを1バイトにMUXして1クロックに1バイト出力すればよい。
おじさんは、10バイトを1度に処理するGF(2^8)乗算器をパラレルでやることはかんがえていなかったので、このままつくる。

マルチサイクルパス+DEMUX、MUXで、膨大な組み合わせ回路のために、1クロック内で処理が終わらない回路を1クロックで処理することができる。

10クロック先の結果を1クロック後にだすテクニックは、パラレルCRCで使われている。

よーしつくったる

$
0
0
10クロックのマルチサイクルパス用のガロア拡大体(GF2^8)どうしの積を求める乗算器のソースを公開したが、この回路を生かした高速エンコーダはあとにとっておく。(マルチサイクルパス+10クロック先の結果を1クロック後に得る回路)による高速エンコーダは最後につくる。
まずはエンコーダのデバッグ用に、マルチサイクルパスを使わない乗算器で、エンコーダをつくる。
こいつをまずデバッグして、神様とする。

そして、10クロック先の結果を1クロック後に得る回路を考えて、神様をもとにデバッグするのである。

エンコーダはマルチサイクルパスを使わなくても今のXilinxの最高のFPGAを使えば高速に動くと思うが、安価なFPGAで高速動作させるためには、マルチサイクルパス+Nクロック先の結果を1クロック後に得る回路なのである。

エンコーダもごつい回路になる。

地デジリードソロモン符号器ができたけど

$
0
0
ガロア拡大体(GF2^8)の元どうしの積をもとめる乗算器を組み合わせ回路にして遅延0にした
RS(255,239)符号器のverilog記述が完成した。シミュレーションしてみたら検査バイトの値があってるか違ってるかわからないけど、それ以外は問題ないみたいである。
多項式の除算を筆算方式でとくアルゴリズムでC言語プログラムして、検証してみたい。
明日以降になる。

ソースをはっておく

$
0
0
符号器のトップモジュール

module RS255239ENC (
clk,
rst_n,
in,
out,
start,//1pulse
end1,
inen,
outen
);

input clk;
input rst_n;
input [7:0] in;
output [7:0] out;
input start;
output end1;
input inen;
output outen;

reg [7:0] in1D,FF0,FF1,FF2,FF3,FF4,FF5,FF6,FF7,FF8,FF9,FF10,FF11,FF12,FF13,FF14,FF15;
//reg LP0,LP1,LP2,LP3,LP4,LP5,LP6,LP7,LP8,LP9,LP10,LP11,LP12,LP13,LP14,LP15;
wire [7:0] MULTIN,MULTOUT0,MULTOUT1,MULTOUT2,MULTOUT3,MULTOUT4,MULTOUT5,MULTOUT6,MULTOUT7,MULTOUT8,MULTOUT9,MULTOUT10,MULTOUT11,MULTOUT12,MULTOUT13,MULTOUT14,MULTOUT15;
reg [7:0] out,DATACNT;
reg end1,start1D,inen1D,outen,FF_EN;


// +---------------+
//start | |
// -------+ +---------------+---------------+---------------+---------------+---------------+---------------+---------------+
// +----------------------------------------------------------------------------------------------------------------
//inen |
// -----------------------+
// ---------------------------------------+---------------+---------------+---------------+---------------+---------------+---------------+
//in FIRST | SECOND | THIRD |
// ---------------------------------------+---------------+---------------+---------------+---------------+---------------+---------------+
//
//
//
//
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
outen <= 1'b0;
else
outen <= FF_EN;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
out <= 8'd0;
else
out <= (inen1D) ? in1D : FF15;
end

assign MULTIN = FF15 ^ in1D;

// DATA COUNTER
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
DATACNT <= 8'd0;
else if(start)
DATACNT <= 8'd1;
else if(DATACNT == 8'd255)
DATACNT <= 8'd0;
else if((inen && DATACNT >= 8'd1 && DATACNT <= 8'd238) || (DATACNT >= 8'd239))
DATACNT <= DATACNT + 1'b1;
end

//assign DATACNTEN = inen & ((DATACNT >= 8'd1 && DATACNT <= 8'd239) ? 1'b1:1'b0);

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF_EN <= 1'b0;
else
FF_EN <= ((inen == 1'b1) || (DATACNT >= 8'd1 && DATACNT <= 8'd255)) ? 1'b1:1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
end1 <= 1'b0;
else
end1 <= (DATACNT == 8'd255) ? 1'b1:1'b0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n) begin
in1D <= 8'd0;
inen1D <= 1'b0;
start1D <= 1'b0;
// DATACNTEN1D <= 1'b0;
// FF_EN1D <= 1'b0;
end
else begin
in1D <= in;
inen1D <= inen;
start1D <= start;
// DATACNTEN1D <= DATACNTEN;
// FF_EN1D <= FF_EN;
end
end

//assign outen = FF_EN1D;

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF0 <= 8'd0;
else if(start1D)
FF0 <= 8'd0;
else
FF0 <= (inen1D) ? in1D ^ FF15 : 8'd0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF1 <= 8'd0;
else if(start1D)
FF1 <= 8'd0;
else
FF1 <= (inen1D) ? MULTOUT0 ^ FF0 : FF0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF2 <= 8'd0;
else if(start1D)
FF2 <= 8'd0;
else
FF2 <= (inen1D) ? MULTOUT1 ^ FF1 : FF1;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF3 <= 8'd0;
else if(start1D)
FF3 <= 8'd0;
else
FF3 <= (inen1D) ? MULTOUT2 ^ FF2 : FF2;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF4 <= 8'd0;
else if(start1D)
FF4 <= 8'd0;
else
FF4 <= (inen1D) ? MULTOUT3 ^ FF3 : FF3;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF5 <= 8'd0;
else if(start1D)
FF5 <= 8'd0;
else
FF5 <= (inen1D) ? MULTOUT4 ^ FF4 : FF4;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF6 <= 8'd0;
else if(start1D)
FF6 <= 8'd0;
else
FF6 <= (inen1D) ? MULTOUT5 ^ FF5 : FF5;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF7 <= 8'd0;
else if(start1D)
FF7 <= 8'd0;
else
FF7 <= (inen1D) ? MULTOUT6 ^ FF6 : FF6;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF8 <= 8'd0;
else if(start1D)
FF8 <= 8'd0;
else
FF8 <= (inen1D) ? MULTOUT7 ^ FF7 : FF7;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF9 <= 8'd0;
else if(start1D)
FF9 <= 8'd0;
else
FF9 <= (inen1D) ? MULTOUT8 ^ FF8 : FF8;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF10 <= 8'd0;
else if(start1D)
FF10 <= 8'd0;
else
FF10 <= (inen1D) ? MULTOUT9 ^ FF9 : FF9;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF11 <= 8'd0;
else if(start1D)
FF11 <= 8'd0;
else
FF11 <= (inen1D) ? MULTOUT10 ^ FF10 : FF10;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF12 <= 8'd0;
else if(start1D)
FF12 <= 8'd0;
else
FF12 <= (inen1D) ? MULTOUT11 ^ FF11 : FF11;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF13 <= 8'd0;
else if(start1D)
FF13 <= 8'd0;
else
FF13 <= (inen1D) ? MULTOUT12 ^ FF12 : FF12;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF14 <= 8'd0;
else if(start1D)
FF14 <= 8'd0;
else
FF14 <= (inen1D) ? MULTOUT13 ^ FF13 : FF13;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF15 <= 8'd0;
else if(start1D)
FF15 <= 8'd0;
else
FF15 <= (inen1D) ? MULTOUT14 ^ FF14 : FF14;
end



GF256MULT GF256MULT0(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h3b),
.c(MULTOUT0)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT1(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h24),
.c(MULTOUT1)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT2(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h32),
.c(MULTOUT2)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT3(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h62),
.c(MULTOUT3)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT4(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'he5),
.c(MULTOUT4)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT5(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h29),
.c(MULTOUT5)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT6(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h41),
.c(MULTOUT6)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT7(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'ha3),
.c(MULTOUT7)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT8(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h08),
.c(MULTOUT8)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT9(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h1e),
.c(MULTOUT9)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT10(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'hd1),
.c(MULTOUT10)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT11(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h44),
.c(MULTOUT11)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT12(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'hbd),
.c(MULTOUT12)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT13(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h68),
.c(MULTOUT13)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT14(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h0d),
.c(MULTOUT14)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT15(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h3b),
.c(MULTOUT15)//,
//.inen(),
//.outen()
);
endmodule

ソースをはっておく2

$
0
0
ガロア体乗算器 RS255239ENC からよびだされるサブモジュール

module GF256MULT (
clk,
rst_n,
a,
b,
c
// inen,
// outen
);

input clk;
input rst_n;
input [7:0] a;
input [7:0] b;
output [7:0] c;
//input inen;
//output outen;
//reg [3:0] cnt;
//reg cnt_en,outen;
//reg [7:0] c;
//reg [7:0] la,lb;
wire KEI14,KEI13,KEI12,KEI11,KEI10,KEI9,KEI8,KEI7,KEI6,KEI5,KEI4,KEI3,KEI2,KEI1,KEI0;
wire [7:0] wc,la,lb;
assign c = wc;
assign la = a;
assign lb = b;

assign KEI14 = la[7] & lb[7];
assign KEI13 = (la[7] & lb[6]) ^ (la[6] & lb[7]);
assign KEI12 = (la[7] & la[5]) ^ (la[6] & lb[6]) ^ (la[5] & lb[7]);
assign KEI11 = (la[7] & lb[4]) ^ (la[6] & lb[5]) ^ (la[5] & lb[6]) ^ (la[4] & lb[7]);
assign KEI10 = (la[7] & lb[3]) ^ (la[6] & lb[4]) ^ (la[5] & lb[5]) ^ (la[4] & lb[6]) ^ (la[3] & lb[7]);
assign KEI9 = (la[7] & lb[2]) ^ (la[6] & lb[3]) ^ (la[5] & lb[4]) ^ (la[4] & lb[5]) ^ (la[3] & lb[6]) ^ (la[2] & lb[7]);
assign KEI8 = (la[7] & lb[1]) ^ (la[6] & lb[2]) ^ (la[5] & lb[3]) ^ (la[4] & lb[4]) ^ (la[3] & lb[5]) ^ (la[2] & lb[6]) ^ (la[1] & lb[7]);
assign KEI7 = (la[7] & lb[0]) ^ (la[6] & lb[1]) ^ (la[5] & lb[2]) ^ (la[4] & lb[3]) ^ (la[3] & lb[4]) ^ (la[2] & lb[5]) ^ (la[1] & lb[6]) ^ (la[0] & lb[7]);
assign KEI6 = (la[6] & lb[0]) ^ (la[5] & lb[1]) ^ (la[4] & lb[2]) ^ (la[3] & lb[3]) ^ (la[2] & lb[4]) ^ (la[1] & lb[5]) ^ (la[0] & lb[6]);
assign KEI5 = (la[5] & lb[0]) ^ (la[4] & lb[1]) ^ (la[3] & lb[2]) ^ (la[2] & lb[3]) ^ (la[1] & lb[4]) ^ (la[0] & lb[5]);
assign KEI4 = (la[4] & lb[0]) ^ (la[3] & lb[1]) ^ (la[2] & lb[2]) ^ (la[1] & lb[3]) ^ (la[0] & lb[4]);
assign KEI3 = (la[3] & lb[0]) ^ (la[2] & lb[1]) ^ (la[1] & lb[2]) ^ (la[0] & lb[3]);
assign KEI2 = (la[2] & lb[0]) ^ (la[1] & lb[1]) ^ (la[0] & lb[2]);
assign KEI1 = (la[1] & lb[0]) ^ (la[0] & lb[1]);
assign KEI0 = la[0] & lb[0];



//KEI14=a7*b7
//KEI13=a7*b6+a6*b7
//KEI12=a7*a5+a6*b6+a5*b7
//KEI11=a7*b4+a6*b5+a5*b6+a4*b7
//KEI10=a7*b3+a6*b4+a5*b5+a4*b6+a3*b7
//KEI9 =a7*b2+a6*b3+a5*b4+a4*b5+a3*b6+a2*b7
//KEI8 =a7*b1+a6*b2+a5*b3+a4*b4+a3*b5+a2*b6+a1*b7
//KEI7 =a7*b0+a6*b1+a5*b2+a4*b3+a3*b4+a2*b5+a1*b6+a0*b7
//KEI6 =a6*b0+a5*b1+a4*b2+a3*b3+a2*b4+a1*b5+a0*b6
//KEI5 =a5*b0+a4*b1+a3*b2+a2*b3+a1*b4+a0*b5
//KEI4 =a4*b0+a3*b1+a2*b2+a1*b3+a0*b4
//KEI3 =a3*b0+a2*b1+a1*b2+a0*b3
//KEI2 =a2*b0+a1*b1+a0*b2
//KEI1 =a1*b0+a0*b1
//KEI0 =a0*b0


//(KEI13+KEI12+KEI11+KEI7)*X^7
//+(KEI12+KEI11+KEI10+KEI6)*X^6
//+(KEI11+KEI10+KEI9+KEI5)*X^5
//+(KEI14+KEI10+KEI9+KEI8+KEI4)*X^4
//+(KEI12+KEI11+KEI9+KEI8+KEI3)*X^3
//+(KEI13+KEI12+KEI10+KEI8+KEI2)*X^2
//+(KEI14+KEI13+KEI9+KEI1)*X
//+(KEI14+KEI13+KEI12+KEI8+KEI0)

assign wc[7] = KEI13 ^ KEI12 ^ KEI11 ^ KEI7;
assign wc[6] = KEI12 ^ KEI11 ^ KEI10 ^ KEI6;
assign wc[5] = KEI11 ^ KEI10 ^ KEI9 ^ KEI5;
assign wc[4] = KEI14 ^ KEI10 ^ KEI9 ^ KEI8 ^ KEI4;
assign wc[3] = KEI12 ^ KEI11 ^ KEI9 ^ KEI8 ^ KEI3;
assign wc[2] = KEI13 ^ KEI12 ^ KEI10 ^ KEI8 ^ KEI2;
assign wc[1] = KEI14 ^ KEI13 ^ KEI9 ^ KEI1;
assign wc[0] = KEI14 ^ KEI13 ^ KEI12 ^ KEI8 ^ KEI0;

//multi cycle pass

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// outen <= 1'b0;
// else if(cnt_en == 1'b1 && cnt == 4'd10)
// outen <= 1'b1;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// cnt <= 4'd0;
// else if(inen)
// cnt <= 4'd1;
//
// else if(cnt_en)
// cnt <= cnt + 1'b1;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// cnt_en <= 1'b0;
// else if(inen)
// cnt_en <= 1'b1;
// else if(cnt_en == 1'b1 && cnt == 4'd10)
// cnt_en <= 1'b0;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// outen <= 1'b0;
// else
// outen <= (cnt_en == 1'b1 && cnt == 4'd9) ? 1'b1 : 1'b0;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// c <= 7'd0;
// else if(outen)
// c <= wc;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n) begin
// la <= 7'd0;
// lb <= 7'd0;
// end
// else if(inen) begin
// la <= a;
// lb <= b;
// end
//end

endmodule

ソースをはっておく3

$
0
0
テストベンチ

module RS255239ENC_TB (
/*clk,
rst_n,
in,
out,
start,//1pulse
end,
inen,
outen*/
);

reg clk;
reg rst_n;
reg [7:0] in;
wire [7:0] out;
reg start;
wire end1;
reg inen;
wire outen;
parameter T = 60,delay = 3;

initial begin
clk <= 1'b1;
forever begin
#(T/2) clk <= 1'b0;
#(T/2) clk <= 1'b1;
end
end

initial begin
rst_n <= 1'b0;
#(T*3+delay) rst_n <= 1'b1;
end

initial begin
start <= 1'b0;
inen <= 1'b0;
#(T*6+delay) start <= 1'b1;
#(T) start <= 1'b0;
inen <= 1'b1;
#(239*T) inen <= 1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
in <= 8'd0;
else if(start)
in <= 8'd1;
else
in <= in + 1'b1;
end




RS255239ENC RS255239ENC (
.clk(clk),
.rst_n(rst_n),
.in(in),
.out(out),
.start(start),//1pulse
.end1(end1),
.inen(inen),
.outen(outen)
);
endmodule

バグフィックスト

$
0
0
module RS255239ENC (
clk,
rst_n,
in,
out,
start,//1pulse
end1,
inen,
outen
);

input clk;
input rst_n;
input [7:0] in;
output [7:0] out;
input start;
output end1;
input inen;
output outen;

reg [7:0] in1D,FF0,FF1,FF2,FF3,FF4,FF5,FF6,FF7,FF8,FF9,FF10,FF11,FF12,FF13,FF14,FF15;
//reg LP0,LP1,LP2,LP3,LP4,LP5,LP6,LP7,LP8,LP9,LP10,LP11,LP12,LP13,LP14,LP15;
wire [7:0] MULTIN,MULTOUT0,MULTOUT1,MULTOUT2,MULTOUT3,MULTOUT4,MULTOUT5,MULTOUT6,MULTOUT7,MULTOUT8,MULTOUT9,MULTOUT10,MULTOUT11,MULTOUT12,MULTOUT13,MULTOUT14,MULTOUT15;
reg [7:0] out,DATACNT,SYOU;
reg end1,start1D,inen1D,outen,FF_EN;


// +---------------+
//start | |
// -------+ +---------------+---------------+---------------+---------------+---------------+---------------+---------------+
// +----------------------------------------------------------------------------------------------------------------
//inen |
// -----------------------+
// ---------------------------------------+---------------+---------------+---------------+---------------+---------------+---------------+
//in FIRST | SECOND | THIRD |
// ---------------------------------------+---------------+---------------+---------------+---------------+---------------+---------------+
//
//
//
//
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
outen <= 1'b0;
else
outen <= FF_EN;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
out <= 8'd0;
else
out <= (inen1D) ? in1D : FF15;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
SYOU <= 8'd0;
else
SYOU <= (inen1D) ? FF15 ^ in1D : FF15;
end


assign MULTIN = FF15 ^ in1D;

// DATA COUNTER
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
DATACNT <= 8'd0;
else if(start)
DATACNT <= 8'd1;
else if(DATACNT == 8'd255)
DATACNT <= 8'd0;
else if((inen && DATACNT >= 8'd1 && DATACNT <= 8'd238) || (DATACNT >= 8'd239))
DATACNT <= DATACNT + 1'b1;
end

//assign DATACNTEN = inen & ((DATACNT >= 8'd1 && DATACNT <= 8'd239) ? 1'b1:1'b0);

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF_EN <= 1'b0;
else
FF_EN <= ((inen == 1'b1) || (DATACNT >= 8'd1 && DATACNT <= 8'd255)) ? 1'b1:1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
end1 <= 1'b0;
else
end1 <= (DATACNT == 8'd255) ? 1'b1:1'b0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n) begin
in1D <= 8'd0;
inen1D <= 1'b0;
start1D <= 1'b0;
// DATACNTEN1D <= 1'b0;
// FF_EN1D <= 1'b0;
end
else begin
in1D <= in;
inen1D <= inen;
start1D <= start;
// DATACNTEN1D <= DATACNTEN;
// FF_EN1D <= FF_EN;
end
end

//assign outen = FF_EN1D;

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF0 <= 8'd0;
else if(start1D)
FF0 <= 8'd0;
else
FF0 <= (inen1D) ? MULTOUT0 : 8'd0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF1 <= 8'd0;
else if(start1D)
FF1 <= 8'd0;
else
FF1 <= (inen1D) ? MULTOUT1 ^ FF0 : FF0;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF2 <= 8'd0;
else if(start1D)
FF2 <= 8'd0;
else
FF2 <= (inen1D) ? MULTOUT2 ^ FF1 : FF1;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF3 <= 8'd0;
else if(start1D)
FF3 <= 8'd0;
else
FF3 <= (inen1D) ? MULTOUT3 ^ FF2 : FF2;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF4 <= 8'd0;
else if(start1D)
FF4 <= 8'd0;
else
FF4 <= (inen1D) ? MULTOUT4 ^ FF3 : FF3;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF5 <= 8'd0;
else if(start1D)
FF5 <= 8'd0;
else
FF5 <= (inen1D) ? MULTOUT5 ^ FF4 : FF4;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF6 <= 8'd0;
else if(start1D)
FF6 <= 8'd0;
else
FF6 <= (inen1D) ? MULTOUT6 ^ FF5 : FF5;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF7 <= 8'd0;
else if(start1D)
FF7 <= 8'd0;
else
FF7 <= (inen1D) ? MULTOUT7 ^ FF6 : FF6;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF8 <= 8'd0;
else if(start1D)
FF8 <= 8'd0;
else
FF8 <= (inen1D) ? MULTOUT8 ^ FF7 : FF7;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF9 <= 8'd0;
else if(start1D)
FF9 <= 8'd0;
else
FF9 <= (inen1D) ? MULTOUT9 ^ FF8 : FF8;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF10 <= 8'd0;
else if(start1D)
FF10 <= 8'd0;
else
FF10 <= (inen1D) ? MULTOUT10 ^ FF9 : FF9;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF11 <= 8'd0;
else if(start1D)
FF11 <= 8'd0;
else
FF11 <= (inen1D) ? MULTOUT11 ^ FF10 : FF10;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF12 <= 8'd0;
else if(start1D)
FF12 <= 8'd0;
else
FF12 <= (inen1D) ? MULTOUT12 ^ FF11 : FF11;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF13 <= 8'd0;
else if(start1D)
FF13 <= 8'd0;
else
FF13 <= (inen1D) ? MULTOUT13 ^ FF12 : FF12;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF14 <= 8'd0;
else if(start1D)
FF14 <= 8'd0;
else
FF14 <= (inen1D) ? MULTOUT14 ^ FF13 : FF13;
end
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
FF15 <= 8'd0;
else if(start1D)
FF15 <= 8'd0;
else
FF15 <= (inen1D) ? MULTOUT15 ^ FF14 : FF14;
end



GF256MULT GF256MULT0(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h3b),//120
.c(MULTOUT0)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT1(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h24),//225
.c(MULTOUT1)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT2(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h32),//194
.c(MULTOUT2)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT3(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h62),//182
.c(MULTOUT3)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT4(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'he5),//169
.c(MULTOUT4)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT5(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h29),//147
.c(MULTOUT5)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT6(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h41),//191
.c(MULTOUT6)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT7(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'ha3),//91
.c(MULTOUT7)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT8(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h08),//3
.c(MULTOUT8)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT9(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h1e),//76
.c(MULTOUT9)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT10(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'hd1),//161
.c(MULTOUT10)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT11(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h44),//102
.c(MULTOUT11)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT12(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'hbd),//109
.c(MULTOUT12)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT13(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h68),//alpha107
.c(MULTOUT13)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT14(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h0d),//alpha104
.c(MULTOUT14)//,
//.inen(),
//.outen()
);
GF256MULT GF256MULT15(
.clk(clk),
.rst_n(rst_n),
.a(MULTIN),
.b(8'h3b),//alpha120
.c(MULTOUT15)//,
//.inen(),
//.outen()
);
endmodule

バグフイックスト2

$
0
0
module GF256MULT (
clk,
rst_n,
a,
b,
c
// inen,
// outen
);

input clk;
input rst_n;
input [7:0] a;
input [7:0] b;
output [7:0] c;
//input inen;
//output outen;
//reg [3:0] cnt;
//reg cnt_en,outen;
//reg [7:0] c;
//reg [7:0] la,lb;
wire KEI14,KEI13,KEI12,KEI11,KEI10,KEI9,KEI8,KEI7,KEI6,KEI5,KEI4,KEI3,KEI2,KEI1,KEI0;
wire [7:0] wc,la,lb;
assign c = wc;
assign la = a;
assign lb = b;

assign KEI14 = la[7] & lb[7];
assign KEI13 = (la[7] & lb[6]) ^ (la[6] & lb[7]);
assign KEI12 = (la[7] & /*la[5]*/lb[5]) ^ (la[6] & lb[6]) ^ (la[5] & lb[7]);
assign KEI11 = (la[7] & lb[4]) ^ (la[6] & lb[5]) ^ (la[5] & lb[6]) ^ (la[4] & lb[7]);
assign KEI10 = (la[7] & lb[3]) ^ (la[6] & lb[4]) ^ (la[5] & lb[5]) ^ (la[4] & lb[6]) ^ (la[3] & lb[7]);
assign KEI9 = (la[7] & lb[2]) ^ (la[6] & lb[3]) ^ (la[5] & lb[4]) ^ (la[4] & lb[5]) ^ (la[3] & lb[6]) ^ (la[2] & lb[7]);
assign KEI8 = (la[7] & lb[1]) ^ (la[6] & lb[2]) ^ (la[5] & lb[3]) ^ (la[4] & lb[4]) ^ (la[3] & lb[5]) ^ (la[2] & lb[6]) ^ (la[1] & lb[7]);
assign KEI7 = (la[7] & lb[0]) ^ (la[6] & lb[1]) ^ (la[5] & lb[2]) ^ (la[4] & lb[3]) ^ (la[3] & lb[4]) ^ (la[2] & lb[5]) ^ (la[1] & lb[6]) ^ (la[0] & lb[7]);
assign KEI6 = (la[6] & lb[0]) ^ (la[5] & lb[1]) ^ (la[4] & lb[2]) ^ (la[3] & lb[3]) ^ (la[2] & lb[4]) ^ (la[1] & lb[5]) ^ (la[0] & lb[6]);
assign KEI5 = (la[5] & lb[0]) ^ (la[4] & lb[1]) ^ (la[3] & lb[2]) ^ (la[2] & lb[3]) ^ (la[1] & lb[4]) ^ (la[0] & lb[5]);
assign KEI4 = (la[4] & lb[0]) ^ (la[3] & lb[1]) ^ (la[2] & lb[2]) ^ (la[1] & lb[3]) ^ (la[0] & lb[4]);
assign KEI3 = (la[3] & lb[0]) ^ (la[2] & lb[1]) ^ (la[1] & lb[2]) ^ (la[0] & lb[3]);
assign KEI2 = (la[2] & lb[0]) ^ (la[1] & lb[1]) ^ (la[0] & lb[2]);
assign KEI1 = (la[1] & lb[0]) ^ (la[0] & lb[1]);
assign KEI0 = la[0] & lb[0];



//KEI14=a7*b7
//KEI13=a7*b6+a6*b7
//KEI12=a7*a5+a6*b6+a5*b7
//KEI11=a7*b4+a6*b5+a5*b6+a4*b7
//KEI10=a7*b3+a6*b4+a5*b5+a4*b6+a3*b7
//KEI9 =a7*b2+a6*b3+a5*b4+a4*b5+a3*b6+a2*b7
//KEI8 =a7*b1+a6*b2+a5*b3+a4*b4+a3*b5+a2*b6+a1*b7
//KEI7 =a7*b0+a6*b1+a5*b2+a4*b3+a3*b4+a2*b5+a1*b6+a0*b7
//KEI6 =a6*b0+a5*b1+a4*b2+a3*b3+a2*b4+a1*b5+a0*b6
//KEI5 =a5*b0+a4*b1+a3*b2+a2*b3+a1*b4+a0*b5
//KEI4 =a4*b0+a3*b1+a2*b2+a1*b3+a0*b4
//KEI3 =a3*b0+a2*b1+a1*b2+a0*b3
//KEI2 =a2*b0+a1*b1+a0*b2
//KEI1 =a1*b0+a0*b1
//KEI0 =a0*b0


//(KEI13+KEI12+KEI11+KEI7)*X^7
//+(KEI12+KEI11+KEI10+KEI6)*X^6
//+(KEI11+KEI10+KEI9+KEI5)*X^5
//+(KEI14+KEI10+KEI9+KEI8+KEI4)*X^4
//+(KEI12+KEI11+KEI9+KEI8+KEI3)*X^3
//+(KEI13+KEI12+KEI10+KEI8+KEI2)*X^2
//+(KEI14+KEI13+KEI9+KEI1)*X
//+(KEI14+KEI13+KEI12+KEI8+KEI0)

assign wc[7] = KEI13 ^ KEI12 ^ KEI11 ^ KEI7;
assign wc[6] = KEI12 ^ KEI11 ^ KEI10 ^ KEI6;
assign wc[5] = KEI11 ^ KEI10 ^ KEI9 ^ KEI5;
assign wc[4] = KEI14 ^ KEI10 ^ KEI9 ^ KEI8 ^ KEI4;
assign wc[3] = KEI12 ^ KEI11 ^ KEI9 ^ KEI8 ^ KEI3;
assign wc[2] = KEI13 ^ KEI12 ^ KEI10 ^ KEI8 ^ KEI2;
assign wc[1] = KEI14 ^ KEI13 ^ KEI9 ^ KEI1;
assign wc[0] = KEI14 ^ KEI13 ^ KEI12 ^ KEI8 ^ KEI0;

//multi cycle pass

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// outen <= 1'b0;
// else if(cnt_en == 1'b1 && cnt == 4'd10)
// outen <= 1'b1;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// cnt <= 4'd0;
// else if(inen)
// cnt <= 4'd1;
//
// else if(cnt_en)
// cnt <= cnt + 1'b1;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// cnt_en <= 1'b0;
// else if(inen)
// cnt_en <= 1'b1;
// else if(cnt_en == 1'b1 && cnt == 4'd10)
// cnt_en <= 1'b0;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// outen <= 1'b0;
// else
// outen <= (cnt_en == 1'b1 && cnt == 4'd9) ? 1'b1 : 1'b0;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n)
// c <= 7'd0;
// else if(outen)
// c <= wc;
//end

//always @ (negedge rst_n or posedge clk) begin
// if(!rst_n) begin
// la <= 7'd0;
// lb <= 7'd0;
// end
// else if(inen) begin
// la <= a;
// lb <= b;
// end
//end

endmodule

地デジリードソロモン符号器(遅いクロック用)完成

$
0
0
符号器のCのプログラムとVerilogの動作があわないので、わかりやすいC言語のほうから机上デバッグをおこなった。するとC言語のほうがただしかった。
Verilogのほうにデバッグ記述を追加して、商を表示させると、4データ目からくるってくる。
すると、ガロア拡大体乗算器にバグがあった。
それをなおしたら、C言語ソフトウェアとverilog記述のシミュレーション結果と一致したので
RS(255、239)符号器(遅いクロックバージョン)が完成しました。

ここで高速版をつくろうとおもったが、復号器をつくりたい誘惑にかられてるので、あとまわしにして
復号器をつくります。

地デジリードソロモン復号器のverilog記述を開始

$
0
0
とりあえず、シンドローム計算回路を作った。
符号器とテストベンチ上でつないで、実行、16個のシンドロームはすべて0となったので
符号器もシンドローム回路も動いたと思われる。

シンドローム回路verilog

$
0
0
シンドローム回路verilog記述


module syndrome (
clk,
rst_n,
indata,
inen,
start,
outen,
root,
out

);


input clk;
input rst_n;
input [7:0] indata;
input inen;
input start;
output outen;
input [7:0] root;
output [7:0] out;
reg [7:0] cnt;
reg [7:0] out;
reg outen;
wire [7:0] MULTOUT;

GF256MULT GF256MULTSDRM (
.clk(clk),
.rst_n(rst_n),
.a(root),
.b(out),
.c(MULTOUT)
);
always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
out <= 8'd0;
else
out <= MULTOUT ^ indata;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
outen <= 1'b0;
else
outen <= (inen && cnt == 8'd255) ? 1'b1:1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
cnt <= 8'd0;
else if(start)
cnt <= 8'd1;
else if(inen && cnt == 8'd255)
cnt <= 8'd0;
else if(inen)
cnt <= cnt + 1'b1;
end

endmodule

シンドローム回路トップモジュールverilog

$
0
0
F(1),F(α),・・・・,F(α^15)シンドローム回路verilog

module parasyndrome(
clk,
rst_n,
indata,
inen,
start,
outen,
S0,
S1,
S2,
S3,
S4,
S5,
S6,
S7,
S8,
S9,
S10,
S11,
S12,
S13,
S14,
S15
);

input clk;
input rst_n;
input [7:0] indata;
input inen;
input start;
output outen;
output [7:0] S0;
output [7:0] S1;
output [7:0] S2;
output [7:0] S3;
output [7:0] S4;
output [7:0] S5;
output [7:0] S6;
output [7:0] S7;
output [7:0] S8;
output [7:0] S9;
output [7:0] S10;
output [7:0] S11;
output [7:0] S12;
output [7:0] S13;
output [7:0] S14;
output [7:0] S15;

syndrome syndrome0(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'd1),
.out(S0)
);
syndrome syndrome1(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'd2),
.out(S1)
);
syndrome syndrome2(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h4),
.out(S2)
);
syndrome syndrome3(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h8),
.out(S3)
);
syndrome syndrome4(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h10),
.out(S4)
);
syndrome syndrome5(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h20),
.out(S5)
);
syndrome syndrome6(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h40),
.out(S6)
);
syndrome syndrome7(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h80),
.out(S7)
);
syndrome syndrome8(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h1d),
.out(S8)
);
syndrome syndrome9(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h3a),
.out(S9)
);
syndrome syndrome10(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h74),
.out(S10)
);
syndrome syndrome11(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'he8),
.out(S11)
);
syndrome syndrome12(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'hcd),
.out(S12)
);
syndrome syndrome13(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h87),
.out(S13)
);
syndrome syndrome14(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h13),
.out(S14)
);
syndrome syndrome15(
.clk(clk),
.rst_n(rst_n),
.indata(indata),
.inen(inen),
.start(start),
.outen(outen),
.root(8'h26),
.out(S15)
);
endmodule

シンドローム回路検証用テストベンチ

$
0
0
module syndrometest_TB ();


reg rst_n;
reg clk;
reg start;
reg inen;
reg [7:0] in;
reg start1D;
reg start2D;
wire outen;
wire [7:0] out;
wire end1;
wire syndouten;
wire [7:0] S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15;

parameter T = 60,delay = 3;

initial begin
clk <= 1'b1;
forever begin
#(T/2) clk <= 1'b0;
#(T/2) clk <= 1'b1;
end
end

initial begin
rst_n <= 1'b0;
#(T*3+delay) rst_n <= 1'b1;
end

initial begin
start <= 1'b0;
inen <= 1'b0;
#(T*6+delay) start <= 1'b1;
#(T) start <= 1'b0;
inen <= 1'b1;
#(239*T) inen <= 1'b0;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n)
in <= 8'd0;
else if(start)
in <= 8'd1;
else
in <= in + 1'b1;
end

always @ (negedge rst_n or posedge clk) begin
if(!rst_n) begin
start1D <= 1'b0;
start2D <= 1'b0;
end
else begin
start1D <= start;
start2D <= start1D;
end
end


RS255239ENC RS255239ENC (
.clk(clk),
.rst_n(rst_n),
.in(in),
.out(out),
.start(start),//1pulse
.end1(end1),
.inen(inen),
.outen(outen)
);

parasyndrome parasyndrome(
.clk(clk),
.rst_n(rst_n),
.indata(out),
.inen(outen),
.start(start2D),
.outen(syndouten),
.S0(S0),
.S1(S1),
.S2(S2),
.S3(S3),
.S4(S4),
.S5(S5),
.S6(S6),
.S7(S7),
.S8(S8),
.S9(S9),
.S10(S10),
.S11(S11),
.S12(S12),
.S13(S13),
.S14(S14),
.S15(S15)

);
endmodule
Viewing all 1278 articles
Browse latest View live