본문 바로가기
# Semiconductor/- Semicon Academy

[Harman 세미콘 아카데미] 8일차 - review, async/sync counter

by Graffitio 2023. 6. 28.
[Harman 세미콘 아카데미] 8일차 - review, async/sync counter
728x90
반응형
[Review]

 

초반 2시간은 이제까지 했던 것들을 복습하는 시간을 가졌다.

 

[async / sync]

 

1. 비동기식(async)

: 요청과 결과가 동시에 일어지 않는 방식

  → 요청을 보낸 후, 응답을 받지 않아도 진행할 수 있다.

  → 즉, FF들이 서로 다른 clk를 사용

▶특징 : 결과를 기다리지 않고 각각 작업 수행 가능

              설계가 복잡하고 타이밍 제어(PDT제어)가 잘 안 됨.

      ∴ FPGA에서는 async를 사용하지 않는다.

 

2. 동기식(sync)

: 요청과 결과가 동시에 일어나는 방식

  → 요청을 보낸 후, 응답을 받아야 진행된다.

  → 즉, FF들이 같은 clk를 사용

▶특징 : 설계가 간단하고 직관적

              요청에 대한 결과가 반환될 때까지 대기해야됨.

 

[Reset]

 

FF에서 초기값을 지정해주지 않으면, Z(High Impedance)가 출력된다.

(default 초기값은 z)

 

 

 

위 코드처럼 따로 초기값을 지정해줘도 되지만,

가장 보편적으로 사용되는 방법은 input에 reset을 하나 만들어서 sensitivity list에 넣어주는 방법이다.

 

 

① rst = active high(1일 때, rst 동작)

② rstn = active low(0일 때, rstn 동작

    reset 변수명은 편한대로 지정하여 사용하면 된다.

 

async_reset : 다른 요소에 상관없이 리셋 신호에 의해서만 동작

                           ex) 버튼을 눌러서 리셋시키는 경우

sync_reset : clk 펄스의 상승 또는 하강 엣지에 맞춰서 리셋

 

※ 리셋은 async_rstn을 가장 많이 사용한다.

보통 칩에서 리셋하는 애들은 핀에 풀업 레지스터가 달려 있는데, 가만히 냅두면 1의 값을 가진다.

∴ 리셋 시, 0을 인가하는 것이 안전하다.

 

[async_counter]

 

이전 FF의 출력이 다음 FF의 입력으로 들어가는 방식으로, 리플 카운터(Ripple counter)라고도 부른다.

 

1. up_counter_async

: TFF를 활용하여 만들어지며, 각 FF는 clk의 negedge에서 변화하므로 count가 상승한다.

 

분주기로 상승한다.
TFF를 instance
초기화 한 번 해줌(안 해주면 z출력)
초기화 100ns 주고
원상복구한 뒤, 10,000ns 준다.

 

2. down_counter_async

리셋 한 번 주고, posedge일 때 다음 출력이 토글된다.

 

※ FPGA 에서는 비동기(async)를 사용하지 않는다.

Ex) up_counter_async

 

 1   0   1   0

↓  ↓  ↓  ↓  ------ [1] 에서 negedge가 발생함.

 0   0   0   0  

↓  ↓  ↓  ↓  ------ [2] 에서 토글이 발생한다.

 0   1   0   0

∴ 출력도 바뀌고, 타이밍도 꼬이므로 비동기는 사용하지 않는다.

 

 

[sync_counter]

 

1. up_counter_sync

 

모든 하위 bit가 1이 되었을 때, 다음 bit를 토글한다. 

즉, 하위 bit의 출력을 다 AND로 묶어서 다음 입력으로 사용한다.

 

 

2. down_counter_sync

down counter는 블럭 내 식만 바꿔주면 된다.

 

3. up_down_counter_sync

up_down에 따른 카운팅 변화
Up_down을 1,400ns 주기로 반복

 

<FPGA board로 출력>

 

카운터와 7_seg decoder를 Top_module로 묶음
버튼0으로 리셋 / 버튼1로 업다운 결정(xdc 파일에서 수정)
bitstream 생성해주고
program해준다.

    1) Down_count

 

Down_count(아무 버튼도 안 눌렀을 때)

    2) Up_count

 

Up_count(버튼1 눌렀을 때)

    3) Reset

 

Reset(버튼0 눌렀을때)

 

4. 동기식 BCD up_counter 

0~9
동기식 10진 up_counter

 

5. 동기식 BCD up_down_counter 

 

    1) Down_count

 

Down_count(버튼 안 눌렀을 때)

    2) Up_count

 

Up_count(버튼1 눌렀을 때)

6. Ring counter

Round log-in 방식

※ 다이나믹 구동

: com 단자에 1을 빠르게 주면, 4개 다 켜져 있는 것으로 보인다.

   cf) 잔상효과 : 1ms 마다 led를 키면, 다 켜진 것으로 보인다. 

- 장점

   : data port를 공통으로 써서 port를 절약할 수 있다. 

     → 동시에 키려면, 같은 값이 출력되어야 한다.

         각 CT별로 다른 값을 출력하기 위해 다이나믹 구동 사용

temp 없이 com으로만 만들어줘도 무관하다.

 

7. Ring counter를 활용하여 up_down_counter 출력하기

    <숲에서 나무로 분석해나가면 좀 편하다.>

   ① up_down_counter_12bit : 숫자 카운팅(0123456789abcdef)

   ② ring_count_fnd로 짧은 주기로 LED 하나씩 순차적 점멸시킴(잔상효과로 다 켜진걸로 보임)

   ③ {4'b0000,카운팅한 값[11:0]}를 4개로 쪼개서 com의 각 bit에 해당하는 hex_value[3:0]에 배정

        ---> 나름 encoding

   ④ decoder_7seg로 com의 각 자리에 해당하는 값을 디코딩하여 seg_7로 출력

       (0000_0000_0000_0011이 LED 상에 3으로 출력)

        ※ FND_4digit_cntr는 ②③④를 묶은 Top_module

전체적인 Schematic
clk : 0.5sec로 만드는 분주기
up_down_counter_12bit
FND_4digit_cntr

직사각형 : 다중비트레지스터

정사각형 : 단일비트레지스터

회로 수준에서 레지스터는 모든 클록 트리거 입력이 시스템 클록에 연결된 D형 플립플롭의 배열

원 : 이상적인 조합 논리 회로 연산자

(AND, OR같은 부울연산, 덧셈, 뺄셈과 같은 수학적 연산, 버스에서 비트를 추출하거나 신호를 더 큰 버스로 결합하는 연결 연산 및 조합 회로의 다른 유형의 동작 수행)

사다리꼴멀티플렉서, MUX

모든수의 입력을 수용할 수 있으며, 하나의 특정 입력 신호를 선택하여 MUX 출력으로 전달

 

up_down_counter_12bit
FND_4digit_cntr(②~④)
①~④을 다 묶은 최종적인 Top_module

 

ring_counter 활용한 u/d counter

 

슬슬 꼬이기 시작

728x90
반응형