Verilog Tフリップフロップ:RTL実装とテストベンチ完全解説
Tフリップフロップの設計
Tフリップフロップ(トグルフリップフロップ)は、入力tが1のときクロックエッジで出力を反転し、0のときは保持するシンプルな順序回路です。カウンタや分周器の基本構成要素として広く使われます。
module tff (
input clk,
input rstn, // アクティブローリセット(同期)
input t, // トグル入力
output reg q
);
always @(posedge clk) begin
if (!rstn)
q <= 0;
else if (t)
q <= ~q; // t=1 で反転
else
q <= q; // t=0 で保持(明示的記述)
end
endmodule
テストベンチ
ランダムなトグル入力を与え、出力波形を確認します。$monitorで時系列変化をログ出力します。
module tb;
reg clk;
reg rstn;
reg t;
wire q;
tff u0 (
.clk(clk),
.rstn(rstn),
.t(t),
.q(q)
);
always #5 clk = ~clk; // 10ns周期
initial begin
{rstn, clk, t} <= 0;
$monitor("T=%0t rstn=%0b t=%0d q=%0d", $time, rstn, t, q);
repeat(2) @(posedge clk); // リセット保持
rstn <= 1; // リセット解除
for (integer i = 0; i < 20; i = i + 1) begin
reg [4:0] dly = $random;
#(dly) t <= $random; // ランダムなタイミングでトグル入力変更
end
#20 $finish;
end
endmodule
シミュレーション結果
ncsim> run T=0 rstn=0 t=0 q=x T=5 rstn=0 t=0 q=0 T=15 rstn=1 t=0 q=0 T=19 rstn=1 t=1 q=0 T=25 rstn=1 t=1 q=1 // t=1で反転 T=35 rstn=1 t=1 q=0 // 再び反転 T=43 rstn=1 t=1 q=0 T=47 rstn=1 t=1 q=1 T=55 rstn=1 t=0 q=1 // t=0で保持 T=59 rstn=1 t=1 q=1 T=65 rstn=1 t=1 q=0 T=67 rstn=1 t=0 q=0 T=71 rstn=1 t=1 q=0 T=75 rstn=1 t=0 q=1 T=79 rstn=1 t=1 q=1 T=83 rstn=1 t=0 q=1 T=87 rstn=1 t=1 q=1 T=95 rstn=1 t=0 q=0 Simulation complete via $finish(1) at time 115 NS + 0
波形観測のポイント
- リセット中(rstn=0)は出力qが0に固定される
- リセット解除後、t=1のときのみクロックエッジでqが反転
- t=0の区間ではqは前状態を保持
- ランダム入力でも期待通りのトグル動作を確認できる
応用例
Tフリップフロップをカスケード接続すると、2進カウンタやクロック分周器が簡単に構築できます。例えば、T入力を常に1に固定したT-FFをN段直列に繋ぐと、Nビットのバイナリカウンタになります(各段のクロックは前段の出力q)。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ