フリップフロップ
flip-flop
R-Sフリップフロップ: Reset-Set flip-flop
NORゲートによる構成に忠実に書いてみる?あんも.icon
フィードバックを受けるのがうまくできなかった
処理を抽象化して考えないことにするあんも.icon
r,sの初期値の好ましい宣言位置がわからない?あんも.icon
クロージャの引数として与える?
既定値をfalseにしておけば、引数指定なしで呼んだときに今の状態を返してくれる
エンクロージャ内で宣言する?
とりあえず動くあんも.icon
code:create_rs_flipflop.jl
function create_rs_flipflop(initial_state::Bool=false)
state = initial_state
return function(r::Bool=false, s::Bool=false)
if r && s
error("Invalid state: R and S cannot both be 1.")
elseif r
state = false # Reset
elseif s
state = true # Set
end
return state
end
end
code:jl
rs_flipflop = create_rs_flipflop()
F, T = false, true
rs_flipflop()
rs_flipflop(F, T)
rs_flipflop(T, F)
rs_flipflop(T, T)
Dタイプフリップフロップ
D: data
オシレータと組み合わせると変更を受け付けるタイミングを制御できる レベルトリガー型
code:create_d_flipflop.jl
function create_d_flipflop(initial_state::Bool=false)
rs_flipflop = create_rs_flipflop(initial_state)
return function(d::Bool, clock::Bool)
if clock
# Dタイプフリップフロップの入力特性
r = !d
s = d
return rs_flipflop(r, s)
else
# クロック入力が0のときは変更を受け付けない
return rs_flipflop() # 今の状態を返す
end
end
end
code:jl
d_flipflop = create_d_flipflop()
oscillator = create_oscillator(1)
for d_input in d_input_seq
clock_signal = oscillator()
println("Clock: $clock_signal, D: $d_input, Output: $(d_flipflop(d_input, clock_signal))")
end
エッジトリガー型
レベルトリガーを組み合わせる方法は難しいので、抽象化して書いてみるあんも.icon
クロックの状態も保持して前回と比べられるようにする
code:jl
function create_pedge_d_flipflop(initial_state::Bool=false)
state = initial_state
previous_clock = false
return function(d::Bool, clock::Bool)
if (previous_clock == false) && (clock == true)
state = d
end
previous_clock = clock
return state
end
end
code:jl
d_flipflop = create_pedge_d_flipflop()
oscillator = create_oscillator(1)
for d_input in d_input_seq
clock_signal = oscillator()
println("Clock: $clock_signal, D: $d_input, Output: $(d_flipflop(d_input, clock_signal))")
end