1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
classdef TriggeredComponent < handle
%Triggered Clock Component
%
% NumberOfClocks
% Copyright 2020 The MathWorks, Inc.
%#codegen
properties (Abstract)
NumberOfClocks %Number of clock phases
end
properties (Hidden, SetAccess=protected)
%triggered component properties
ClockPrevious ; % Previous clock
ClockCurrent ; % Current clock
ClockRisingFlag ; % Clock rising edge detect
ClockFallingFlag ; % Clock falling edge detect
PhaseRisingIndex ; % Clock phase with rising edge detected
PhaseFallingIndex ; % Clock phase with falling edge detected
end
methods
% Constructor
function obj = TriggeredComponent(varargin)
% Support name-value pair arguments when constructing object
%setProperties(obj,nargin,varargin{:})
end
end
methods(Access = protected)
%% Common functions
function setupClock(obj)
% Initialize buffers
obj.ClockPrevious = double(nan(obj.NumberOfClocks, 1));
obj.ClockCurrent = double(nan(obj.NumberOfClocks, 1));
obj.ClockRisingFlag = false(obj.NumberOfClocks, 1);
obj.ClockFallingFlag = false(obj.NumberOfClocks, 1);
obj.PhaseRisingIndex = 0;
obj.PhaseFallingIndex = 0;
end
function ClockStep(obj,ClockIn)
%Triggered clock step
% Update buffers
obj.ClockPrevious = obj.ClockCurrent;
obj.ClockCurrent = ClockIn ;
% Detect clock zero crossing, rising and falling edges
obj.ClockRisingFlag = (obj.ClockPrevious <= 0) & (obj.ClockCurrent > 0);
obj.ClockFallingFlag = (obj.ClockPrevious > 0) & (obj.ClockCurrent <= 0);
% On clock rising edge: get phase index with rising edge
% If no rising edge, set index to zero
% Assume only one phase has a rising edge
if sum(obj.ClockRisingFlag) > 0
[~, obj.PhaseRisingIndex] = max(obj.ClockRisingFlag);
else
obj.PhaseRisingIndex = 0;
end
% On clock falling edge: get phase index with falling edge
% If no falling edge, set index to zero
% Assume only one phase has a falling edge
if sum(obj.ClockFallingFlag) > 0
[~, obj.PhaseFallingIndex] = max(obj.ClockFallingFlag);
else
obj.PhaseFallingIndex = 0;
end
end
end
end
|