ムーアマシンの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;   // 内部変数の宣言

 

// FFとその入力組合せ回路の記述

always @(posedge clk or posedge rst) 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をこのテンプレートどおりに書かなければならない。

// clkの立上がりまたはrstの立上がり時にbegin-end内を実行するという意味

always @(posedge clk or posedge rst) begin

  if(rst)      // 非同期リセット: rst=1ならば0を代入する

    d_reg <= 'd0;

  else

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

end

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

◇◇

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

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

assign parity = ^d_reg;

 

// 複雑な組合せ回路はfunction文を使う

assign d_out = fnc2( dreg );

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

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

  case(d)

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

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

  ...

  default: fnc2 = 'bx;

  endcase

endfunction


[] [] []