DES IC の Key Schedule (KS) の設計


Key Schesule (KS)処理のハードウェアを設計しよう。
以下の雛形を参考にして完成させなさい。

考え方
  1. input, output にて、変数の入出力定義を行う。

  2. 内部変数として Cxx, Dxx を定義する。

  3. pc1_c, pc1_d および pc2 のビット並び替え function を作成する。

  4. 左ロテートシフトを行うための function を作成する。
    なお、シフト量は n=0 のとき1ビット、n=1 のとき2ビットとする。

  5. 副鍵 Kxx を生成する。雛形ソースにおいて K01 を作成している部分を 参考にして、K16まで作成する。

Key Schedule (KS)
module keysched ( KEY, K01, K02, K03, K04, K05, K06, K07, K08, 
                       K09, K10, K11, K12, K13, K14, K15、K16 );

  input  [1:64] ...;
  output [1:48] ..., ..., ..., ..., ..., ..., ..., ..., 
                ..., ..., ..., ..., ..., ..., ..., ...;


  wire [1:28] C00, ..., ..., ..., ..., ..., ..., ..., 
              ..., ..., ..., ..., ..., ..., ..., ..., C16;
  wire [1:28] D00, ..., ..., ..., ..., ..., ..., ..., 
              ..., ..., ..., ..., ..., ..., ..., ..., D16;

  function [1:28] pc1_c;
    input [1:64] di;
    pc1_c = {
      di[57],    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,  di[36] };
    endfunction

  function [1:28] pc1_d;
    input [1:64] di;
    pc1_d = {
      di[63],    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ..., di[ 4] };

  endfunction


  function [1:48] pc2;
    input [1:56] di;
    pc2 = {
      di[14],    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ...,    ...,
         ...,    ...,    ...,    ...,    ..., di[32] };
  endfunction

  // n=0: 1bit left rotate, n=1: 2bits left rotate
  function [1:28] shift;
    input [1:28] di;
    input        n;
    shift = ( n == 0 ) ? { di[...:...], di[...] } : { di[...:...], di[...:...] };
  endfunction

  // 00
  assign C00 = pc1_c( KEY );  
  assign D00 = pc1_d( KEY );  

  // 01
  assign C01 = shift( C00,  0 );  
  assign D01 = shift( D00,  0 );  
  assign K01 = pc2( { C01, D01 } );
  // 02
     ...
  // 03
     ...
  // 04
     ...
  // 05
     ...
  // 06
     ...
  // 07
     ...
  // 08
     ...
  // 09
     ...
  // 10
     ...
  // 11
     ...
  // 12
     ...
  // 13
     ...
  // 14
     ...
  // 15
     ...
  // 16
     ...

endmodule

次は、 シミュレーションによる動作検証 を行う。
| Back |