ムーアマシンのRTL記述

[] [] []


ここまでで準備ができたのでムーアマシンの書き方を説明する。

この図のムーアマシンVerilogで書くと次のようになる。

/* moore.v */

module moore      ←入出力ポートの宣言

  (input clk

  ,input rst

  ,input[L:0] d_in

  ,output[M:0] d_out

  );

 

reg[N:0] d_reg;         ←内部変数の宣言

 

always @(posedge clk or posedge rst)   FF

  begin                                その入力組合せ回路

  if(rst)                              の記述

    d_reg <= 'd0;

  else

    d_reg <= fnc1(d_reg,d_in);

  end

 

assign d_out = fnc2(d_reg);          ←組合せ回路の記述

 

endmodule

1つの回路はmoduleという単位で書かれる。C言語の関数のようなものと思えばよい。

入力ポートと宣言した信号は、そのまま変数として代入文の右辺やif文の条件式で使える。

出力ポートと宣言した信号は、wire変数として何か代入しなければならない。

内部変数は最初に全部宣言しておく。

FFalways文で記述する。論理合成ツールにFFと認識してもらうためには、クロックclkと非同期リセットrstをこのテンプレートどおりに書かなければならない。

always @(posedge clk or posedge rst)    // clkの立上がり時またはrstの立上がり時に

  begin                                 // begin-end内を実行するという意味

  if(rst)

    d_reg <= 'd0;                       // 非同期リセット: rst=1ならば0を代入する

  else

    d_reg <= fnc1(d_reg,d_in);          // clkでの動作: 値を代入する

  end

ここで非同期リセットとはクロックよりも優先して強制的にFFの値を確定させるグローバルな信号である。

組合せ回路はassign文で記述する。右辺は論理式またはfunction文で書く。

assign parity = ^dreg;  // 1行の式で書ける組合せ回路はfunction文を使う必要はない

 

assign d_out = fnc2( dreg );    // 複雑な組合せ回路はfunction文を使う

 

function[M:0] fnc2              // fnc2は出力

  (input[N:0] d);               // 入力の宣言

  case(d)                       // このfnc2内は適当な例であって特に意味はない

  'd0: fnc2 = d[M:0];

  'd1: fnc2 = d[M+1:1];

  ...

  default: fnc2 = 'bx;

  endcase

endfunction


[] [] []