function [Q, Q_bar] = DFF(D, CLK, ICLR)
% D Flip-Flop 動作のSimulink用関数
% 入力: D - データ, CLK - クロック, ICLR - 非同期クリア
% 出力: Q - 主出力, Q_bar - 反転出力
% 初期化状態
persistent Q_reg prev_CLK
% 初回実行時の初期化
if isempty(Q_reg)
Q_reg = 0; % 初回実行時にレジスタを0で初期化
prev_CLK = 0; % 初回実行時のクロック値
end
% 離散動作: ICLR が 1 の場合はリセット
if ICLR
Q_reg = 0;
else
% クロックの立ち上がりエッジで D を Q に反映
if CLK && ~prev_CLK % クロックが立ち上がるタイミング
Q_reg = D;
end
end
% クロック値を更新
prev_CLK = CLK;
% 出力
Q = Q_reg; % 主出力
Q_bar = ~Q_reg; % 反転出力
end
function [Q, Q_bar] = DFF(D, CLK, ICLR)
% D Flip-Flop 動作のSimulink用関数
% 入力: D - データ, CLK - クロック, ICLR - 非同期クリア
% 出力: Q - 主出力, Q_bar - 反転出力
% 初期化状態
Q = 0;
% 離散動作: ICLR が 1 の場合はリセット
if ICLR
Q = 0;
else
% クロックの立ち上がりエッジで D を Q に反映
if CLK
Q = D;
end
end
% 反転出力
Q_bar = ~Q;
end
function [Q, Q_bar] = DFF(D, CLK, ICLR)
% D Flip-Flopの動作をシミュレートする関数
% 入力:
% D - データ入力
% CLK - クロック入力
% ICLR - 非同期クリア入力 (1でリセット)
% 出力:
% Q - メイン出力
% Q_bar - Qの反転出力
% 静的変数の定義 (前回のQを保持するため)
persistent Q_prev
% 初期化 (シミュレーションの最初にQ_prevを0に設定)
if isempty(Q_prev)
Q_prev = 0;
end
% 非同期クリア (ICLR) が1の場合、Qをリセット
if ICLR == 1
Q = 0;
else
% クロックの立ち上がりエッジでDの値をQに反映
if rising_edge(CLK)
Q = D;
else
% 変化しない場合は前回の値を保持
Q = Q_prev;
end
end
% Qの反転出力を生成
Q_bar = ~Q;
% Q_prevを更新
Q_prev = Q;
end
% 補助関数: クロックの立ち上がりエッジ検出
function result = rising_edge(CLK)
persistent CLK_prev
if isempty(CLK_prev)
CLK_prev = 0;
end
result = (CLK_prev == 0) && (CLK == 1);
CLK_prev = CLK;
end