非同期セット/リセット付Dフリップフロップ

更新日 2020-06-17 (水) 17:29:52

非同期セット/リセット付Dフリップフロップ

クロックとは同期していないセット入力SBとリセット入力RBがあり、リセット動作を行う。

DFF74.v

/* DFF SET RSET */

module DFF74(CK, D, RB, SB, Q, QB);

  input CK, D, RB, SB;
  output Q, QB;
  reg Q, QB;

  always@(posedge CK or negedge RB or negedge SB) begin
      if (RB == 0)      Q <= 0;
      else if (SB == 0) Q <= 1;
      else              Q <= D;
   end

/*QBをreg型なので、alwaysで代入する 
   always@(*)  begin
      QB <= ~Q;
   end

endmodule


QBについて以下のように書くこともできるようだ

module DFF_SR(CK, D, Q, QB, RB, SB);
input CK, D, RB, SB;
output Q, QB;
reg Q;

always@(posedge CK or negedge RB or negedge SB) begin
  if (RB == 0)      Q <= 0;
  else if (SB == 0) Q <= 1;
  else              Q <= D;
end

assign QB = ~Q;  //ネット型変数の信号への代入は,assign 文でのみ可能

endmodule

  ・ 信号名       …信号が立ち上がるときと,立ち下がるとき

  ・ posedge 信号名 …信号が立ち上がるとき(positive edge の略)

  ・ negedge 信号名 …信号が立ち下がるとき(negative edge の略)

テストベンチ

DFF74_testbench.v

`timescale 1ns/1ps

module DFF74_testbench;

   parameter OSC100M_PERIOD = 10; // 周期10nsのクロック parameterは定数宣言
   parameter STEP = 10;

   reg OSC100M_CK, D, RB, SB;
   wire Q, QB;

   DFF74 test (OSC100M_CK, D, RB, SB, Q, QB);

       initial begin
          OSC100M_CK = 1'b0;
       end

       always #(OSC100M_PERIOD/2) begin
          OSC100M_CK=~OSC100M_CK;
       end

       initial begin
          $dumpfile("wave.vcd");
          $dumpvars(0, DFF74_testbench);
          $monitor ("%t: D = %b, CK = %b, RB = %b, SB = %b, Q = %b, QB =%b", $time, D, OSC100M_CK, RB, SB, Q, QB);

               D = 0;  RB = 0; SB =1;
          #10  RB = 1;
          #10  D = 1;
          #20  D = 0;

          #60  $finish;

       end
endmodule

DFF.png


添付ファイル: fileDFF.png 11件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-17 (水) 17:29:52 (23d)