非同期セット/リセット付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 |