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

Subversion Repositories tiny_tate_bilinear_pairing

[/] [tiny_tate_bilinear_pairing/] [trunk/] [group_size_is_911_bits/] [rtl/] [fsm.v] - Blame information for rev 19

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 homer.hsin
/*
2 15 homer.hsin
 * Copyright 2012, Homer Hsing <homer.hsing@gmail.com>
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16 11 homer.hsin
 
17
/* FSM: finite state machine
18
 * halt if $ctrl == 0$
19
 */
20
module FSM(clk, reset, rom_addr, rom_q, ram_a_addr, ram_b_addr, ram_b_w, pe, done);
21
    input clk;
22
    input reset;
23
    output reg [8:0] rom_addr; /* command id. extra bits? */
24
    input [28:0] rom_q; /* command value */
25
    output reg [5:0] ram_a_addr;
26
    output reg [5:0] ram_b_addr;
27
    output ram_b_w;
28
    output reg [10:0] pe;
29
    output reg done;
30
 
31 19 homer.hsin
    reg [5:0] state;
32
    parameter START=0, READ_SRC1=1, READ_SRC2=2, CALC=4, WAIT=8, WRITE=16, DON=32;
33 11 homer.hsin
 
34
    wire [5:0] dest, src1, src2; wire [8:0] times; wire [1:0] op;
35
    assign {dest, src1, op, times, src2} = rom_q;
36
 
37
    reg [8:0] count;
38
 
39
    always @ (posedge clk)
40
       if (reset)
41
          state<=START;
42
       else
43
          case (state)
44
             START:
45
                state<=READ_SRC1;
46
             READ_SRC1:
47
                state<=READ_SRC2;
48
             READ_SRC2:
49
                if (times==0) state<=DON; else state<=CALC;
50
             CALC:
51
                if (count==1) state<=WAIT;
52
             WAIT:
53
                state<=WRITE;
54
             WRITE:
55
                state<=READ_SRC1;
56
          endcase
57
 
58
    /* we support two loops */
59
    parameter  LOOP1_START = 9'd21,
60
               LOOP1_END   = 9'd116,
61
               LOOP2_START = 9'd288,
62
               LOOP2_END   = 9'd301;
63
    reg [294:0] loop1, loop2;
64
 
65
        always @ (posedge clk)
66
           if (reset) rom_addr<=0;
67
           else if (state==WAIT)
68
          begin
69
             if(rom_addr == LOOP1_END && loop1[0])
70
                rom_addr <= LOOP1_START;
71
             else if(rom_addr == LOOP2_END && loop2[0])
72
                rom_addr <= LOOP2_START;
73
             else
74
                rom_addr <= rom_addr + 1'd1;
75
              end
76
 
77
        always @ (posedge clk)
78
           if (reset) loop1 <= ~0;
79
           else if(state==WAIT && rom_addr==LOOP1_END)
80
          loop1 <= loop1 >> 1;
81
 
82
        always @ (posedge clk)
83
           if (reset) loop2 <= ~0;
84
           else if(state==WAIT && rom_addr==LOOP2_END)
85
          loop2 <= loop2 >> 1;
86
 
87
        always @ (posedge clk)
88
           if (reset)
89
          count <= 0;
90
           else if (state==READ_SRC1)
91
          count <= times;
92
           else if (state==CALC)
93
          count <= count - 1'd1;
94
 
95
        always @ (posedge clk)
96
           if (reset) done<=0;
97
           else if (state==DON) done<=1;
98
           else done<=0;
99
 
100
    always @ (state, src1, src2)
101
       case (state)
102
       READ_SRC1: ram_a_addr=src1;
103
       READ_SRC2: ram_a_addr=src2;
104
       default: ram_a_addr=0;
105
       endcase
106
 
107
    parameter CMD_ADD=6'd4, CMD_SUB=6'd8, CMD_CUBIC=6'd16,
108
              ADD=2'd0, SUB=2'd1, CUBIC=2'd2, MULT=2'd3;
109
 
110
    always @ (posedge clk)
111
       case (state)
112
       READ_SRC1:
113
          case (op)
114
          ADD:   pe<=11'b11001000000;
115
          SUB:   pe<=11'b11001000000;
116
          CUBIC: pe<=11'b11111000000;
117
          MULT:  pe<=11'b11110000000;
118
          default: pe<=0;
119
          endcase
120
       READ_SRC2:
121
          case (op)
122
          ADD:   pe<=11'b00110000000;
123
          SUB:   pe<=11'b00110000000;
124
          CUBIC: pe<=0;
125
          MULT:  pe<=11'b00001000000;
126
          default: pe<=0;
127
          endcase
128
       CALC:
129
          case (op)
130
          ADD:   pe<=11'b00000010001;
131
          SUB:   pe<=11'b00000010001;
132
          CUBIC: pe<=11'b01010000001;
133
          MULT:  pe<=11'b00000111111;
134
          default: pe<=0;
135
          endcase
136
       default:
137
          pe<=0;
138
       endcase
139
 
140
    always @ (state, op, src2, dest)
141
       case (state)
142
       READ_SRC1:
143
          case (op)
144
          ADD: ram_b_addr=CMD_ADD;
145
          SUB: ram_b_addr=CMD_SUB;
146
          CUBIC: ram_b_addr=CMD_CUBIC;
147
          default: ram_b_addr=0;
148
          endcase
149
       READ_SRC2: ram_b_addr=src2;
150
       WRITE: ram_b_addr=dest;
151
       default: ram_b_addr=0;
152
       endcase
153
 
154
    assign ram_b_w = (state==WRITE) ? 1'b1 : 1'b0;
155
endmodule

powered by: WebSVN 2.1.0

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