VHDL 디지털시계 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)
디지털시계 회로 설계 디지털시계 구성 블록 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)
디지털시계 회로 설계 디지털시계 블록도 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
디지털시계 회로 설계 버튼 인터페이스 mode_button 신호를 입력 받아서 2 비트의 mode 신호를 출력 up_button 신호를 입력 받아서 10Hz로 동기되는 펄스 형태의 up 신호를 출력 각 모드에서 시, 분, 초 정보를 조정하는 신호 입력 신호 mode_button, up_button 출력 신호 mode(1 downto 0), up_pulse
디지털시계 회로 설계 버튼 인터페이스부의 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; 입출력포트설정
디지털시계 회로 설계 버튼 인터페이스부의 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에 저장
디지털시계 회로 설계 버튼 인터페이스의 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 차이를 이용하여 업_펄스 및 모드 체인지용 펄스 생성
디지털시계 회로 설계 버튼 인터페이스의 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일때 마다 모드를 하나씩 증가시킴
디지털시계 회로 설계 버튼 인터페이스의 시뮬레이션 파형 예 Mode button 누름 에 따른 모드 업 버튼 변화 UP 버튼 누름에 따른 Up_pulse의 발생
디지털시계 회로 설계 시각 설정부 설정된 현재의 시각(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 (현재의 시간을 알리기 위한 펄스)
디지털시계 회로 설계 시각 설정부의 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) 및 리셋신호 설정
디지털시계 회로 설계 시각 설정부의 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 내부 설정 신호 시, 분, 초의 최대값 설정
디지털시계 회로 설계 시각 설정부의 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시간씩 증가시킴 출력
디지털시계 회로 설계 시각 설정부의 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시간씩 증가시킴 출력
디지털시계 회로 설계 시각 설정부의 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초씩 증가시킴 출력
디지털시계 회로 설계 시각 설정부의 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으로 주는 구문 출력
모드2->3 변경시의 set_pulse 생성 디지털시계 회로 설계 모드2->3 변경시의 set_pulse 생성 시각 설정부의 시뮬레이션 파형 예 시간의 변경 분의 변경 초의 변경
디지털시계 회로 설계 시계용 카운터 set_pulse에 의해서 현재 입력되는 시각을 설정 이후 클럭의 증가에 따라 증가되는 계속적인 초,분,시의 시각 정보를 제공 앞절의 분주기/카운터 챕터에서 다루었던 카운터 설계와 시계용 카운터는 기본 로직이 일치 현재값(present) 설정 기능만 추가 필요 내부 블록 초 정보 발생부 분 정보 발생부 시 정보 발생부
디지털시계 회로 설계 기존에 다루었던 초 정보 발생부의 문장 현재값 설정 기능 추가된 초 정보 발생부의 문장 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에 저장하고 클럭에 따라 카운터 증가 (시계의 초 증가)
디지털시계 회로 설계 기존에 다루었던 분 정보 및 시간 정보 발생부의 문장도 동일하게 수정하면 됨(아래순서대로 분 정보, 시간 정보). 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;
디지털시계 회로 설계 출력에서 second_count, minute_count, hour_count 는 cur_second, cur_minute, cur_hour로 이름 변경하여 출력 됨에 유의 (실제 예제 코드에서). 즉 cur_second, cur_minute, cur_hour는 카운터에 의해 증가되고 있는 현재의 시각의 초, 분, 시간을 의미함.
디지털시계 회로 설계 디스플레이 선택부 시각 설정부에서 제공하는 시각 설정값(설정시각) 혹은 시계용 카운터부에서 제공하는 현재의 시각 정보를 선택적으로 디스플레이 0 ~ 2번 모드 : 시, 분, 초 시각을 설정 3번 모드 : 현재의 시각(시,분,초)을 디스플레이 입력 신호 mode(1 downto 0) 설정된 초, 분, 시 정보, 현재의 초, 분, 시 정보 출력 신호 hour(4 downto 0) minute(5 downto 0) second(5 downto 0)
디지털시계 회로 설계 디스플레이 선택부의 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에서 초, 분, 시간을 표시
디지털시계 회로 설계 디스플레이 선택부의 시뮬레이션 파형 예 모드 0-2에서 초,분,시간 설정 모드 3에서 현재시각 표시
Wave 화면으로의 object 선택 모두선택하여 to wave tb_dc_cc_top 밑의 U_dc_cc_top 선택
소스코드 및 예제 설명 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 하고 같이 컴파일 후 시뮬레이션 하세요.
디지털시계 회로 설계 디지털시계 회로의 입출력 타이밍도 (tb_dc_top)