[HARMAN] 세미콘 아카데미/Verilog

[Harman 세미콘 아카데미] Day_28(Verilog)

uiop1716 2025. 3. 16. 13:57

오늘 배운것~~


 D Latch : 클럭 신호의 레벨에 따라 통과모드 또는 유지모드로 동작
       ㄴ 통과 모드 : 입력 D가 출력 Q로 통과돰
       ㄴ 유지 모드 : 출력 Q의 값이 유지됨

래치가 포함된 순차회로에서  blocking은 한개로 두번 동작
nonblocking은 동시에 진행하기에 두개 생성


D F/F : 클록 신호의 천이에지에서 동작 (한 클록 주기 동안 정보를 저장함)


동기식 셋/리셋 : 신호에 맞춰 출력함 (ASIC)
     ㄴ 장점 :  Metastable이 없다 
비동기식 셋/리셋 :  reset의 신호가 떨어져도, 출력은 그대로 나오게 됨 (FPGA)
     ㄴ 단점 : Metastable이 발생할 수 있다 (= reset이 안막을 수도 있음)


blocking & non-blocking 할당문

 1) 순차회로 래치 모델링 always 문은 nonblocking
 2) 조합회로 모델링 always문은 blocking 문
 3) 순차 + 조합 함께 사용시 non-blocking 문
 4) 다수의 always 블록에 동일한 reg 변수에 값을 할당하지 않는다 ( 다중 구동 발생)


계수기(counter) : 클록 펄스가 인가될 때마다 값이 증가 또는 감소되는 회로
          ㄴ 주파수 분주기, 타이밍 및 제어 신호 생성

     1) 동기식 계수기 : 모든 FF가 하나의 공통 클록신호에 의해 구동되며 모든 FF 상태변경이 동시에 일어남

     2) 비동기식 계수기 : 첫단의 FF에 클록신호가 인가되면, FF 출력이 다음 단의 FF을 트리거시키는 방식으로 동작 (ripple counter)
          ㄴ 단점 : 각 FF의 전파 지연이 누적되어 나중에 신호가 많이 지연됨


시프트 레지스터 : 클럭신호가 인가될 때마다 저장된 FF에 저잗오딘 데이터가 왼쪽 또는 오른쪽으로 이동되는 회로
ㄴ 직렬입력 - 직렬출력 : SISO , *non-blocking*으로 모델링 -> ex) Shift Register
ㄴ ******* 직렬입력 - 병렬출력 : SIPO
ㄴ ******* 병렬입력 - 직렬출력 : PISO 
ㄴ 병렬입력 - 병렬출력 : PIPO ex) bus통신, 레지스터 (병렬입력, 병렬출력 load 사용(=enable) )

----> UART TX, RX 간 데이터 통신은 SISO 방식, 데이터 버스는 데이터를 병렬로하여 묶어서 가지고 있음.
TX가 데이터를 버스로 부터 PISO 방식으로 받아, SISO 방식으로 RX에 쏘고, RX는 데이터를 받고 버스에 다시 SIPO 방식으로 저장. 
참고 :  https://blog.naver.com/techref/222305240651

선형 귀환 시프트 레지스터 :
ㄴ 선형 귀환을 통해 2진 비트 열을 생성
ㄴ 시스템 IC의 내장형 자기 진단(BIST)회로에 사용되어 테스트 벡터 생성 및 테스트 응답 분석에도 사용



I2C / SPI (동기 통신) : 클럭에 도익되어 데이터를 전송으로 하므로, 속도가 빠름
-> Master가 Slave에게 CLK를 제공하여 속도, 포맷 제공


USART : 동기 / 비동기 둘 다 가능 + Full Duplex

ASM (Algorithm State Machine) : 유한 상태 머신 (알고리즘을 활용한 수학적 모델)

출력에 대한 값과, 조건에 대한 문이 들어가 있다.

ASM 예시

 

 

 

UART에 대해 이어서 실습하겠습니다. 먼저 Tick_done이라는 친구를 만들어 주었습니다.

Tx_done이 무엇 인가하면, 데이터 전송 중 다른 간섭 신호를 차단하기 위한 표시입니다. 일종의  "나 바쁘니깐 건드리지마" 라는 Busy Signal과 비슷하죠.

아래 그림에서는, 데이터 전송이 시작되는 Start부터 전송이 끝나는 Stop까지 Tx_done을 설계하여 1을 출력하도록 합니다. 이를 통해, 데이터 전송 버튼인 btn_start가 눌리면 Tx_done이 High 상태로 잘 변경되어, 데이터가 잘 전송되고 있구나도 확인할 수 있죠.

Uart Data 전송 방식.
tx_done의 결과

 

 

그리고 UART의 TX 즉 데이터를 전송하는 친구가 있으면, 받는 친구도 있어야 겠죠?

그래서 ComPortMaster를 활용하여, FPGA 보드를 TX로 설정하고 데이터를 받는 RX를 컴퓨터로 설정하여 UART 통신을 진행할 것입니다. 즉, FPGA에서 신호를 보내게 되면 컴퓨터에서 받게 되고 출력을 나타내는 것이죠.

 

그리하여, FPGA의 버튼을 한번 누르면 숫자 0부터 문자 z까지 1개의 데이터를 출력하도록 코딩하였습니다. 데이터는 ASCII 표를 참고하여, 버튼이 한 번 눌릴때마다 ASCII 표에 따라 하나씩 증가되며 출력되는 모습을 구성하였습니다.

ASCII 코드 표
버튼이 눌리면, "0"~ "z"까지 값을 출력하는 모습

 

 

결과 : RX인 컴퓨터가 TX인 FPGA의 버튼이 눌릴때마다 데이터를 0부터 하나씩 증가되어 출력하는 모습.

RX 결과

 

 

이를 활용하여, 오늘 이론으로 배운 ASM에 대해 활용하였습니다.

기존에는 Data에 대한 State가 8개로 표시되어 난잡하였는데, 이를 한개의 Data State로 묶어 시뮬레이션 하였습니다.

 

Data State를 하나로 묶은 것에서 Count라는 숫자를 통해 Data가 8번까지 돌며 데이터를 출력하고, 종료되면 STOP State로 넘어가는 모습을 구현하였습니다.

8개의 State를 1개의 State로 묶은 모습

 

 

그리하여 Button Start가 두번 들어왔을 때

Btn_Start가 두번 들어옴

 

 

 

State가 기존에는 2~8까지 출력되며 데이터를 출력하였지만, 이번에는 하나의 "2" State에서 8bit의 데이터가 출력되고 "3" State로 넘어가는 모습입니다. 기존에 0 (=30)의 값에서 버튼이 눌렸다는 신호인 btn_start가 들어오면, 출력 값이 1로 증가되는 모습을 통해, 저희가 위에서 구현했던 결과들이 잘 맞는 것을 확인할 수 있습니다.

 

 

 

줌 아웃해서 확인하면, 버튼이 들어오고, tx_done이라는 신호가 활성화 되어있는 동안 State가 순식간에 변화하며 데이터를 전송하여 출력값인 TX의 값이 1개씩 증가하며 출력되는 모습

 

 

 

 

사진 1) Uart Data 전송 방식 출처 : https://semicon-circuit.tistory.com/98

사진 2) ASCII 코드 표 : https://sheepone.tistory.com/47