오늘은 날씨가 좀 많이 풀린 것 같습니다. 교재로 공부한 이론들을 조금 이야기 하고 가겠습니다.
Gate Primitive : 우리가 아는 논리 회로( AND, OR, NOT)등 을 바로 작성 가능
특징 : 두개 이상의 입력과 하나의 출력을 가짐
- 포트 연결 : 순서에 의한 매핑만 가능
- 출력 지연 값 지정 : #(n1, n2)
n1: 상승 전달지연 n2: 하강 전달 지연
ㄴ nand U1(out ,a ,b)
buf 게이트 & not 게이트
특징 : 두개 이상의 입력과 하나의 출력을 가짐
- 포트 연결 : 순서에 의한 매핑만 가능
- 출력 지연 값 지정 : #(n1, n2)
n1: 상승 전달지연 n2: 하강 전달 지연 : 출력이 x로 변할 때의 전달지연
- Buf 게이트 : 입력을 그대로 출력함
- Not 게이트 : 입력을 반대로 출력함
3상태 버퍼 게이트 프리미티브 : 출력이 3가지 상태를 가지는 논리 게이트
3상태(0, 1, z) 드라이브 모델링에 사용됩니다. x(don't care)도 포함하여 0,1,z를 이용하여 출력을 가지게 할 수 있습니다.
3상태 버퍼는 일반 버퍼와 달리 출력을 z(High Impedence)의 상태로도 만들 수 있습니다.
- 할당문-
연속 할당문: net 자료형 신호에 값을 할당
ㄴ assign
----> 합치기 & 분리도 가능합니다.
ㄴ wire mynet;
assign mynet = enable & a;
assign mynet = enable & a;
wire mynet;
절차형 할당 : variable 자료형 변수( reg, integer, time) 에 값을 할당
----> always, initial 같은 곳에서 사용됨
ㄴ blocking 할당 문 ' = '
ㄴ nonblocking 할당문 ' <= '
ex) a = 0, b = 1
a = b; a <= b;
b =a ; b <= a;
----> a= 1, b =1 ------> a= 1, b = 0;
절차형 연속 할당 : variable 또는 net에 대해 연속적인 구동을 허용
ㄴ assign - deassign(assign문을 지움)
ㄴ force - release (simulation을 하기 위함)
CDC(Clock Domain Crossing) : 서로 다른 클럭을 갖는 레지스터 간의 데이터 전송 방법
하지만, 두개의 클럭이 다르기 때문에 Meta Stability가 생성되는 문제가 발생합니다. 이를 해결하기 위해 2개의 D Flip Flop을 연속적으로 사용해서 해결합니다. 이를 Flip Flop Syncronizer 라고도 합니다.
Q1의 경우, 첫번째 Flip Flop을 clk에 맞춰 샘플링을 하게 됩니다. Flip Flop을 지나가기 때문에 delay가 약간 발생하게 됩니다. 이렇게 출력된 Q1은 두번째 Flip Flop을 지나며 다시한번 샘플링된 결과 Q2를 만들어 냅니다. Q2의 경우 delay된 Q1을 받아 샘플링 하였기 때문에, 조금 뒤늦은 시간에 깔끔한 값을 출력합니다.
깨끗한 데이터를 통신하며 약간의 delay로 Metastability를 피하는 방법이라고 할 수 있을 것 같습니다.
+ 또다른 방법으로 FIFO(First In First Out) 방식을 이용하여 포인터 관리를 통해 데이터에 대한 순서를 정해주는 방법도 있습니다.
** 결과 **
즉, ipad 참조 것 처럼 Q1, Q1의 위상차 발생하는거 확인, CDC의 문제가 보여짐
그래서 F/F 두개를 붙여서 Syncronizer를 생성함 + FIFO 버퍼 사용함
** ㄴ <그림 6> 참조
이제 요즘 공부하고 있는 FSM에 대해 설명하겠습니다. 어제는 Moore 모델을 활용하여 FSM을 구성해보는 실습을 하였는데요. 오늘은 Mealy 모델에 대해서도 배워 보겠습니다.
Mealy 모델과 Moore 모델의 가장 큰 차이점은 출력을 위한 조합 회로에서 입력을 고려하느냐 마느냐 입니다.
Moore 모델의 경우에는 현재 상태를 고려하여 출력을 냅니다. 출력을 내기 전에, 다음 상태에 대한 예측값이 있기 때문에 현재 상태를 알면 다음 상태도 알 수 있어, 출력을 바로바로 낼 수 있습니다. 하지만, 출력의 변화가 한 클럭 엣지 이후에 생성되어 Mealy 모델 보다는 1clk가 늦습니다.
Mealy 모델의 경우에는 출력이 입력과 현재 상태에 따라 좌우됩니다. 출력값이 입력값에 영향을 받게 되므로 입력이 변화하면 출력을 바로 변화하게 할 수 있습니다.
이해에 도움이 되게끔 그림을 보여드리자면
Moore 모델의 경우, 현재 상태를 기준으로 입력값이 들어오면 다음값에 대한 예측으로, 다음 상태로 넘어가게 되고 다음상태가 갖고있는 출력값을 출력합니다.
Mealy 모델의 경우에는, 입력값과 현재 상태에 따라 동시에 출력값이 출력되면서 상태를 넘어가게 됩니다.
(제가 풀이를 잘 못했지만, 도움이 조금이나마 되셨으면 좋겠습니다.)
Mealy 모델에 대한 그림을 토대로 코드를 작성하였습니다. 상태가 변화하면서 입력의 변화와 함께 출력값이 출력이 됩니다. 현재 상태에 대해 case로 두고, 각 state가 스위치로 입력값을 받게 되면 LED를 출력하며 다음 상태로의 천이를 나타냅니다.
이렇게 배운 내용을 토대로, 그동안 만들었던 10000bit 카운터를 FSM의 Control unit으로 제어하는 실습을 하였습니다.
아래 그려놓은 State와 출력에 관한 그림을 토대로 FSM (= Control Unit) 을 만들고, 이를 활용하여 10000bit Counter를 Run/Stop/Clear 시키도록 코드를 작성하였습니다.
결과:
스위치 0, 1 을 각각 10000bit Counter에 대해 Run, Stop을 진행하고 가운데 버튼을 Reset으로 설정하였습니다.
Mealy 모델에 대한 추가 실습으로, 교재에 있는 연속 숫자 출력 모델을 만들었습니다.
Mealy 모델이기 때문에, 현재의 상태와 입력에 따라 결과가 함께 출력되는 모습을 볼 수 있습니다.
FSM을 동작해보기 위해 간단한 Test Bench를 설계하였습니다
결과:
결과 값을 살펴보면 시작뒤 10ns 후 reset이 1로 변해 State machine을 시작하고 10ns뒤인 20ns에 0으로 변합니다. 앞으로 모든 변화는 10ns 단위로 변화됩니다.
* 상태의 변화에 대해서는 나오지 않아, 설명을 따라 입력, 출력 값을 보셔야 합니다...
모든 state를 한번씩 돌도록 testbench를 설계하였습니다.
이후, 30ns input이 0이면 rd0_once로 이동하고 출력은 0입니다
40ns input이 다시 0이 들어와 rd0_twice로 이동하고 출력은 1
50ns input이 또다시 0이 들어와 rd0_twice를 유지하고 출력은 1
60ns input이 1이 들어와 rd1_once로 이동하고 출력은 0
70ns input이 1이 들어와 rd1_twice로 이동하고 출력은 1
이라는 결과를 타나내며, 그림과 같은 입,출력, 상태 천이를 구현하였습니다.
오늘은 Mealy 상태 머신에 대한 실습을 진행하며 FSM에 대해서 많이 배웠습니다. 앞으로 clk 분주를 통한 타이머 설계를 진행할텐데, 이를 FSM을 통해 제어하는 실습을 할 예정입니다. 교수님꼐서 클럭 분주에 대한 강의를 가볍게 설명해 주셨는데, 기억이 나면서도 어려웠습니다. 많이 부족하지만, 열심히 공부해서 Verilog에 대해 고수가 되고 싶습니다...ㅋ
'[HARMAN] 세미콘 아카데미 > 공부내용' 카테고리의 다른 글
[Harman 세미콘 아카데미] Day_24(Verilog) (0) | 2025.03.10 |
---|---|
[Harman 세미콘 아카데미] Day_23(Verilog) (0) | 2025.03.07 |
[Harman 세미콘 아카데미] Day_21(Verilog) (0) | 2025.03.05 |
[Harman 세미콘 아카데미] Day_20(Verilog) (0) | 2025.03.04 |
[Harman 세미콘 아카데미] Day_19(Verilog) (0) | 2025.03.02 |