https://www.slideserve.com/garrett-potts/flip-flop
엣지검출기가 있어야 엣지트리거에서 동작하므로 엣지검출기가 있어야 플립플롭(ppt에있는 D플립플롭X), 클럭이 있어도 레벨 트리거이면 래치
래치가 기본구조, 플립플롭에 모두 구성으로 들어가있음
래치의 11입력 발진을 보완한것이 D플립플롭과 다른 플립플롭들
래치는 레벨트리거
엣지트리거 사용->플립플롭, 엣지트리거 사용x->레벨 트리거->래치
래치생성 방지를 위해 default나 else문 사용
래치-레벨트리거의 문제점, 하이레벨이 길어졌을시 동작하고나서도 다시 하이레벨에 걸려서 또 동작할수도있음
제어 신호(Enable 신호)에 의해 상태가 변경된다. 제어 신호가 활성 상태일 때 입력 신호에 따라 즉시 상태를 변경하고, 비활성 상태일 때는 상태를 유지한다.
클럭 신호의 변화에서만 상태를 변경한다, 클럭 신호가 없는 동안에는 상태를 유지한다.



NOR게이트로 구성된 SR(set, reset)래치
SR(01)또는 SR(10)으로 Q값을 0또는 1로 초기화를하고 그다음 사용(최초 사용시에는 출력Q 값이 어떤 상태인지 알수 없는 unknown상태 따라서 초기화 하고 사용)(하지만 OR나 NOR는 입력중 하나라도 1이 들어가면 출력이 1 또는 0으로 정해진다)

출력이 유지될때까지 피드백 계속 시행

우선 S = 1, R = 1은 금지된 입력이기에 이것은 가정하지 않고 (S, R)이 (0, 1) 또는 (1, 0)일 때를 생각 하자면 일단 (0, 1)일때 R부분에 채터링 또는 잡음들이 발생하면 1의값이 0->1->0->1 이런식으로 진동하지만 (0, 0)은 어짜피 상태 유지이기 때문에 출력값이 바뀌지 않는다
마찬가지로 (1, 0)에서 S부분에 채터링이 발생해도 결국 그에 맞는 값 또는 상태 유지기 때문에
SR래치는 채터링이나 노이즈에 대한 방지 대책으로 사용할순 있다
S = 1, R = 1이 금지된 입력인 이유는 출력을 Q 다른쪽 출력을 Q`라고 했을때 서로 반대 결과의 출력을 내보내야 하는데 두 입력 모두 1일때 Q, Q` 둘다 0의 값을 갖게 되므로 모순이다
하지만 Q, Q`라는 것은 출력에 이름을 붙인것일 뿐인데 왜 둘다 0값을 가지면 안될까
우선 래치의 설계 자체가 반대쪽 출력을 다시 입력으로 받아 서로 다른 출력값을 갖는 것을 기대하고 만들어졌고,
S = 1, R = 1을 입력해서 두 출력 모두 0이 된 뒤 다시 S = 0, R = 0을 입력하면 이전 출력값을 유지하는 것이 아니라 두 출력 모두 0,1,0,1,0값을 계속해서 반복하게 되고 이것은 예기치 못한 동작들을 초래한다. 따라서 S = 1, R = 1 입력은 제한되어 있다.
출력(00)인 상태에서 입력(00)을 주면 발진하게됨(0,1,0,1,0,1)진동
입력 11을 방지하기 위해 D,JK래치가가 나왔지만 래치의 문제는 레벨 트리거로 인해 하이레벨 한번에 두번이상 동작할수있는것이 주요한 문제라고 할수있다
(사진오류-클럭펄스 검출기가 있어야 플립플롭이다)
엣지 트리거에 동작하는 것은 플립플롭, 레벨 트리거에 동작하는 것은 래치



동그라미 : 네거티브 엣지에서 반응한다는 표시
세모 : 엣지 검출기 있다는 표시

pdt고려, 버퍼사용, 글리치제거, x and x^ = 0 공리맞추기


레벨 트리거 : enable 신호가 하이레벨이나 로우레벨일때 회로가 작동하는 방식
엣지 트리거 : (펄스전이검출기를 연결해) enable 신호가 하이->로우레벨(하강에지)로 가는 순간이나 반대(상승에지)의 경우에 작동시키는 방식 (순간적으로만 신호를 받기 때문에 훨씬 안정적)
래치의 11입력과 발진을 막기위함
동그라미 : 네거티브 엣지에서 반응한다는 표시, 세모 : 엣지 검출기 있다는 표시
module D_flip_flop_n(
input d,
input clk,
output reg q);
always @(negedge clk)begin
q = d;
end
endmodule
비바도에서 제공하는 코드대로 만들어진 회로도

선택한 보드에 맞춰서 만들어진 회로도

입력단 버퍼는 약해진 전압보상, 클럭단에 2개있는것은 전압보상과 노이즈 제거, 출력단 버퍼는 역전류 차단
module D_flip_flop_n(
input d,
input clk, reset_p, enable,
output reg q);
always @(negedge clk or posedge reset_p)begin
if(reset_p) q = 0;
else if(enable) q = d;
end
endmodule


상승엣지
클럭의 상승엣지에서 입력에 따른 출력 변화
module D_flip_flop_p(
input d,
input clk, reset_p, enable,
output reg q);
always @(posedge clk or posedge reset_p)begin
if(reset_p) q = 0;
else if(enable) q = d;
end
endmodule

하강엣지

클럭의 하강엣지에서 입력에 따른 출력 변화

enable이 0이되면 입력에따른 변화없이 출력 유지

reset값이 1이되면 출력값 0으로 변화