Presentation is loading. Please wait.

Presentation is loading. Please wait.

VHDL 디지털시계 2.

Similar presentations


Presentation on theme: "VHDL 디지털시계 2."— Presentation transcript:

1 VHDL 디지털시계 2

2 디지털시계 회로 설계 디지털시계 로직 동작 모드 입력 신호 출력 신호 mode 0 : 시 설정 mode 1 : 분 설정
mode 선택 신호 : mode_button 시, 분, 초 증가 신호 : up_button 10Hz 클럭 신호 : clk, 리셋 신호 : rst_n 출력 신호 시 정보 : hour(4 downto 0) 분 정보 : minute(5 downto 0) 초 정보 : second(5 downto 0)

3 디지털시계 회로 설계 디지털시계 구성 블록 button interface : DC_BI (모드설정)
time preset : DC_TP (현재시각설정) clock counter : DC_CC (초,분,시 카운트) display selector : DC_DS (디스플레이) a) button interface : DC_BI (Digital Clock, Button Interface) b) time preset : DC_TP (Digital Clock, Time Preset) c) clock counter : DC_CC (Digital Clock, Clock Counter) d) display selector : DC_DS (Digital Clock, Display Selector)

4 디지털시계 회로 설계 디지털시계 블록도 Display Selector Button Interface Time Preset
mode_button up_button Clock Counter 10Hz clk rst_n Time Preset Display Selector up_pulse mode time_info set_pulse Button Interface

5 디지털시계 회로 설계 버튼 인터페이스 mode_button 신호를 입력 받아서 2 비트의 mode 신호를 출력
up_button 신호를 입력 받아서 10Hz로 동기되는 펄스 형태의 up 신호를 출력 각 모드에서 시, 분, 초 정보를 조정하는 신호 입력 신호 mode_button, up_button 출력 신호 mode(1 downto 0), up_pulse

6 디지털시계 회로 설계 버튼 인터페이스부의 VHDL 구현 LIBRARY ieee;
USE ieee.std_logic_1164.ALL; --use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity dc_bi is port( mode_button : in std_logic; up_button : in std_logic; mode : out std_logic_vector(1 downto 0); up_pulse : out std_logic; rst_n : in std_logic; clk : in std_logic); end dc_bi; 입출력포트설정

7 디지털시계 회로 설계 버튼 인터페이스부의 VHDL 구현 architecture behavioral of dc_bi is
signal mode_button_1d, mode_button_2d : std_logic; signal mb_rpulse : std_logic; signal up_button_1d , up_button_2d : std_logic; signal dc_mode : std_logic_vector(1 downto 0); begin external_intf_proc: process (rst_n,clk) if (rst_n = '0') then mode_button_1d <= '0'; up_button_1d <= '0'; elsif (clk'event and clk = '1') then mode_button_1d <= mode_button; up_button_1d <= up_button; end if; end process; Reset: rst_n = ‘0’ 일때 모드, 업버튼 동작 없음 상승엣지에서 모드 버튼, 업버튼 입력을 받아 각각의 버튼 1에 저장

8 디지털시계 회로 설계 버튼 인터페이스의 VHDL 구현 - 펄스출력 begin if (rst_n = '0') then
pulse_gen: process (rst_n,clk) begin if (rst_n = '0') then mode_button_2d <= '0'; up_button_2d <= '0'; up_pulse <= '0'; elsif (clk'event and clk = '1') then mode_button_2d <= mode_button_1d; up_button_2d <= up_button_1d; up_pulse <= up_button_1d and (not up_button_2d); end if; end process; mb_rpulse <= mode_button_1d and (not mode_button_2d); Reset: rst_n = ‘0’ 일때 버튼 2와 Up_pulse 출력 없음 버튼 1,2 의 delay 차이를 이용하여 업_펄스 및 모드 체인지용 펄스 생성

9 디지털시계 회로 설계 버튼 인터페이스의 VHDL 구현 – mode 출력 begin if (rst_n = '0') then
digital_clock_mode_gen: process (rst_n,clk) begin if (rst_n = '0') then dc_mode <= (others => '0'); elsif (clk'event and clk = '1') then if mb_rpulse = '1' then dc_mode <= dc_mode + 1; end if; end process; mode(1 downto 0) <= dc_mode(1 downto 0); end behavioral; 모드 체인지를 위한 펄스가 1일때 마다 모드를 하나씩 증가시킴

10 디지털시계 회로 설계 버튼 인터페이스의 시뮬레이션 파형 예 Mode button 누름 에 따른 모드 업 버튼 변화
UP 버튼 누름에 따른 Up_pulse의 발생

11 디지털시계 회로 설계 시각 설정부 설정된 현재의 시각(Time)을 제공
현재 시각의 설정값이 유효할 때 시계 회로(카운터)에 인가하기 위한 set_pulse 신호를 제공 입력 신호 mode(1 downto 0) : 4개 모드에 대한 정보신호 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 (현재의 시간을 알리기 위한 펄스)

12 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – 엔티티 부분 LIBRARY ieee;
USE ieee.std_logic_1164.ALL; --use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity dc_tp is port(mode : in std_logic_vector(1 downto 0); up_pulse : in std_logic; ps_hour : out std_logic_vector(4 downto 0); ps_minute : out std_logic_vector(5 downto 0); ps_second : out std_logic_vector(5 downto 0); set_pulse : out std_logic; rst_n : in std_logic; clk : in std_logic); end dc_tp; 입력신호 설정 출력신호 설정 동기신호(clk) 및 리셋신호 설정

13 디지털시계 회로 설계 시각 설정부의 VHDL 구현 - 선언부 architecture behavioral of dc_tp is
signal adj_hour : std_logic_vector(4 downto 0); signal adj_minute : std_logic_vector(5 downto 0); signal adj_second : std_logic_vector(5 downto 0); signal mode_1d : std_logic_vector(1 downto 0); signal internal_set : std_logic; constant HOUR_MAX: integer := 23; constant MINUTE_MAX: integer := 59; constant SECOND_MAX: integer := 59; begin 내부 설정 신호 시, 분, 초의 최대값 설정

14 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – hour_gen
mode 0 : 시 설정 mode 1 : 분 설정 mode 2 : 초 설정 mode 3 : 시각 디스플레이 (시, 분, 초) 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – hour_gen ps_hour_gen: process (rst_n,clk) begin if (rst_n = '0') then adj_hour <= (others => '0'); elsif (clk'event and clk = '1') then if internal_set = '1' then elsif mode = "00" and up_pulse = '1' then if adj_hour < HOUR_MAX then adj_hour <= adj_hour + 1; else adj_hour <= (others => '0'); end if; end if; end process; ps_hour <= adj_hour; 모드 0에서 시각 설정 up_pulse가 1로 들어오면 시간을 1시간씩 증가시킴 출력

15 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – minute_gen
mode 0 : 시 설정 mode 1 : 분 설정 mode 2 : 초 설정 mode 3 : 시각 디스플레이 (시, 분, 초) 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – minute_gen ps_minute_gen: process (rst_n,clk) begin if (rst_n = '0') then adj_minute <= (others => '0'); elsif (clk'event and clk = '1') then if internal_set = '1' then elsif mode = "01" and up_pulse = '1' then if adj_minute < MINUTE_MAX then adj_minute <= adj_minute + 1; else adj_minute <= (others => '0'); end if; end if; end process; ps_minute <= adj_minute; 모드 1에서 시각 설정 up_pulse가 1로 들어오면 분을 1시간씩 증가시킴 출력

16 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – second_gen
mode 0 : 시 설정 mode 1 : 분 설정 mode 2 : 초 설정 mode 3 : 시각 디스플레이 (시, 분, 초) 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – second_gen ps_second_gen: process (rst_n,clk) begin if (rst_n = '0') then adj_second <= (others => '0'); elsif (clk'event and clk = '1') then if internal_set = '1' then elsif mode = "10" and up_pulse = '1' then if adj_second < MINUTE_MAX then adj_second <= adj_second + 1; else adj_second <= (others => '0'); end if; end if; end process; ps_second <= adj_second; 모드 2에서 시각 설정 up_pulse가 1로 들어오면 초를 1초씩 증가시킴 출력

17 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – pulse_gen
mode 0 : 시 설정 mode 1 : 분 설정 mode 2 : 초 설정 mode 3 : 시각 디스플레이 (시, 분, 초) 디지털시계 회로 설계 시각 설정부의 VHDL 구현 – pulse_gen set_pulse_gen: process (rst_n,clk) begin if (rst_n = '0') then mode_1d <= (others => '0'); internal_set <= '0'; elsif (clk'event and clk = '1') then mode_1d <= mode; if mode = "11" and mode_1d = "10" then internal_set <= '1'; else end if; end process; set_pulse <= internal_set; end behavioral; 모드가 2->3로 변경될 시점 을 체크하여 Internal_set=>set_pulse 값을 1으로 주는 구문 출력

18 모드2->3 변경시의 set_pulse 생성
디지털시계 회로 설계 모드2->3 변경시의 set_pulse 생성 시각 설정부의 시뮬레이션 파형 예 시간의 변경 분의 변경 초의 변경

19 디지털시계 회로 설계 시계용 카운터 set_pulse에 의해서 현재 입력되는 시각을 설정
이후 클럭의 증가에 따라 증가되는 계속적인 초,분,시의 시각 정보를 제공 앞절의 분주기/카운터 챕터에서 다루었던 카운터 설계와 시계용 카운터는 기본 로직이 일치 현재값(present) 설정 기능만 추가 필요 내부 블록 초 정보 발생부 분 정보 발생부 시 정보 발생부

20 디지털시계 회로 설계 기존에 다루었던 초 정보 발생부의 문장 현재값 설정 기능 추가된 초 정보 발생부의 문장
if second_pulse = '1' then if second_count < SECOND_CNT then second_count <= second_count + 1; else second_count <= (others => '0'); end if; end if; if set_pulse = '1' then second_count <= ps_second; elsif second_pulse = '1' then if second_count < SECOND_CNT then second_count <= second_count + 1; else second_count <= (others => '0'); end if; end if; 시각설정부에서 설정된 초의 정보 ps_second값을 second_count에 저장하고 클럭에 따라 카운터 증가 (시계의 초 증가)

21 디지털시계 회로 설계 기존에 다루었던 분 정보 및 시간 정보 발생부의 문장도 동일하게 수정하면 됨(아래순서대로 분 정보, 시간 정보). if set_pulse = '1' then minute_count <= ps_minute; -- setting the preset time information. elsif min_increase = '1' then if minute_count < MINUTE_MAX then minute_count <= minute_count + 1; else minute_count <= (others => '0'); end if; if set_pulse = '1' then hour_count <= ps_hour; -- setting the preset time information. elsif hour_increase = '1' then if hour_count < HOUR_MAX then hour_count <= hour_count + 1; else hour_count <= (others => '0'); end if;

22 디지털시계 회로 설계 출력에서 second_count, minute_count, hour_count 는
cur_second, cur_minute, cur_hour로 이름 변경하여 출력 됨에 유의 (실제 예제 코드에서). 즉 cur_second, cur_minute, cur_hour는 카운터에 의해 증가되고 있는 현재의 시각의 초, 분, 시간을 의미함.

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

24 디지털시계 회로 설계 디스플레이 선택부의 VHDL 구현 architecture behavior of dc_ds is begin
display_selection: process (rst_n,clk) if (rst_n = '0') then hour <= (others => '0'); minute <= (others => '0'); second <= (others => '0'); elsif (clk'event and clk = '1') then if mode = "11" then hour <= cur_hour; minute <= cur_minute; second <= cur_second; else hour <= ps_hour; minute <= ps_minute; second <= ps_second; end if; end process; end behavior; 모드 3에서 현재의 시각 초, 분, 시간을 표시 모드 0-2에서 초, 분, 시간을 표시

25 디지털시계 회로 설계 디스플레이 선택부의 시뮬레이션 파형 예 모드 0-2에서 초,분,시간 설정 모드 3에서 현재시각 표시

26 Wave 화면으로의 object 선택 모두선택하여 to wave tb_dc_cc_top 밑의 U_dc_cc_top 선택

27 소스코드 및 예제 설명 Digitalwatch 폴더를 altera>13.1> 디렉토리에 복사
1) tb_dc_bi : 버튼인터페이스부 구문과 테스트벤치 2) tb_dc_cc_hour : 카운터 시간 발생부 및 테스트벤치 3) tb_dc_cc_min : 카운터 분 발생부 및 테스트벤치 4) tb_dc_cc_sec : 카운터 초 발생부 및 테스트벤치 5) tb_dc_cc_top : 카운터 시,분,초 통합 발생부 및 테스트벤치 (시,분,초 발생부를 콤포넌트문으로 처리) 6) tb_dc_ds : 디스플레이부 및 테스트 벤치 7) tb_dc_tp : 현재시각 설정부 및 테스트 벤치 8) tb_dc_top : 전체시계 통합부 (각부분을 컴포넌트처리) 및 테스트 벤치 예제 : 각 부분의 소스코드를 개별적으로 컴파일 후 시뮬레이션 하여 출력된 시뮬레이션 결과를 보고서로 제출 1), 2), 3), 4), 5), 7), 6), 8)번 순으로 시뮬레이션. 5)번을 할 때는 2),3),4)번 파일을 5)번 파일과 같이 add 하고 같이 컴파일 후 시뮬레이션 8)번을 할 때는 1)~8) 까지의 모든 파일을 같이 add 하고 같이 컴파일 후 시뮬레이션 하세요.

28 디지털시계 회로 설계 디지털시계 회로의 입출력 타이밍도 (tb_dc_top)


Download ppt "VHDL 디지털시계 2."

Similar presentations


Ads by Google