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

Subversion Repositories pairing

[/] [pairing/] [trunk/] [rtl/] [f32m.v] - Diff between revs 5 and 7

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 5 Rev 7
Line 68... Line 68...
module f32m_mult(clk, reset, a, b, c, done);
module f32m_mult(clk, reset, a, b, c, done);
    input reset, clk;
    input reset, clk;
    input [`W2:0] a, b;
    input [`W2:0] a, b;
    output reg [`W2:0] c;
    output reg [`W2:0] c;
    output reg done;
    output reg done;
    wire [`WIDTH:0] a0,a1,b0,b1,
    wire [`WIDTH:0] a0,a1,b0,b1,c0,c1,
                    v1,v2,v6,
                    v1,v2,v3,v4,v5,v6;
                    c0,c1,
 
                    in1,in2,o;
 
    reg [`WIDTH:0] v3,v4,v5;
 
    reg [3:0] K;
 
    wire load1, load2, load3, set1, set2, set3;
 
    reg mult_reset;
    reg mult_reset;
    wire mult_done;
    wire mult_done, p;
    reg delay1, delay2;
 
    wire delay3;
 
    wire rst;
 
 
 
    assign rst = delay2;
 
    assign {a1,a0} = a;
    assign {a1,a0} = a;
    assign {b1,b0} = b;
    assign {b1,b0} = b;
    assign {load1,load2,load3} = K[3:1];
 
    assign {set1,set2,set3} = K[3:1];
 
 
 
    f3m_add
    f3m_add
        ins1 (a0, a1, v1), // v1 == a0 + a1
        ins1 (a0, a1, v1), // v1 == a0 + a1
        ins2 (b0, b1, v2), // v2 == b0 + b1
        ins2 (b0, b1, v2), // v2 == b0 + b1
        ins3 (v3, v4, v6); // v6 == v3 + v4 = a0*b0 + a1*b1
        ins3 (v3, v4, v6); // v6 == v3 + v4 = a0*b0 + a1*b1
    f3m_sub
    f3m_sub
        ins7 (v5, v6, c1), // c1 == v5 - v6 = (a0+a1) * (b0+b1) - (a0*b0 + a1*b1)
        ins7 (v5, v6, c1), // c1 == v5 - v6 = (a0+a1) * (b0+b1) - (a0*b0 + a1*b1)
        ins8 (v3, v4, c0); // c0 == a0*b0 - a1*b1
        ins8 (v3, v4, c0); // c0 == a0*b0 - a1*b1
    // only one $f3m_mult$ module doing three multiplication
 
    // v3 == a0 * b0
    // v3 == a0 * b0
    // v4 == a1 * b1
    // v4 == a1 * b1
    // v5 == v1 * v2 = (a0+a1) * (b0+b1)
    // v5 == v1 * v2 = (a0+a1) * (b0+b1)
    f3m_mux3
    f3m_mult3
        ins9 (a0, load1, a1, load2, v1, load3, in1),
        ins9 (clk, mult_reset, a0, b0, v3, a1, b1, v4, v1, v2, v5, mult_done);
        ins10 (b0, load1, b1, load2, v2, load3, in2);
 
    f3m_mult
 
        ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2 in GF(3^m)
 
    func6
    func6
        ins12 (clk, mult_done, delay3);
        ins10 (clk, mult_done, p);
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      begin
        mult_reset <= reset;
        if (set1) begin v3 <= o; end
 
        if (set2) begin v4 <= o; end
 
        if (set3) begin v5 <= o; end
 
      end
 
 
 
    always @ (posedge clk)
 
      begin
 
        if (reset) K <= 4'b1000;
 
        else if (delay3) K <= {1'b0,K[3:1]}; // wait for Mr. Comb. Logic :)
 
      end
 
 
 
    always @ (posedge clk)
 
      begin
 
        if (rst) mult_reset <= 1; // wait for Mr. Comb. Logic :)
 
        else if (mult_done) mult_reset <= 1;
 
        else mult_reset <= 0;
 
      end
 
 
 
    always @ (posedge clk)
    always @ (posedge clk)
      if (reset)
      if (reset)
        done <= 0;
        done <= 0;
      else if (K[0])
        else if (p)
        begin
        begin
          done <= 1; c <= {c1, c0};
          done <= 1; c <= {c1, c0};
        end
        end
 
 
    always @ (posedge clk)
 
      begin
 
        delay2 <= delay1; delay1 <= reset;
 
      end
 
endmodule
endmodule
 
 
// C == A^3 in GF(3^{2m})
// C == A^3 in GF(3^{2m})
module f32m_cubic(clk, a, c);
module f32m_cubic(clk, a, c);
    input clk;
    input clk;

powered by: WebSVN 2.1.0

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