Verilog 멀티플렉서, BCD 변환기, 플립플롭
8x1 멀티플렉서
디멀티플렉서
1개의 인에이블 입력을 가지고 있는 디코더는 디멀티 플렉서로서의 기능을 수행
디멀티플렉서는 정보를 한 선으로 받아서 2^n개의 가능한 출력선들 중 하나를 선택하여, 받은 정보를 전송하는 회로이다. 디멀티플렉서는 n개의 선택선(selection line)들을 이용하여 출력을 제어
S가 0일 때, D의 신호가 F[0]에 출력
S가 1일 때, D의 신호가 F[1]에 출력
S가 2 일 때, D의 신호가 F[2]에 출력
S가 3 일 때, D의 신호가 F[3]에 출력
각 D의 값과 S의 값이 일치하는 파형으로 나온다.
멀티플렉서, 디멀티플렉서 통신
S_mux 가 0일 때, S_demux는 F 0에 clk_781kHz 를 출력(clk_781kHz가 0번)
S_mux 가 1일 때, S_demux는 F 1에 clk_1562kHz 를 출력(clk_1562kHz가 1번)
코드변환기
bcd코드는 10이 넘으면 6을 더해야함
hex : 0000 1011 =>11
bcd : 0001 0001 =>17 (11에서 6을 더한 수)
예를 들어, 0000 0000 1010 에서 맨 최상위 비트를 하나씩 빼며 bcd 맨뒤로 하나씩 붙여줌
bin가 11보다 작을 때, bcd 0~3bit의 수가 4보다 클 경우bcd에 3을 더해준다. 6을 더할 경우 2배의 값이 출력됨
그 후 11번for문의 11번째가 실행되어 bin의 최상위 비트가 하나 지워지고 bcd의 끝에 붙는다.
1~F까지 똑같이 진행되다가
bin+6
BCD변환을 통해 7세그먼트 작동시키기
기존에 진행한 bcd_to_dec, 7세그먼트를 사용
기존에 A, B, C, D, F를 출력하던 세그먼트가 BCD변환을 통해 0, 1, 2, 3, 4, 5 (앞단위는 잘려있다)
플립플롭
기본적인 플립플롭
NOR 래치회로
NAND 래치회로
NOR 래치회로의 Q 출력은 R의 입력을 받고 \Q의 입력을 받기 때문에 Q, R, Qbar
Qbar는 S, Q의 입력을 받기 때문에 Qbar, S, Q를 입력하였다.
D플립플롭은 1 1 입력을 막을수있다
두개 코드를 인스턴스로 묶어서 실행시킴
주종형 S-R플립플롭
주종형(Master-Slave) 플립플롭 : 레벨 트리거링의 문제점을 해결하기 위한 다른 해결책
E = 1 : 외부의 R과 S의 입력이 Master 플립플롭에 전달.
Slave 플립플롭은 E = 0이므로 동작하지 않는다.
E = 0 : Slave 플립플롭이 동작하여 Q = Y, \Q = \Y
Master 플립플롭은 E = 0이므로 동작하지 않는다.
에지 트리거 D 플립플롭
클록형 D 플립플롭의 클록펄스 입력에 펄스 전이 검출기를 추가하여 구성
에지 트리거 D 플립플롭 상승에지일 때 코드
상승에지일 때 결과
상승에지 타이밍에 D = 0 따라서 Q 출력값은 0으로 진행된다.
상승에지 타이밍에 D = 0을 반복하다가 상승에지 타이밍에 D = 1일 때 Q 출력값은 1로 상승한다.
시뮬레이션의 결과가 다음과 같음을 확인할 수 있었다.
에지 트리거 D 플립플롭 하강에지일 때 코드
상승에지와 E의 값만 바꼈다.
하강에지일 때의 결과
하강에지일 때 D = 1이면 Q출력값이 1이 출력된다.
하강에지일 때 D = 0이면 Q출력값이 0이 출력된다.
시뮬레이션 결과가 다음과 같음을 확인할 수 있다.
J-K 플립플롭
J-K플립플롭은 S-R 플립플롭에서 S = 1, R = 1인 경우 출력이 불안정한 상태가 되는 문제점을 개선하여 S = 1, R = 1에서도 동작하도록 개선한 회로이다.
J-K플립플롭의 J는 S(set)에, K(reset)에 대응하는 입력.
J = 1, K = 1인 경우 J-K 플립플롭의 출력은 이전 출력의 보수 상태로 변화
J-K플립플롭은 플립플롭 중에서 가장 많이 사용되는 플립플롭이다.
클럭펄스가 발생할 때, J = 1, K = 0 이면 Q는 1 Qbar는 0.
클럭펄스가 발생할 때, J = 1, K = 1 일 때, Q는 0, Qbar는 1.
진리표와 같은 결과를 얻을 수 있었다.
reset과 preset을 추가하여 결과보기
reset > preset > clk 코드 상으로 preset이 0이므로 Q = 1출력
reset > preset > clk 코드 상으로 reset이 0이므로 Q = 0 출력
reset = 1, preset = 1 인 상태에서 clk이 상승에지로 1이기 때문에 J, K 값을 보는데 1, 1이기 때문에 toggle 따라서 Q는 0.
진리표를 참고하되 reset, preset을 추가하여 봤을 때, 진리표랑 같음
T플립플롭 -> 카운터를 만들 때 사용가능
J-K플립플롭의 J와 K 입력을 묶어서 하나의 입력신호 T로 동작시키는 플립플롭
J-K플립플롭의 동작 중에서 입력이 모두 0이거나 1인 경우만을 이용하는 플립플롭
T플립플롭의 입력 T=0이면, T플립플롭은 J = 0, K = 0인 J-K플립플롭과 같이 동작하므로 출력은 변하지 않는다.
T = 1이면, J = 1, K = 1인 J-K플립플롭과 같이 동작하므로 출력은 보수가 된다.
posedge가 아닌 negedge를 두고 하강에지에서의 동작을 확인한다.
reset과 preset은 1, 1로 둔다. T가 1일 때 clk의 하강에지에 맞춰 toggle 동작을 반복한다.
현재 Q가 1일 때, T가 1이면 다음 하강에지에 toggle (Q = 1 > Q = 0)
현재 Q가 0일 때, T가 1이면 다음 하강에지에 toggle (Q = 0 > Q = 1)