0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SimulinkでMATLAB Functionブロックを使って「1クロック遅延付きDフリップフロップ(DFF)」を自作する

Posted at

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型処理を柔軟に組み合わせることができます。

ハードウェア記述を模倣しつつ、数値演算に適した信号処理が可能です。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?