Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/Toriya/des12.v

Parent Directory Parent Directory | Revision Log Revision Log


Revision 118 - (show annotations) (download)
Wed Apr 11 04:55:06 2007 UTC (17 years, 1 month ago) by chapuni
File size: 3318 byte(s)
「本物の鳥屋」ついに公開です。
たぶん 2005/09 頃のものです。
もしかするとあと一度ほど、改良するかもね。
1 /**********************************************************-*-verilog-*-
2 *
3 * a stage of DES - ステージ一段
4 * $Id$
5 *
6 */
7
8 module des12(i_l, i_r, i_fk, i_k,
9 l, r, k,
10 clk5, salt, kp);
11
12 input [1:32] i_l;
13 input [1:32] i_r;
14 input [55:0] i_fk;
15 input [55:0] i_k;
16
17 output [1:32] l;
18 output [1:32] r;
19 output [55:0] k;
20
21 input clk5;
22 input [11:0] salt;
23 input [55:0] kp; // phase cache
24
25 parameter kmsk = 56'b0000_0000_1111_1111_111_111_111_111_000_000_000_000_000_000_000_000_0000;
26 parameter f_ram = 8'b1111_1111;
27 parameter krn = 1;
28
29 `include "conf.v"
30 `include "func_des.v"
31 `include "func_salt.v"
32
33 // パイプライン用
34 wire [27:0] i_kl, i_kr;
35 reg [1:32] ln1, ln2; // ir_p を適用済み
36 reg [1:32] r1, r2;
37 reg [55:0] k1, k2;
38
39 // phase cache
40 wire [27:0] kp1, kp0;
41 assign {kp1, kp0} = kp;
42
43 /*
44 * F用
45 * S1-S4は実質鍵固定なので
46 * 右側と左側で処理が分かれる
47 */
48 wire [1:48] e;
49 reg [1:48] e1, e2;
50 reg [1:32] f;
51 wire [1:32] ln;
52
53 // ROM, RAMの出力
54 wire [1:32] q;
55
56 /***************************************************************
57 *
58 * stage 1の前処理
59 * e の一部およびlnの一部は、RAMに渡され、
60 * 2クロック後に結果を得られる。
61 */
62 assign {i_kr, i_kl} = kmux(kmsk, i_fk, i_k);
63 assign e = add_salt(salt, tr_e(i_r)) ^ {tr_pc2l(roln(pc1_l(i_kl), krn)),
64 tr_pc2r(roln(pc1_r(i_kr), krn))};
65 assign ln = ir_p(i_l); // for RAM
66
67 /*
68 * STAGE 1 (これと並行して、RAMのAラッチが行われる)
69 */
70 always @(posedge clk5)
71 begin
72 k1 <= {i_kr, i_kl};
73 ln1 <= ln;
74 r1 <= i_r;
75 e1 <= e;
76 end
77
78 /*
79 * 必要に応じてRAMから拾う
80 * 最終段のXOR演算も一部含まれる
81 */
82 sbrom12 sb_a(clk5, e, ln, ln1, q);
83
84 /*
85 * STAGE 2 (hold with RAM Q)
86 * RAMのQ待ちをするかたわら、LUTを引く
87 * key phase cache をここに挿入することにより、
88 * パイプラインレジスタの大幅な削減を図ることができる。
89 */
90 always @(posedge clk5)
91 begin
92 //kr2 <= wh01k(kr1);
93 k2 <= k1;
94 r2 <= r1;
95 ln2 <= ln1;
96 f <= {s1(e1[ 1: 6]),
97 s2(e1[ 7:12]),
98 s3(e1[13:18]),
99 s4(e1[19:24]),
100 s5(e1[25:30]),
101 s6(e1[31:36]),
102 s7(e1[37:42]),
103 s8(e1[43:48])};
104 end
105
106 /*
107 * (STAGE 3)
108 * 最終段はラッチせず、そのまま出力に繋げてある
109 * Synthesizerが、次の段の頭と最適化してくれるのを
110 * 期待するためである。
111 *
112 * 設定によってはこの時点で l2 の特定ビットがマスクされて
113 * いるため、マスクされたビットのXORは行われない(ハズ)
114 */
115 assign l = r2;
116 assign r = tr_p(rmuxq(f_ram, q, ln2 ^ f)); // 組み合わせの出力だゴメン
117 assign k = k2;
118
119 /***************************************************************
120 *
121 * 出力の振り分け
122 *
123 */
124 function [0:31] rmuxq;
125 input [7:0] f;
126 input [0:31] q1;
127 input [0:31] q0;
128 rmuxq = {f_ram[0] ? q1[ 0: 3] : q0[ 0: 3],
129 f_ram[1] ? q1[ 4: 7] : q0[ 4: 7],
130 f_ram[2] ? q1[ 8:11] : q0[ 8:11],
131 f_ram[3] ? q1[12:15] : q0[12:15],
132 f_ram[4] ? q1[16:19] : q0[16:19],
133 f_ram[5] ? q1[20:23] : q0[20:23],
134 f_ram[6] ? q1[24:27] : q0[24:27],
135 f_ram[7] ? q1[28:31] : q0[28:31]};
136 endfunction
137
138 /*
139 * 入力より、phaseに応じたキーを合成して返す
140 * k, kp は big endian であることに注意。
141 */
142 function [27:0] wh01k;
143 input [27:0] k;
144 wh01k = k /*(k[kbn]
145 ? {kp1[27:kbn + 1], k[kbn:0]}
146 : {kp0[27:kbn + 1], k[kbn:0]})*/;
147 endfunction
148
149 endmodule
150
151 /*
152 * Local variables:
153 * tab-width: 4
154 * End:
155 */

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