Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/Toriya/top_ser.v

Parent Directory Parent Directory | Revision Log Revision Log


Revision 118 - (show annotations) (download)
Wed Apr 11 04:55:06 2007 UTC (17 years ago) by chapuni
File size: 15008 byte(s)
「本物の鳥屋」ついに公開です。
たぶん 2005/09 頃のものです。
もしかするとあと一度ほど、改良するかもね。
1 /**********************************************************-*-verilog-*-
2 *
3 * Project: TORIYA -鳥屋-
4 * THE TOP MODULE of TRIP for the Legacy Serial
5 * $Id$
6 *
7 */
8
9 module top_ser(CLK1P, CLK4P, CLK14P,
10 TxD1, RTS1, RxD1, CTS1,
11 SWIN,
12 LEDDB, LEDOEN);
13
14 input CLK1P; // on-board clock generator
15 input CLK4P; // same as CLK1P
16 input CLK14P; // same as CLK1P
17 output TxD1;
18 output RTS1;
19 input RxD1;
20 input CTS1;
21 input [1:5] SWIN; // functional switch
22 output [7:0] LEDDB;
23 output [4:0] LEDOEN;
24
25 `include "func_des.v"
26 `include "func_salt.v"
27 `include "func_util.v"
28
29 // この回路で使用する比較器の個数!!!
30 parameter NCAP = 54; // これでもキツい
31 parameter NCTH = 0;
32
33 // Salt固定で、鳥屋トリップをひねり出すかどうか
34 parameter SALT_MSB = 1'b0;
35
36 // リセットは、回路内にて正論理で使用する。
37 wire clk_locked;
38 wire serclk_locked;
39 wire rst = !SWIN[5] || !clk_locked || !serclk_locked;
40 reg trip_rstgo;
41 wire trip_rst = rst || trip_rstgo;
42
43 // x5 PLL
44 wire clk, clk5, st_gate;
45 clockgen pllx5(CLK4P, clk5, clk, st_gate, clk_locked);
46
47 // Serial clock
48 wire txclk, rxclk, hostclk, ledclk;
49 wire serclk16;
50 serclockgen serclkx16(CLK14P, serclk16, serclk_locked);
51 reg [12:0] serclk_div;
52 assign hostclk = serclk_div[1]; // 1/4
53 assign rxclk = serclk_div[1]; // 1/4
54 assign txclk = serclk_div[3]; // 1/16
55 assign ledclk = serclk_div[12]; // たぶん225Hz
56
57 // FIFO
58 wire [55:0] fifo_data;
59 reg fifo_rdreq;
60 wire fifo_wrreq;
61 wire [55:0] fifo_q;
62 wire fifo_rdempty;
63 wire [12:0] fifo_usedw;
64 wire fifo_wrfull;
65 kfifo fifo1(fifo_data, fifo_wrreq, fifo_rdreq,
66 hostclk, clk, rst,
67 fifo_q, fifo_rdempty, fifo_usedw,
68 fifo_wrfull);
69
70 // LED driver
71 wire [7:0] led_d8;
72 wire [15:0] led_h8b;
73 wire [3:0] led_d4;
74 leddrv4 led7sg(ledclk, rst,
75 LEDDB, LEDOEN,
76 led_h8b[15:12],
77 led_h8b[11: 8],
78 led_h8b[ 7: 4],
79 led_h8b[ 3: 0],
80 led_d4[3],
81 led_d4[2],
82 led_d4[1],
83 led_d4[0]);
84
85 // Serial clock generator(serclk16 = 32MHz * 36 / 625)
86 always @(posedge serclk16)
87 serclk_div <= serclk_div + 1;
88
89 // Serial Rx driver
90 wire [7:0] rxdata;
91 wire rxrdy;
92 reg rxack;
93 rxdriver rxdrv1(rxclk, rst, RxD1, RTS1, rxrdy, rxdata, rxack);
94
95 // Serial Tx Driver
96 reg [7:0] txdata;
97 reg txwe;
98 wire txrdy;
99 txdriver txdrv1(txclk, rst, TxD1, CTS1, txwe, txdata, txrdy);
100
101 // TRIP ENGINE
102 reg tripper_ken;
103 reg tripper_wait;
104 reg [11:0] salt;
105 reg [27:0] kl, kr;
106 wire [27:0] kli, kri;
107 wire tripper_bsy;
108 wire tripper_oen;
109 wire [55:0] o_k;
110 wire [1:64] o_h;
111
112 parameter krstep = 28'b0000_0001_0000_0000_000_000_000_000;
113 parameter krmask = 28'b0000_0000_1111_1111_111_111_111_111;
114 assign {kli, kri} = {kl, kr} + {28'b0, krstep};
115
116 crypt22 #(krmask)
117 tripper(rst,
118 clk, clk5, st_gate,
119 tripper_ken, salt, {kr, kl},
120 tripper_bsy,
121 tripper_oen, o_k, o_h);
122
123 // まずはタイミング的に厳しい o_h を取り出してしまう
124 reg men0;
125 reg [55:0] fk0;
126 reg [1:66] fh0;
127 always @(posedge clk)
128 begin
129 men0 <= tripper_oen;
130 fk0 <= kmux({krmask, 28'b0},
131 {kr, kl},
132 o_k);
133 fh0 <= {o_h, 2'b0};
134 end
135
136 // 比較器マシーン(組み合わせ回路)
137 wire matched;
138 reg c_we; // pulse
139 reg [55:0] fk1;
140 reg [7:0] c_wu;
141 reg [7:0] c_txd;
142 comparators #(NCAP, NCTH)
143 cmps(rst,
144 clk,
145 men0,
146 fk0, fh0, // 区別ありキー
147 fk1, matched, // ヒット結果
148 hostclk,
149 c_we, c_wu, c_txd);
150
151 assign fifo_wrreq = matched;
152 assign fifo_data = pc1(fk1);
153
154 // FIFO は、rdreq から1サイクル遅れで出てくる!
155 reg fifo_rdrdy;
156
157 // コマンド一覧
158 parameter CMD_READY = 8'b0000_0001;
159 parameter CMD_RESET = 8'b0000_0011;
160 parameter CMD_GETCAP = 8'b0000_0111;
161 parameter CMD_TEXT = 8'b0000_1101;
162 parameter CMD_STANDBY = 8'b0000_1111;
163 parameter CMD_SETCOND = 2'b01;
164 parameter CMD_SETKEY = 8'b1000_0000;
165
166 // コマンドのステートなど
167 reg [3:0] st_cmd;
168 parameter ST_CMD_STANDBY = 4'b0000;
169 parameter ST_CMD_READY = 4'b0001;
170 parameter ST_CMD_TEXT = 4'b0010;
171 parameter ST_CMD_GETTING_CAP = 4'b1000;
172 parameter ST_CMD_SENDING = 4'b1001;
173 parameter ST_CMD_TEXT_SENDING = 4'b1010;
174 parameter ST_CMD_SETTING_COND = 4'b1011;
175 parameter ST_CMD_SETTING_KEY1 = 4'b1101;
176 parameter ST_CMD_SETTING_KEY2 = 4'b1110;
177 parameter ST_CMD_SETTING_KEY3 = 4'b1111;
178
179 // 送信するための一時レジスタ
180 reg [4:0] st_send; // 0..16
181 reg [63:0] found_key;
182
183 wire rdy_led;
184 assign rdy_led = !fifo_rdempty || st_cmd == ST_CMD_READY;
185
186 // 状態のレポートLED
187 assign led_d8 = {1'b0,
188 1'b0,
189 1'b0,
190 1'b0,
191 1'b0,
192 1'b0,
193 1'b0,
194 1'b0};
195 assign led_h8b = (SWIN[1] ? kl[27:12]
196 : SWIN[4] ? kr[23: 8]
197 : SWIN[2] ? {3'b0, fifo_usedw}
198 : {kl[11:0], kr[27:24]});
199 assign led_d4 = {1'b0,
200 rdy_led,
201 ~CTS1 & ~kr[23],
202 fifo_wrfull};
203
204 /*
205 * ホストインタフェイス。なんとなくserclk基準で回してみる
206 */
207 always @(posedge hostclk or posedge rst)
208 if (rst)
209 begin
210 // reset
211 fifo_rdreq <= 0;
212 fifo_rdrdy <= 0;
213 txwe <= 0;
214 rxack <= 0;
215 trip_rstgo <= 0;
216 st_cmd <= ST_CMD_STANDBY;
217 tripper_ken <= 0;
218 tripper_wait <= 0;
219 kl <= 28'b0;
220 kr <= 28'b0;
221 c_we <= 0;
222 c_wu <= 0;
223 found_key <= 0;
224 end
225 else
226 begin
227 /*
228 * キーまわし
229 */
230 if (!tripper_ken && !tripper_bsy && !tripper_wait)
231 begin
232 tripper_ken <= 1;
233 end
234 else if (tripper_ken && tripper_bsy && !tripper_wait)
235 begin
236 tripper_wait <= 1;
237 end
238 else if (tripper_ken && !tripper_bsy && tripper_wait)
239 begin
240 tripper_wait <= 0;
241 tripper_ken <= 0;
242 {kl, kr} <= {kli, kri};
243 salt <= {mksalt({SALT_MSB, kli[24:22], kri[23:20]}),
244 mksalt({SALT_MSB, kli[27:25], kri[27:24]})};
245 end
246
247 /*
248 * コマンド受信
249 */
250 if (st_cmd == ST_CMD_STANDBY
251 //|| st_cmd == ST_CMD_TEXT
252 || st_cmd == ST_CMD_READY)
253 begin
254 if (!c_we && rxrdy && !rxack)
255 case (rxdata)
256 CMD_RESET:
257 begin
258 rxack <= 1;
259 trip_rstgo <= 1;
260 st_cmd <= ST_CMD_STANDBY;
261 end
262 CMD_READY:
263 begin
264 rxack <= 1;
265 st_cmd <= ST_CMD_READY;
266 end
267 CMD_STANDBY:
268 begin
269 // キーを報告してスタンバイへ
270 rxack <= 1;
271 st_cmd <= ST_CMD_STANDBY;
272 end
273 /*
274 CMD_TEXT:
275 begin
276 rxack <= 1;
277 st_cmd <= ST_CMD_TEXT;
278 end
279 */
280 CMD_GETCAP:
281 if (txrdy && !txwe)
282 begin
283 rxack <= 1;
284 st_cmd <= ST_CMD_GETTING_CAP;
285
286 // コンパレータの総数を送る
287 // まずはこれを送ってしまう
288 txdata[5:0] <= NCAP;
289 txdata[7:6] <= 2'b0;
290 txwe <= 1;
291 c_wu <= 0;
292 end
293 CMD_SETKEY:
294 begin
295 st_cmd <= ST_CMD_SETTING_KEY1;
296 rxack <= 1;
297 end
298 default:
299 case (rxdata[7:6])
300 CMD_SETCOND:
301 begin
302 // スロット#を受け取る
303 c_wu <= {2'b0, rxdata[5:0]};
304 st_cmd <= ST_CMD_SETTING_COND;
305 rxack <= 1;
306 end
307 default:
308 rxack <= 1; // 読み捨て
309 endcase
310 endcase
311 end
312 /*
313 * コマンド処理
314 */
315 case (st_cmd)
316 ST_CMD_GETTING_CAP:
317 if (txrdy && !txwe)
318 begin
319 st_cmd <= ST_CMD_STANDBY;
320 /*
321 // 後続に、能力を、知らせた分だけ送る
322 txdata <= c_cap;
323 txwe <= 1;
324 if (c_wu == NCAP - 1)
325 st_cmd <= ST_CMD_STANDBY;
326 c_wu <= c_wu + 1;
327 */
328 end
329 ST_CMD_SETTING_KEY1:
330 // KEY は、NETWORK ORDERの逆(shit!)
331 if (rxrdy && !rxack)
332 begin
333 kl[11: 4] <= rxdata;
334 rxack <= 1;
335 st_cmd <= ST_CMD_SETTING_KEY2;
336 end
337 ST_CMD_SETTING_KEY2:
338 if (rxrdy && !rxack)
339 begin
340 kl[19:12] <= rxdata;
341 rxack <= 1;
342 st_cmd <= ST_CMD_SETTING_KEY3;
343 end
344 ST_CMD_SETTING_KEY3:
345 if (rxrdy && !rxack)
346 begin
347 kl[27:20] <= rxdata;
348 rxack <= 1;
349 tripper_ken <= 0;
350 tripper_wait <= 0;
351 st_cmd <= ST_CMD_STANDBY;
352 end
353 ST_CMD_SETTING_COND:
354 if (rxrdy && !rxack && !c_we)
355 begin
356 // キーを受け取り、ケツから詰めていく
357 c_txd <= rxdata;
358 c_we <= 1;
359 rxack <= 1;
360 st_cmd <= ST_CMD_STANDBY;
361 end
362 ST_CMD_READY:
363 begin
364 /* キーを発見したらホストに送り返すモード */
365 if (CTS1)
366 begin
367 fifo_rdreq <= 0;
368 fifo_rdrdy <= 0;
369 st_cmd <= ST_CMD_STANDBY;
370 end
371 else if (!fifo_rdempty && !fifo_rdreq && !fifo_rdrdy)
372 begin
373 // FIFOへのデータ要求
374 fifo_rdreq <= 1;
375 fifo_rdrdy <= 0;
376 end
377 else if (fifo_rdreq && !fifo_rdrdy)
378 begin
379 fifo_rdreq <= 0;
380 fifo_rdrdy <= 1;
381 end
382 else if (!fifo_rdreq && fifo_rdrdy)
383 begin
384 // FIFOからの取り込み
385 // 送るデータは、LITTLE ENDIANだ(糞
386 found_key <= i_pc1(fifo_q, SALT_MSB);
387 fifo_rdreq <= 0;
388 st_send <= 0;
389 fifo_rdrdy <= 0;
390 st_cmd <= ST_CMD_SENDING;
391 end
392 end
393 ST_CMD_SENDING:
394 if (txrdy && !txwe)
395 begin
396 /*
397 * 一致キーをバイナリにて送信するモード
398 */
399 // 順繰りに(pos, data)を送り出していく
400 // というのは古い仕様。
401 // いまは、data のみひたすら送出している。
402 txdata <= found_key[63:56];
403 txwe <= 1;
404 found_key <= {found_key[55:0], 8'b0000_0000};
405 st_send <= st_send + 1;
406 if (st_send == 8 - 1)
407 st_cmd <= CTS1 ? ST_CMD_STANDBY : ST_CMD_READY;
408 end
409 endcase
410
411 /*
412 * 送受信のACKを戻す
413 */
414 if (!txrdy && txwe)
415 txwe <= 0;
416 if (!rxrdy && rxack)
417 rxack <= 0;
418
419 /*
420 * レジスタ we (パルス) を戻す
421 */
422 if (c_we)
423 c_we <= 0;
424
425 /*
426 * エンジンリセットをアサートしていたら
427 * やがてネゲートするようにしてみたり
428 */
429 if (trip_rstgo)
430 trip_rstgo <= 0;
431 end
432
433 endmodule // top_ser
434
435 /*-------------------------------------------------------------------------------------------+
436 ; Fitter Resource Usage Summary ;
437 +---------------------------------------------+----------------------------------------------+
438 ; Resource ; Usage ;
439 +---------------------------------------------+----------------------------------------------+
440 ; Total logic elements ; 10,307 / 10,570 ( 98 % ) ;
441 ; -- Combinational with no register ; 1086 ;
442 ; -- Register only ; 3862 ;
443 ; -- Combinational with a register ; 5359 ;
444 ; ; ;
445 ; Logic element usage by number of LUT inputs ; ;
446 ; -- 4 input functions ; 4530 ;
447 ; -- 3 input functions ; 565 ;
448 ; -- 2 input functions ; 1306 ;
449 ; -- 1 input functions ; 1858 ;
450 ; -- 0 input functions ; 2048 ;
451 ; ; ;
452 ; Logic elements by mode ; ;
453 ; -- normal mode ; 10123 ;
454 ; -- arithmetic mode ; 184 ;
455 ; -- qfbk mode ; 2735 ;
456 ; -- register cascade mode ; 499 ;
457 ; -- synchronous clear/load mode ; 5526 ;
458 ; -- asynchronous clear/load mode ; 4198 ;
459 ; ; ;
460 ; Total registers ; 9,221 / 13,052 ( 71 % ) ;
461 ; Total LABs ; 1,048 / 1,057 ( 99 % ) ;
462 ; Logic elements in carry chains ; 200 ;
463 ; User inserted logic elements ; 0 ;
464 ; Virtual pins ; 0 ;
465 ; I/O pins ; 25 / 427 ( 6 % ) ;
466 ; -- Clock pins ; 3 / 16 ( 19 % ) ;
467 ; Global signals ; 8 ;
468 ; M512s ; 94 / 94 ( 100 % ) ;
469 ; M4Ks ; 60 / 60 ( 100 % ) ;
470 ; M-RAMs ; 1 / 1 ( 100 % ) ;
471 ; Total memory bits ; 752,640 / 920,448 ( 82 % ) ;
472 ; Total RAM block bits ; 920,448 / 920,448 ( 100 % ) ;
473 ; DSP block 9-bit elements ; 0 / 48 ( 0 % ) ;
474 ; PLLs ; 2 / 6 ( 33 % ) ;
475 ; Global clocks ; 8 / 16 ( 50 % ) ;
476 ; Regional clocks ; 0 / 16 ( 0 % ) ;
477 ; Fast regional clocks ; 0 / 8 ( 0 % ) ;
478 ; SERDES transmitters ; 0 / 44 ( 0 % ) ;
479 ; SERDES receivers ; 0 / 44 ( 0 % ) ;
480 ; Average interconnect usage ; 28% ;
481 ; Peak interconnect usage ; 45% ;
482 ; Maximum fan-out node ; clockgen:pllx5|altpll:altpll_component|_clk0 ;
483 ; Maximum fan-out ; 5274 ;
484 ; Highest non-global fan-out signal ; ~GND ;
485 ; Highest non-global fan-out ; 240 ;
486 ; Total fan-out ; 46320 ;
487 ; Average fan-out ; 4.42 ;
488 +---------------------------------------------+---------------------------------------------*/
489
490 /*
491 * Local variables:
492 * tab-width: 4
493 * End:
494 */

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Rev URL

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26