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

Subversion Repositories ecg

[/] [ecg/] [trunk/] [rtl/] [ecg.v] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 homer.xing
`include "inc.v"
2
 
3
/* add two points on the elliptic curve $y^2=x^3-x+1$ over a Galois field GF(3^M)
4
 * whose irreducible polynomial is $x^97 + x^12 + 2$. */
5
 
6
/* $P3(x3,y3) == P1 + P2$ for any points $P1(x1,y1),P2(x2,y2)$ */
7
module point_add(clk, reset, x1, y1, zero1, x2, y2, zero2, done, x3, y3, zero3);
8
    input clk, reset;
9 3 homer.xing
    input [`WIDTH:0] x1, y1; // this guy is $P1$
10 2 homer.xing
    input zero1; // asserted if P1 == 0
11 3 homer.xing
    input [`WIDTH:0] x2, y2; // and this guy is $P2$
12 2 homer.xing
    input zero2; // asserted if P2 == 0
13
    output reg done;
14 3 homer.xing
    output reg [`WIDTH:0] x3, y3; // ha ha, this guy is $P3$
15 2 homer.xing
    output reg zero3; // asserted if P3 == 0
16 3 homer.xing
    wire [`WIDTH:0] x3a, x3b, x3c,
17
                    y3a, y3b, y3c,
18
                    ny2;
19 2 homer.xing
    wire zero3a,
20 3 homer.xing
         use1,  // asserted if $ins9$ did the work
21
         done10, // asserted if $ins10$ finished
22
         done11,
23
         cond1,
24
         cond2,
25
         cond3,
26
         cond4,
27
         cond5;
28 2 homer.xing
 
29
    assign use1 = zero1 | zero2;
30 3 homer.xing
    assign cond1 = (~use1) && cond2 && cond4; // asserted if $P1 == -P2$
31
    assign cond2 = (x1 == x2);
32
    assign cond3 = (y1 == y2);
33
    assign cond4 = (y1 == ny2);
34
    assign cond5 = (~use1) && cond2 && cond3; // asserted if $P1 == P2$
35 2 homer.xing
 
36 3 homer.xing
    f3m_neg
37
        ins1 (y2, ny2); // ny2 == -y2
38 2 homer.xing
    func9
39
        ins9 (x1, y1, zero1, x2, y2, zero2, x3a, y3a, zero3a);
40
    func10
41 3 homer.xing
        ins10 (clk, reset, x1, y1, done10, x3b, y3b);
42
    func11
43
        ins11 (clk, reset, x1, y1, x2, y2, done11, x3c, y3c);
44 2 homer.xing
 
45
    always @ (posedge clk)
46 3 homer.xing
        if (reset)
47
            zero3 <= 0;
48
        else
49
            zero3 <= (use1 & zero3a) | cond1; // if both of $P1$ and $P2$ are inf point, or $P1 == -P2$, then $P3$ is inf point
50 2 homer.xing
 
51
    always @ (posedge clk)
52
        if (reset)
53
            done <= 0;
54
        else
55 3 homer.xing
            done <= (use1 | cond1) ? 1 : (cond5 ? done10 : done11);
56 2 homer.xing
 
57
    always @ (posedge clk)
58
        if (reset)
59
          begin
60
            x3 <= 0; y3 <= 0;
61
          end
62
        else
63
          begin
64 3 homer.xing
            x3 <= use1 ? x3a : (cond5 ? x3b : x3c);
65
            y3 <= use1 ? y3a : (cond5 ? y3b : y3c);
66 2 homer.xing
          end
67
endmodule
68
 
69 3 homer.xing
/* $P3 == P1+P2$ */
70 2 homer.xing
/* $P1$ and/or $P2$ is the infinite point */
71
module func9(x1, y1, zero1, x2, y2, zero2, x3, y3, zero3);
72
    input [`WIDTH:0] x1, y1, x2, y2;
73
    input zero1; // asserted if P1 == 0
74
    input zero2; // asserted if P2 == 0
75
    output [`WIDTH:0] x3, y3;
76
    output zero3; // asserted if P3 == 0
77
 
78
    assign zero3 = zero1 & zero2;
79
 
80
    genvar i;
81
    generate
82
        for (i=0; i<=`WIDTH; i=i+1)
83
          begin:label
84 3 homer.xing
            assign x3[i] = (x2[i] & zero1) | (x1[i] & zero2);
85
            assign y3[i] = (y2[i] & zero1) | (y1[i] & zero2);
86 2 homer.xing
          end
87
    endgenerate
88
endmodule
89
 
90 3 homer.xing
/* $P3 == P1+P2$ */
91
/* $P1$ or $P2$ is not the infinite point. $P1 == P2$ */
92
module func10(clk, reset, x1, y1, done, x3, y3);
93 2 homer.xing
    input clk, reset;
94 3 homer.xing
    input [`WIDTH:0] x1, y1;
95
    output reg done;
96
    output reg [`WIDTH:0] x3, y3;
97
    wire [`WIDTH:0] v1, v2, v3, v4, v5, v6;
98
    wire rst2, done1, done2;
99
    reg [2:0] K;
100 2 homer.xing
 
101 3 homer.xing
    f3m_inv
102
        ins1 (clk, reset, y1, v1, done1); // v1 == inv y1
103
    f3m_mult
104
        ins2 (clk, rst2, v1, v1, v2, done2); // v2 == v1^2
105
    f3m_cubic
106
        ins3 (v1, v3); // v3 == v1^3
107
    f3m_add
108
        ins4 (x1, v2, v4), // v4 == x1+v2 == x1 + (inv y1)^2
109
        ins5 (y1, v3, v5); // v5 == y1+v3 == y1 + (inv y1)^3
110
    f3m_neg
111
        ins6 (v5, v6); // v6 == -[y1 + (inv y1)^3]
112
    func6
113
        ins7 (clk, reset, done1, rst2);
114
 
115
    always @ (posedge clk)
116
        if (reset)
117
            K <= 3'b100;
118
        else if ((K[2]&rst2)|(K[1]&done2)|K[0])
119
            K <= K >> 1;
120
 
121
    always @ (posedge clk)
122
        if (reset)
123
          begin
124
            done <= 0; x3 <= 0; y3 <= 0;
125
          end
126
        else if (K[0])
127
          begin
128
            done <= 1; x3 <= v4; y3 <= v6;
129
          end
130 2 homer.xing
endmodule
131 3 homer.xing
 
132
/* $P3 == P1+P2$ */
133
/* $P1$ or $P2$ is not the infinite point. $P1 != P2, and P1 != -P2$ */
134
module func11(clk, reset, x1, y1, x2, y2, done, x3, y3);
135
    input clk, reset;
136
    input [`WIDTH:0] x1, y1, x2, y2;
137
    output reg done;
138
    output reg [`WIDTH:0] x3, y3;
139
    wire [`WIDTH:0] v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;
140
    wire rst2, rst3, done1, done2, done3;
141
    reg [3:0] K;
142
 
143
    f3m_sub
144
        ins1 (x2, x1, v1), // v1 == x2-x1
145
        ins2 (y2, y1, v2); // v2 == y2-y1
146
    f3m_inv
147
        ins3 (clk, reset, v1, v3, done1); // v3 == inv v1 == inv(x2-x1)
148
    f3m_mult
149
        ins4 (clk, rst2, v2, v3, v4, done2), // v4 == v2*v3 == (y2-y1)/(x2-x1)
150
        ins5 (clk, rst3, v4, v4, v5, done3); // v5 == v4^2
151
    f3m_cubic
152
        ins6 (v4, v6); // v6 == v4^3
153
    f3m_add
154
        ins7 (x1, x2, v7), // v7 == x1+x2
155
        ins8 (y1, y2, v8); // v8 == y1+y2
156
    f3m_sub
157
        ins9 (v5, v7, v9), // v9 == v5-v7 == v4^2 - (x1+x2)
158
        ins10 (v8, v6, v10); // v10 == (y1+y2) - v4^3
159
    func6
160
        ins11 (clk, reset, done1, rst2),
161
        ins12 (clk, reset, done2, rst3);
162
 
163
    always @ (posedge clk)
164
        if (reset)
165
            K <= 4'b1000;
166
        else if ((K[3]&rst2)|(K[2]&rst3)|(K[1]&done3)|K[0])
167
            K <= K >> 1;
168
 
169
    always @ (posedge clk)
170
        if (reset)
171
          begin
172
            done <= 0; x3 <= 0; y3 <= 0;
173
          end
174
        else if (K[0])
175
          begin
176
            done <= 1; x3 <= v9; y3 <= v10;
177
          end
178
endmodule

powered by: WebSVN 2.1.0

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