OpenCores
URL https://opencores.org/ocsvn/pairing/pairing/trunk

Subversion Repositories pairing

[/] [pairing/] [trunk/] [rtl/] [f33m.v] - Diff between revs 24 and 30

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 24 Rev 30
/*
/*
    Copyright 2011, City University of Hong Kong
    Copyright 2011, City University of Hong Kong
    Author is Homer (Dongsheng) Xing.
    Author is Homer (Dongsheng) Xing.
 
 
    This file is part of Tate Bilinear Pairing Core.
    This file is part of Tate Bilinear Pairing Core.
 
 
    Tate Bilinear Pairing Core is free software: you can redistribute it and/or modify
    Tate Bilinear Pairing Core is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    (at your option) any later version.
 
 
    Tate Bilinear Pairing Core is distributed in the hope that it will be useful,
    Tate Bilinear Pairing Core is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    GNU Lesser General Public License for more details.
 
 
    You should have received a copy of the GNU General Public License
    You should have received a copy of the GNU General Public License
    along with Foobar.  If not, see http://www.gnu.org/licenses/lgpl.txt
    along with Tate Bilinear Pairing Core.  If not, see http://www.gnu.org/licenses/lgpl.txt
*/
*/
 
 
`include "inc.v"
`include "inc.v"
 
 
// out = (v1 & l1) | (v2 & l2)
// out = (v1 & l1) | (v2 & l2)
module f33m_mux2(v1, l1, v2, l2, out);
module f33m_mux2(v1, l1, v2, l2, out);
    input [`W3:0] v1, v2;
    input [`W3:0] v1, v2;
    input l1, l2;
    input l1, l2;
    output [`W3:0] out;
    output [`W3:0] out;
    genvar i;
    genvar i;
    generate
    generate
        for(i=0;i<=`W3;i=i+1)
        for(i=0;i<=`W3;i=i+1)
          begin : label
          begin : label
            assign out[i] = (v1[i] & l1) | (v2[i] & l2);
            assign out[i] = (v1[i] & l1) | (v2[i] & l2);
          end
          end
    endgenerate
    endgenerate
endmodule
endmodule
 
 
// out = (v1 & l1) | (v2 & l2) | (v3 & l3)
// out = (v1 & l1) | (v2 & l2) | (v3 & l3)
module f33m_mux3(v1, l1, v2, l2, v3, l3, out);
module f33m_mux3(v1, l1, v2, l2, v3, l3, out);
    input [`W3:0] v1, v2, v3;
    input [`W3:0] v1, v2, v3;
    input l1, l2, l3;
    input l1, l2, l3;
    output [`W3:0] out;
    output [`W3:0] out;
    genvar i;
    genvar i;
    generate
    generate
        for(i=0;i<=`W3;i=i+1)
        for(i=0;i<=`W3;i=i+1)
          begin : label
          begin : label
            assign out[i] = (v1[i] & l1) | (v2[i] & l2) | (v3[i] & l3);
            assign out[i] = (v1[i] & l1) | (v2[i] & l2) | (v3[i] & l3);
          end
          end
    endgenerate
    endgenerate
endmodule
endmodule
 
 
// c == a+b in GF(3^{3*M})
// c == a+b in GF(3^{3*M})
module f33m_add(a, b, c);
module f33m_add(a, b, c);
    input [`W3:0] a,b;
    input [`W3:0] a,b;
    output [`W3:0] c;
    output [`W3:0] c;
    wire [`WIDTH:0] a0,a1,a2,b0,b1,b2,c0,c1,c2;
    wire [`WIDTH:0] a0,a1,a2,b0,b1,b2,c0,c1,c2;
    assign {a2,a1,a0} = a;
    assign {a2,a1,a0} = a;
    assign {b2,b1,b0} = b;
    assign {b2,b1,b0} = b;
    assign c = {c2,c1,c0};
    assign c = {c2,c1,c0};
    f3m_add
    f3m_add
        ins1 (a0,b0,c0),
        ins1 (a0,b0,c0),
        ins2 (a1,b1,c1),
        ins2 (a1,b1,c1),
        ins3 (a2,b2,c2);
        ins3 (a2,b2,c2);
endmodule
endmodule
 
 
// c == -a in GF(3^{3*M})
// c == -a in GF(3^{3*M})
module f33m_neg(a, c);
module f33m_neg(a, c);
    input [`W3:0] a;
    input [`W3:0] a;
    output [`W3:0] c;
    output [`W3:0] c;
    wire [`WIDTH:0] a0,a1,a2,c0,c1,c2;
    wire [`WIDTH:0] a0,a1,a2,c0,c1,c2;
    assign {a2,a1,a0} = a;
    assign {a2,a1,a0} = a;
    assign c = {c2,c1,c0};
    assign c = {c2,c1,c0};
    f3m_neg
    f3m_neg
        ins1 (a0,c0),
        ins1 (a0,c0),
        ins2 (a1,c1),
        ins2 (a1,c1),
        ins3 (a2,c2);
        ins3 (a2,c2);
endmodule
endmodule
 
 
// c == a*b in GF(3^{3*M})
// c == a*b in GF(3^{3*M})
module f33m_mult(clk, reset, a, b, c, done);
module f33m_mult(clk, reset, a, b, c, done);
    input clk, reset;
    input clk, reset;
    input [`W3:0] a, b;
    input [`W3:0] a, b;
    output reg [`W3:0] c;
    output reg [`W3:0] c;
    output reg done;
    output reg done;
 
 
    reg [`WIDTH:0] x0, x1, x2, x3, x4, x5;
    reg [`WIDTH:0] x0, x1, x2, x3, x4, x5;
    wire [`WIDTH:0]  a0, a1, a2,
    wire [`WIDTH:0]  a0, a1, a2,
                     b0, b1, b2,
                     b0, b1, b2,
                     c0, c1, c2,
                     c0, c1, c2,
                     v1, v2, v3, v4, v5, v6,
                     v1, v2, v3, v4, v5, v6,
                     nx0, nx2, nx5,
                     nx0, nx2, nx5,
                     d0, d1, d2, d3, d4;
                     d0, d1, d2, d3, d4;
    reg [6:0] K;
    reg [6:0] K;
    wire e0, e1, e2,
    wire e0, e1, e2,
         e3, e4, e5,
         e3, e4, e5,
         mult_done, p, rst;
         mult_done, p, rst;
    wire [`WIDTH:0] in0, in1;
    wire [`WIDTH:0] in0, in1;
    wire [`WIDTH:0] o;
    wire [`WIDTH:0] o;
    reg mult_reset, delay1, delay2;
    reg mult_reset, delay1, delay2;
 
 
    assign {e0,e1,e2,e3,e4,e5} = K[6:1];
    assign {e0,e1,e2,e3,e4,e5} = K[6:1];
    assign {a2,a1,a0} = a;
    assign {a2,a1,a0} = a;
    assign {b2,b1,b0} = b;
    assign {b2,b1,b0} = b;
    assign d4 = x0;
    assign d4 = x0;
    assign d0 = x5;
    assign d0 = x5;
    assign rst = delay2;
    assign rst = delay2;
 
 
    f3m_mux6
    f3m_mux6
        ins1 (a2,v1,a1,v3,v5,a0,e0,e1,e2,e3,e4,e5,in0), // $in0$ is the first input
        ins1 (a2,v1,a1,v3,v5,a0,e0,e1,e2,e3,e4,e5,in0), // $in0$ is the first input
        ins2 (b2,v2,b1,v4,v6,b0,e0,e1,e2,e3,e4,e5,in1); // $in1$ is the second input
        ins2 (b2,v2,b1,v4,v6,b0,e0,e1,e2,e3,e4,e5,in1); // $in1$ is the second input
    f3m_mult
    f3m_mult
        ins3 (clk, mult_reset, in0, in1, o, mult_done); // o == in0 * in1
        ins3 (clk, mult_reset, in0, in1, o, mult_done); // o == in0 * in1
    func6
    func6
        ins4 (clk, reset, mult_done, p);
        ins4 (clk, reset, mult_done, p);
    f3m_add
    f3m_add
        ins5 (a1, a2, v1), // v1 == a1+a2
        ins5 (a1, a2, v1), // v1 == a1+a2
        ins6 (b1, b2, v2), // v2 == b1+b2
        ins6 (b1, b2, v2), // v2 == b1+b2
        ins7 (a0, a2, v3), // v3 == a0+a2
        ins7 (a0, a2, v3), // v3 == a0+a2
        ins8 (b0, b2, v4), // v4 == b0+b2
        ins8 (b0, b2, v4), // v4 == b0+b2
        ins9 (a0, a1, v5), // v5 == a0+a1
        ins9 (a0, a1, v5), // v5 == a0+a1
        ins10 (b0, b1, v6), // v6 == b0+b1
        ins10 (b0, b1, v6), // v6 == b0+b1
        ins11 (d0, d3, c0), // c0 == d0+d3
        ins11 (d0, d3, c0), // c0 == d0+d3
        ins12 (d2, d4, c2); // c2 == d2+d4
        ins12 (d2, d4, c2); // c2 == d2+d4
    f3m_neg
    f3m_neg
        ins13 (x0, nx0), // nx0 == -x0
        ins13 (x0, nx0), // nx0 == -x0
        ins14 (x2, nx2), // nx2 == -x2
        ins14 (x2, nx2), // nx2 == -x2
        ins15 (x5, nx5); // nx5 == -x5
        ins15 (x5, nx5); // nx5 == -x5
    f3m_add3
    f3m_add3
        ins16 (x1, nx0, nx2, d3), // d3 == x1-x0-x2
        ins16 (x1, nx0, nx2, d3), // d3 == x1-x0-x2
        ins17 (x4, nx2, nx5, d1), // d1 == x4-x2-x5
        ins17 (x4, nx2, nx5, d1), // d1 == x4-x2-x5
        ins18 (d1, d3, d4, c1); // c1 == d1+d3+d4
        ins18 (d1, d3, d4, c1); // c1 == d1+d3+d4
    f3m_add4
    f3m_add4
        ins19 (x3, x2, nx0, nx5, d2); // d2 == x3+x2-x0-x5
        ins19 (x3, x2, nx0, nx5, d2); // d2 == x3+x2-x0-x5
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (reset) K <= 7'b1000000;
        if (reset) K <= 7'b1000000;
        else if (p|K[0]) K <= {1'b0,K[6:1]};
        else if (p|K[0]) K <= {1'b0,K[6:1]};
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (e0) x0 <= o; // x0 == a2*b2
        if (e0) x0 <= o; // x0 == a2*b2
        if (e1) x1 <= o; // x1 == (a2+a1)*(b2+b1)
        if (e1) x1 <= o; // x1 == (a2+a1)*(b2+b1)
        if (e2) x2 <= o; // x2 == a1*b1
        if (e2) x2 <= o; // x2 == a1*b1
        if (e3) x3 <= o; // x3 == (a2+a0)*(b2+b0)
        if (e3) x3 <= o; // x3 == (a2+a0)*(b2+b0)
        if (e4) x4 <= o; // x4 == (a1+a0)*(b1+b0)
        if (e4) x4 <= o; // x4 == (a1+a0)*(b1+b0)
        if (e5) x5 <= o; // x5 == a0*b0
        if (e5) x5 <= o; // x5 == a0*b0
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (reset) done <= 0;
        if (reset) done <= 0;
        else if (K[0])
        else if (K[0])
          begin
          begin
            done <= 1; c <= {c2,c1,c0};
            done <= 1; c <= {c2,c1,c0};
          end
          end
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (rst) mult_reset <= 1;
        if (rst) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else mult_reset <= 0;
        else mult_reset <= 0;
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        delay2 <= delay1; delay1 <= reset;
        delay2 <= delay1; delay1 <= reset;
      end
      end
endmodule
endmodule
 
 
// c0 == a0*b0; c1 == a1*b1; c2 == a2*b2; all in GF(3^{3*M})
// c0 == a0*b0; c1 == a1*b1; c2 == a2*b2; all in GF(3^{3*M})
module f33m_mult3(clk, reset,
module f33m_mult3(clk, reset,
                 a0, b0, c0,
                 a0, b0, c0,
                 a1, b1, c1,
                 a1, b1, c1,
                 a2, b2, c2,
                 a2, b2, c2,
                 done);
                 done);
    input clk, reset;
    input clk, reset;
    input [`W3:0] a0, b0, a1, b1, a2, b2;
    input [`W3:0] a0, b0, a1, b1, a2, b2;
    output reg [`W3:0] c0, c1, c2;
    output reg [`W3:0] c0, c1, c2;
    output reg done;
    output reg done;
    reg [3:0] K;
    reg [3:0] K;
    reg mult_reset, delay1, delay2;
    reg mult_reset, delay1, delay2;
    wire e1, e2, e3, mult_done, delay3, rst;
    wire e1, e2, e3, mult_done, delay3, rst;
    wire [`W3:0] in1, in2, o;
    wire [`W3:0] in1, in2, o;
 
 
    assign rst = delay2;
    assign rst = delay2;
    assign {e1,e2,e3} = K[3:1];
    assign {e1,e2,e3} = K[3:1];
 
 
    f33m_mux3
    f33m_mux3
        ins9 (a0, e1, a1, e2, a2, e3, in1),
        ins9 (a0, e1, a1, e2, a2, e3, in1),
        ins10 (b0, e1, b1, e2, b2, e3, in2);
        ins10 (b0, e1, b1, e2, b2, e3, in2);
    f33m_mult
    f33m_mult
        ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2
        ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2
    func6
    func6
        ins12 (clk, reset, mult_done, delay3);
        ins12 (clk, reset, mult_done, delay3);
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (e1) c0 <= o;
        if (e1) c0 <= o;
        if (e2) c1 <= o;
        if (e2) c1 <= o;
        if (e3) c2 <= o;
        if (e3) c2 <= o;
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset) K <= 4'b1000;
        if (reset) K <= 4'b1000;
        else if (delay3|K[0]) K <= {1'b0,K[3:1]};
        else if (delay3|K[0]) K <= {1'b0,K[3:1]};
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (rst) mult_reset <= 1;
        if (rst) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else mult_reset <= 0;
        else mult_reset <= 0;
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset)     done <= 0;
        if (reset)     done <= 0;
        else if (K[0]) done <= 1;
        else if (K[0]) done <= 1;
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        delay2 <= delay1; delay1 <= reset;
        delay2 <= delay1; delay1 <= reset;
      end
      end
endmodule
endmodule
 
 
// c0 == a0*b0; c1 == a1*b1; both in GF(3^{3*M})
// c0 == a0*b0; c1 == a1*b1; both in GF(3^{3*M})
module f33m_mult2(clk, reset,
module f33m_mult2(clk, reset,
                 a0, b0, c0,
                 a0, b0, c0,
                 a1, b1, c1,
                 a1, b1, c1,
                 done);
                 done);
    input clk, reset;
    input clk, reset;
    input [`W3:0] a0, b0, a1, b1;
    input [`W3:0] a0, b0, a1, b1;
    output reg [`W3:0] c0, c1;
    output reg [`W3:0] c0, c1;
    output reg done;
    output reg done;
    reg [2:0] K;
    reg [2:0] K;
    reg mult_reset, delay1, delay2;
    reg mult_reset, delay1, delay2;
    wire e1, e2, mult_done, delay3, rst;
    wire e1, e2, mult_done, delay3, rst;
    wire [`W3:0] in1, in2, o;
    wire [`W3:0] in1, in2, o;
 
 
    assign rst = delay2;
    assign rst = delay2;
    assign {e1,e2} = K[2:1];
    assign {e1,e2} = K[2:1];
 
 
    f33m_mux2
    f33m_mux2
        ins9 (a0, e1, a1, e2, in1),
        ins9 (a0, e1, a1, e2, in1),
        ins10 (b0, e1, b1, e2, in2);
        ins10 (b0, e1, b1, e2, in2);
    f33m_mult
    f33m_mult
        ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2
        ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2
    func6
    func6
        ins12 (clk, reset, mult_done, delay3);
        ins12 (clk, reset, mult_done, delay3);
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (e1) c0 <= o;
        if (e1) c0 <= o;
        if (e2) c1 <= o;
        if (e2) c1 <= o;
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset) K <= 3'b100;
        if (reset) K <= 3'b100;
        else if (delay3|K[0]) K <= {1'b0,K[2:1]};
        else if (delay3|K[0]) K <= {1'b0,K[2:1]};
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        if (rst) mult_reset <= 1;
        if (rst) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else if (mult_done) mult_reset <= 1;
        else mult_reset <= 0;
        else mult_reset <= 0;
      end
      end
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset)     done <= 0;
        if (reset)     done <= 0;
        else if (K[0]) done <= 1;
        else if (K[0]) done <= 1;
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
      begin
        delay2 <= delay1; delay1 <= reset;
        delay2 <= delay1; delay1 <= reset;
      end
      end
endmodule
endmodule
 
 
// c == a^{-1} in GF(3^{3*M})
// c == a^{-1} in GF(3^{3*M})
module f33m_inv(clk, reset, a, c, done);
module f33m_inv(clk, reset, a, c, done);
    input clk, reset;
    input clk, reset;
    input [`W3:0] a;
    input [`W3:0] a;
    output reg [`W3:0] c;
    output reg [`W3:0] c;
    output reg done;
    output reg done;
 
 
    wire [`WIDTH:0] a0, a1, a2,
    wire [`WIDTH:0] a0, a1, a2,
                    c0, c1, c2,
                    c0, c1, c2,
                    v0, v1, v2, v3, v4, v5,
                    v0, v1, v2, v3, v4, v5,
                    v6, v7, v8, v9, v10, v11,
                    v6, v7, v8, v9, v10, v11,
                    v12, v13, v14, v15, v16,
                    v12, v13, v14, v15, v16,
                    v17, nv2, nv11, nv14;
                    v17, nv2, nv11, nv14;
    wire rst1, rst2, rst3, rst4,
    wire rst1, rst2, rst3, rst4,
         done1, done2, done3, done4,
         done1, done2, done3, done4,
         dummy;
         dummy;
    reg [4:0] K;
    reg [4:0] K;
 
 
    assign {a2, a1, a0} = a;
    assign {a2, a1, a0} = a;
    assign rst1 = reset;
    assign rst1 = reset;
 
 
    f3m_mult3
    f3m_mult3
        ins1 (clk, rst1,
        ins1 (clk, rst1,
              a0, a0, v0, // v0 == a0^2
              a0, a0, v0, // v0 == a0^2
              a1, a1, v1, // v1 == a1^2
              a1, a1, v1, // v1 == a1^2
              a2, a2, v2, // v2 == a2^2
              a2, a2, v2, // v2 == a2^2
              done1),
              done1),
        ins2 (clk, rst2,
        ins2 (clk, rst2,
              v0, v3, v6,  // v6 == (a0-a2)*(a0^2)
              v0, v3, v6,  // v6 == (a0-a2)*(a0^2)
              v1, v4, v7,  // v7 == (a1-a0)*(a1^2)
              v1, v4, v7,  // v7 == (a1-a0)*(a1^2)
              v2, v5, v8,  // v8 == (a0-a1+a2)*(a2^2)
              v2, v5, v8,  // v8 == (a0-a1+a2)*(a2^2)
              done2),
              done2),
        ins3 (clk, rst1,
        ins3 (clk, rst1,
              a0, a2, v11, // v11 == a0*a2
              a0, a2, v11, // v11 == a0*a2
              a0, a1, v12, // v12 == a0*a1
              a0, a1, v12, // v12 == a0*a1
              a1, a2, v13, // v13 == a1*a2
              a1, a2, v13, // v13 == a1*a2
              dummy),
              dummy),
        ins4 (clk, rst4,
        ins4 (clk, rst4,
              v10, v15, c0,
              v10, v15, c0,
              v10, v16, c1,
              v10, v16, c1,
              v10, v17, c2,
              v10, v17, c2,
              done4);
              done4);
    f3m_sub
    f3m_sub
        ins5 (a0, a2, v3), // v3 == a0-a2
        ins5 (a0, a2, v3), // v3 == a0-a2
        ins6 (a1, a0, v4), // v4 == a1-a0
        ins6 (a1, a0, v4), // v4 == a1-a0
        ins7 (a2, v4, v5); // v5 == a2-v4 == a0-a1+a2
        ins7 (a2, v4, v5); // v5 == a2-v4 == a0-a1+a2
    f3m_add3
    f3m_add3
        ins8 (v6, v7, v8, v9),    // v9 == v6+v7+v8
        ins8 (v6, v7, v8, v9),    // v9 == v6+v7+v8
        ins9 (v11, v1, v13, v14), // v14 == v11+v1+v13
        ins9 (v11, v1, v13, v14), // v14 == v11+v1+v13
        ins10 (nv14, v0, v2, v15),  // v15 == v0+v2-(v11+v1+v13)
        ins10 (nv14, v0, v2, v15),  // v15 == v0+v2-(v11+v1+v13)
        ins11 (v1, nv2, nv11, v17); // v17 == a1^2-a0*a2-a2^2
        ins11 (v1, nv2, nv11, v17); // v17 == a1^2-a0*a2-a2^2
    f3m_neg
    f3m_neg
        ins12 (v2,  nv2),  // nv2 == -v2
        ins12 (v2,  nv2),  // nv2 == -v2
        ins13 (v11, nv11), // nv11 == -v11
        ins13 (v11, nv11), // nv11 == -v11
        ins14 (v14, nv14); // nv14 == -v14 == -(v11+v1+v13)
        ins14 (v14, nv14); // nv14 == -v14 == -(v11+v1+v13)
    f3m_sub
    f3m_sub
        ins15 (v2, v12, v16); // v16 == a2^2-a0*a1
        ins15 (v2, v12, v16); // v16 == a2^2-a0*a1
    f3m_inv
    f3m_inv
        ins16 (clk, rst3, v9, v10, done3); // v10 == v9^(-1)
        ins16 (clk, rst3, v9, v10, done3); // v10 == v9^(-1)
    func6
    func6
        ins17 (clk, reset, done1, rst2),
        ins17 (clk, reset, done1, rst2),
        ins18 (clk, reset, done2, rst3),
        ins18 (clk, reset, done2, rst3),
        ins19 (clk, reset, done3, rst4);
        ins19 (clk, reset, done3, rst4);
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset) K <= 5'h10;
        if (reset) K <= 5'h10;
        else if ((K[4]&rst2)|(K[3]&rst3)|(K[2]&rst4)|(K[1]&done4)|K[0])
        else if ((K[4]&rst2)|(K[3]&rst3)|(K[2]&rst4)|(K[1]&done4)|K[0])
            K <= K >> 1;
            K <= K >> 1;
 
 
    always @ (posedge clk)
    always @ (posedge clk)
        if (reset) done <= 0;
        if (reset) done <= 0;
        else if (K[0])
        else if (K[0])
          begin
          begin
            done <= 1; c <= {c2,c1,c0};
            done <= 1; c <= {c2,c1,c0};
          end
          end
endmodule
endmodule
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.