전공지식정리/디지털시스템설계

VHDL12. 주파수 분주기, 시계용 카운터, 디지털 시계 회로,

TimeSave 2020. 12. 8. 23:27

1. frequency divider(=주파수 분주)
; 입력 클럭을 이용하여 이보다 낮은 클럭을 생성하는 것.
- 디지털 로직으로 구현 가능
- 주파수 체배기(frequency multiplier)의 경우는 PLL과 같은 아날로그 방식을 이용해야 함

1.1 종류
2^N 분주기 ; 일반화된 형태로 설계 가능, 예) 2, 4, 8, 16, 32, 64 분주기
2N 분주기   ;각 분주비 별로 설계 가능, 예) 6, 10, 60, 100 분주기
 N 분주기     ; N이 홀수일 경우에는 duty비 50%로는 디지털 방식으로 설계 불가능

1.2  VHDL 구현 (N만 바뀐 것을 유심히 보자)

- 2분주 회로

2분주 회로

2분주 회로

- 3분주 회로

3분주 회로

3분주 회로

- 16 분주 회로

16분주 회로


- 2^N 분주회로

2^N 분주회로

2N분주 회로의 시뮬레이션 파형 예(N = 4)

- 100분주 회로

100분주 회로

100분주 회로의 시뮬레이션 파형


2. 시계 카운터
; 초, 분, 시간의 각 단위마다 카운터를 만들어서 돌려야 한다.

2.1 초 단위 카운터

2.1.1 요구사항
; 10Hz의 클럭 입력을 이용한 초단위 카운터 설계
- 입력 : 10Hz 클럭, 리셋 신호
- 출력 : 현재의 초 카운트 값, 분 증가 신호
- 고려 사항
=> 1Hz의 제어 신호 생성 : second_pulse_gen process에서 구현
=> 현재의 초 카운트 값 생성 : second_count signal 이용
=> 분 증가 신호 : 59초에서 0초 되는 순간 펄스 출력 : min_increase 출력

2.1.2 VHDL 로직 구현

초 단위 카운터

초 단위 카운터

초 단위 카운터

2.1.3 testbench ; 추후 작성
2.1.4 simulation

초 단위 카운터


2.2 분 단위 카운터
2.2.1 요구사항
; 10Hz의 클럭 입력을 이용한 분단위 카운터 설계
- 입력
       => 10Hz 클럭, 리셋 신호
       => 현재의 초 카운트 값, 분 증가 신호
- 출력
       => 현재의 초 카운트 값, 현재의 분 카운트 값
       => 시간 증가 신호
- 고려 사항
       => 현재의 초 카운트 값을 한 클럭 지연 시켜 출력
       => 현재의 분 카운트 값 출력
       => 시간 증가 신호 : 59분 59초에서 0분 0초 되는 순간 펄스 출력

2.2.2 VHDL 로직 구현

분 단위 카운터

분 단위 카운터

2.2.3 testbench ; 추후 작성
2.2.4 simulation

분 단위 카운터

분 단위 카운터

2.3 시간 단위 카운터
2.3.1 요구사항
; 10Hz의 클럭 입력을 이용한 시간단위 카운터 설계

- 입력
      => 10Hz 클럭, 리셋 신호
      => 현재의 초 카운트 값, 분 카운트 값, 시간 증가 신호

- 출력
      => 현재의 초 카운트 값, 현재의 분 카운트 값 , 현재의 시간 카운트 값

- 고려 사항
      => 현재의 초, 분 카운트 값을 한 클럭 지연 시켜 출력
      => 23시 59분 59초에서 0시 0분 0초로 변경
2.3.2 VHDL 로직 구현

시간 단위 카운터

시간 단위 카운터


2.3.3 testbench;추후 작성
2.3.4 simulation

시간 단위 카운터

시간 단위 카운터



3. 디지털 시계
; 위에서 만든 단위 카운터(초,분,시간)에 디스플레이 등의 모듈을 섞어서 디지털 시계를 구현해 보자.

디지털 시계

- 구성 블록
button interface(=버튼 인터페이스) : DC_BI
time preset(=시각 설정 모듈) : DC_TP
clock counter(=시계용 카운터) : DC_CC
display selector(=디스플레이 선택부): DC_DS

3.1 요구조건

디지털 시계 블록도

- 동작 모드
        =>  mode 0 : 시 설정
        =>   mode 1 : 분 설정
        =>   mode 2 : 초 설정
        =>   mode 3 : 시각 디스플레이 : 시, 분, 초
- 입력 신호
        =>   mode 선택 신호 : mode_button
        =>   시, 분, 초 증가 신호 : up_button
        =>   10Hz 클럭 신호 : clk, 리셋 신호 : rst_n
- 출력 신호
        =>   시 정보 : hour(4 downto 0)
        =>   분 정보 : minute(5 downto 0)
        =>   초 정보 : second(5 downto 0)

3.2 Button interface(버튼 인터페이스) 구현
3.2.1 요구사항
- mode_button 신호를 입력 받아서 2 비트의 mode 신호를 출력
- up_button 신호를 입력 받아서 10Hz로 동기되는 펄스 형태의 up 신호를 출력
        => 각 모드에서 시, 분, 초 정보의 조정 신호
- 입력 신호
        => mode_button, up_button
- 출력 신호
        => mode(1 downto 0), up_pulse

3.2.2 VHDL 로직 구현

버튼 인터페이스 VHDL코드

버튼 인터페이스 VHDL코드

버튼 인터페이스 VHDL코드

3.2.3 testbench ; 추후작성
3.2.4 simulation

버튼 인터페이스


3.3 Time preset(시각 설정) 모듈

3.3.1 요구사항
- 설정된 현재의 시각을 제공
- 설정값이 유효할 때 시계 회로에 인가하기 위한 set_pulse 신호를 제공
- 입력 신호
        => mode(1 downto 0)
        => up_pulse
- 출력 신호
        => ps_hour(4 downto 0) : preset hour information
        => ps_minute(5 downto 0 ) : preset minute information
        => ps_second(5 downto 0 ) : preset second information
        => set_pulse : preset current time information

3.3.2 VHDL 로직 구현

선언부

hour gen

minute_gen

second_gen

pulse_gen

3.3.3 testbench ; 추후 작성
3.3.4 simulation

Time preset

3.4 clock_counter(시계용 카운터) 모듈

3.4.1 요구사항
- set_pulse에 의해서 현재 입력되는 시각을 설정
- 이후 계속적인 시각 정보를 제공
- 13.2절의 시계용 카운터 설계와 기본 로직 일치
- 현재값 설정 기능만 추가 필요
- 내부 블록
        => 초 정보 발생부
        => 분 정보 발생부
        => 시 정보 발생부

3.4.2 VHDL 로직 구현
- 초 정보 발생부

초 정보 발생부

- 현재값 설정 기능 추가된 초 정보 발생부

현재값 설정 기능 추가된 초 정보 발생부

3.4.3 testbench
3.4.4 simulation


3.5 Display selector(디스플레이 선택) 모듈

3.5.1 요구사항
- 시각 설정부에서 제공하는 시각 설정값과 시계용 카운터 부에서 제공하는 현재의 시각 정보를 선택적으로 디스플레이
- 0 ~ 2번 모드 : 시, 분, 초 시각을 설정
- 3번 모드 : 현재의 시각을 디스플레이
- 입력 신호
        => mode(1 downto 0)
        => 설정된 초, 분, 시 정보, 현재의 초, 분, 시 정보
- 출력 신호
        => hour(4 downto 0)
        => minute(5 downto 0)
        => second(5 downto 0)

3.5.2 VHDL 로직 구현

디스플레이 선택부의 VHDL

3.5.3 Simulation

디스플레이 선택부의 시뮬레이션 파형

4. 입출력 타이밍도

디지털시계 회로의 입출력 타이밍도

모드 3 변경 시의 입출력 타이밍도

출처 :  http://dasan.sejong.ac.kr/~dihan/vhdl.htm