SimulinkでMATLAB Functionブロックを使って「1クロック遅延付きDフリップフロップ(DFF)」を自作する
概要
本記事では、Simulink上で MATLAB Function
ブロックを使って、1クロック遅延付きDフリップフロップ(DFF) を double
型で実装する方法を紹介します。
「論理値(boolean)」ではなく、「実数(double)」でクロックや入力を扱うのがポイントです。
対象読者
- Simulink上でカスタムな状態遷移を作りたい人
- フリップフロップなどの論理回路を数値的に模擬したい人
- クロック立ち上がり検出を自作で実現したい人
DFFとは?
D型フリップフロップ(DFF)は、クロックの立ち上がりに合わせて入力 D
を出力 Q
に転送し、その値を保持する基本的な記憶素子です。
今回の目的は、1クロック遅れてDを出力するDFF を構築することです。
使用するブロック
- MATLAB Function(コードを記述)
- Constant / Step(入力用)
- Pulse Generator(クロック生成)
- Scope(結果の可視化)
実装コード(MATLAB Functionブロック内部)
function Q = dff_logic(D, CLK)
% Program Name: dff_logic_delayed.m
% Overview: 1クロック遅延付きD型フリップフロップ(Simulink用、double対応)
% Inputs:
% D : 入力信号(double) / Input data
% CLK : クロック信号(double) / Clock signal
% Output:
% Q : 出力信号(double) / Output (1-cycle delayed latched data)
% --- 永続変数の定義 / Define persistent variables ---
persistent D_latched Q_reg clk_prev
% --- 初回初期化 / Initialize once ---
if isempty(D_latched)
D_latched = 0; % ラッチされたD値(次回出力用)/ Latched value
Q_reg = 0; % 出力状態 / Output register
clk_prev = 0; % 前回のクロック / Previous clock
end
% --- クロック立ち上がり検出 / Rising edge detection ---
if clk_prev <= 0.5 && CLK > 0.5
% 前回クロックの立ち上がりで保存した値を出力し、
% 今回Dの値をラッチしておく(=1クロック遅延)
Q_reg = D_latched; % 遅延出力に反映 / Output last latched value
D_latched = D; % 次回出力用にDを保存 / Latch current input
end
% --- 出力更新 / Output update ---
Q = Q_reg;
% --- クロック状態更新 / Update clock history ---
clk_prev = CLK;
end
クロック条件の意味
if clk_prev <= 0.5 && CLK > 0.5
これは、**クロック信号が0.5を超えた瞬間(立ち上がり)**を検出して、DFFのラッチ条件としています。
シミュレーション例
- クロック:
Pulse Generator
(Period = 2s, Amplitude = 1, Pulse Width = 50%) - D入力:任意のStep波形(例:t = 3sで0→1)
- 出力Q:Scopeで確認すると、1周期遅れて値が反映される
応用展開
- シフトレジスタ(DFFを多段接続)
- 非同期リセット付きDFF(Reset引数の追加)
- クロック遅延検出器、パルス幅伸長なども類似の設計で可能
まとめ
Simulinkの MATLAB Function
ブロックを使うと、カスタム状態遷移 + クロックエッジ制御 + double型処理を柔軟に組み合わせることができます。
ハードウェア記述を模倣しつつ、数値演算に適した信号処理が可能です。