간단한 이론과 함께 시작하겠습니다.
Blocking VS Non-Blocking
Blocking 할당문 : ' = ' combinational
Non - blocking 할당문 : 동시 실행 + 할당 스케줄에 의해 값이 할당 , ' <= ' Sequential
---> Blocking 할당문은 값을 즉시 변환, Non-Blocking은 실행 블록이 끝나고 값을 업데이트
zero-delay 무한루프 : always 구문을 통한 제어가 없으면 생성되는 오류
if - else - if : 다중 결정을 위해 사용, if문의 조건이 순서대로 평가됨
동기 : clk와 연관
비동기 : clk와 연관없음
많은 bit -> 적은 bit : 인코더, 부호화기
<- : 디코더
---- 반복문 ----
forever 문 : 조건 없이 무한히 반복 실행 (시뮬레이션만 실행 : 조건이 없기 때문에)
repeat 문 : 지정된 횟수만큼 반복 실행
while 문 : 조건이 참인 동안 반복 실행, 거짓이면 실행 x
for 문 : 조건을 설정하여 반복하도록 설정
while문은 조건이 참이 아닐 때까지 반복되므로, 루프의 반복 횟수를 명확하게 확정할 수 없는 경우에는 합성에 실패할 수 있음
---- 블록문 ----
블록문 :
begin - end 절차형 할당문 블록 : 문장이 나열된 순서에 의해 순차적인 실행
fork - join 병렬형 할당문 블록 : 문장이 나열된 순서에 무관하게 동시에 실행
SOC 기본 유한상태머신 회로 (FSM) : 정해진 수의 상태를 가지고 상태들 간의 천이에 의해 출력을 생성하는 회로
Combinational Logic -> Sequential Logic -> CL
- Moore 모델 : 출력이 단자 현재상태에 의해서 결정
- Mealy 모델 : 현재상태와 입력에 의해 출력이 결정
1010 detector
Non-Overlapping Melay Sequence Detector VS Non-Overlapping Moore Sequence Detctor
---> Mealy의 경우, 입력과 동시에 출력이 존재 + 현재의 상태와 입력에 따른 출력 / Moore는 그렇지 않기 때문에 하나의 State가 더 필요함
---> 상태도에 따라 Moore가 출력이 1clk정도 늦음
오늘은 스톱워치를 만들기 위한 코딩을 하였습니다. 먼저 회로에 들어갈 개념들을 정리하여 회로도에 대해서 정리하고, 공부하는 시간을 갖게 되었습니다. 이전 포스팅까지 배운 내용들을 활용하고 변환하여 모듈들을 설계하였습니다.
달라진 점이라고 한다면, 기존에는 clk를 100Hz로 분주하여 발생하는 Tick으로 Millisecond와 Second를 구하기 위해 각각 사용하였는데, 이번에는 100Hz 분주된 clk를 이용해서 1개의 Tick을 만들고, 100진 카운터를 생성하여 Millisecond를 구현한 후, Millisecond에서 발생하는 1개의 Tick을 다시 활용하여 60개를 Count해서 Second를 구현하게 됩니다.
각각 출력되는 msec와 sec는 두개의 Digit Splitter , 4x1 MUX를 거쳐 FND로 표현됩니다. 이를 통해, 시간을 나타냅니다. 또한, 버튼을 통해 타이머를 Run/Stop/Clear/Reset 하기 위해 Stopwatch control unit을 만들어 제어를 담당하도록 합니다.
먼저, 기존에 만들어 놓았던 Digital Splitter를 활용하였습니다. 하나의 Digital Splitter를 활용하여 밀리초, 초, 분, 시간을 나타낼 수 있도록 만들었습니다. 데이터 전송 비트에 대한 파라미터를 이용하여 쉽게 만들었습니다.
사실, 밀리초는 100, 초와 분은 60, 시는 24까지 숫자가 올라가야하므로 밀리초는 2^7이 필요해 7비트, 초와 분은 6비트, 시는 5비트가 필요합니다. 하지만, 교수님께서 초와 분 부분에 여유있게 7비트를 넣어 진행하셨습니다.
그리고, 100Hz clk을 만들었습니다. 이전과 동일하게 Count가 1_000_000이 될 때, 1개의 Tick을 생성하게 됩니다.
이렇게 100Hz clk에서 나오는 Tick들을 활용하여 Millisecond, Second, Miniute, Hour를 구현합니다. 1개의 Tick을 100번 세어 Millisecond, 60번 세면 Second, Minuite이 되고, 이를 24번세면 Hour를 구현할 수 있습니다. 이 또한, 쉽게 만들기 위해 Tick의 개수와 데이터 전송 시 필요한 비트 폭을 Parameter로 설정하여 쉽게 만들었습니다.
아래 코드를 보면 각 모듈은 이전 모듈에게서 부터 Tick을 받아와 사용하는 계단식 구조를 보여줍니다. 짧게 설명을 하자면, Millisecond가 100번 돌면 Tick이 하나 발생하게 되고 이는 Secondrk 1 증가하라는 신호이기도 합니다. 그러면 우리가 구현하고자 하는 타이머가 될 수 있습니다. Second - Miniute, Miniute - Hour 또한 동일하게 적용한다면 시, 분, 초, 밀리초를 구현할 수 있습니다.
Schematic을 통해 결과를 확인하자면, 파라미터화 된 Millisecond, Second, Miniute, Hour를 나타내는 Counter들이
Stopwatch_datapath에 잘 들어가 있는 모습이 보입니다. 또한, 100Hz clk로부터 Tick이 시작되어, Millisecond, Second, Miniute, Hour를 거치며 카운터를 생성하는 모습을 볼 수 있습니다.
Testbench도 확인해 보면, 아직은 완성되지는 않았지만 Millisecond가 100이 되면 0으로 초기화가 됨과 동시에 Tick이 발생하고, 아래 결과인 Second가 증가하는 것을 볼 수 있었습니다.
전체적인 Schematic을 보면, 우리가 회로도로 구상하였던 내용들이 Schematic에 잘 표현됨을 확인할 수 있었습니다.
여태까지 실습을 하며, 교수님께서 회로도를 그려주시고 설명해 주시면서 코드로 구현하였습니다. 하지만, 앞으로는 스스로 구상하고 구현하고 해보라고 하셨습니다. 여태껏 코드만 구현해봤지 회로도를 그려볼 생각은 못했는데... 제가 잘 할 수 있을까 걱정이 앞서기만 합니다. 스스로 생각하고 구현해보는 과정을 통해 시스템 설계에 능통해 질 수 있도록 열심히 노력해 보겠습니다!!!
'[HARMAN] 세미콘 아카데미 > 공부내용' 카테고리의 다른 글
[Harman 세미콘 아카데미] Day_23(Verilog) (0) | 2025.03.07 |
---|---|
[Harman 세미콘 아카데미] Day_22(Verilog) (0) | 2025.03.06 |
[Harman 세미콘 아카데미] Day_21(Verilog) (0) | 2025.03.05 |
[Harman 세미콘 아카데미] Day_20(Verilog) (0) | 2025.03.04 |
[Harman 세미콘 아카데미] Day_19(Verilog) (0) | 2025.03.02 |