- 시간을 지정하고 00:00 초가 되는 Down타이머입니다. 초기작성코드!
- 알람버튼 기능을 추가하기 전 코드내용입니다.
- 타이머의 버튼 동작을 레지스터로 선언하여 기능을 구현했다. 타이머의 시작버튼을 누르면
set모드,timer모드를f/f으로 토글시킨다 하지만 타이머가 0초가 되엇을때도 다시set모드로 돌아와야하기에 아래 조건을 줘서 이 또한 추가해줌.BCD 60 Down Counter
- 최종코드
- 지금까지 시간이 상승하는 업카운터를 만들었지만 이제는 시간을 다운 카운트하는 타이머를 만들어야한다. 그래서 기존에 있던
Loadable_counter_BCD_60를 다운 카운터로 만들었습니다.- 설명 : 기존의 업카운터와 다른점은
BCD_1이 9 이상이라면 0으로 초기화 시키고 9 이하의 값이라면 +1을 하여 값을 더해주고BCD_10이 5이상이라면 0으로 초기화하고 5 이하의 값이라면 +1을 합니다. 이 조건문을 0일때 9로 초기화시켜주며 그 이외의 값은 -1을 해 값을 줄여나갑니다. 이렇게되면 59초에서 00초 까지 다운 카운트하는 타이머 기능을 수행합니다. 이 코드로 실행을하게되면 타이머를 작동시키면 분과 초의주기가 따로 노는 것을 확인할 수 있습니다. 이유는Loadable_Down_counter_BCD_60 cur_sec(~)에서는 초의 주기가 바로 들어가서 문제가 없지만,Loadable_Down_counter_BCD_60 cur_min분의 다운 카운트에는.clk_time(clk_min)처럼clk_min이 들어간다. 이러면 초는 다운 카운트가 문제없이 실행되지만 분은clock_div_60 min_clk이 클럭 카운터에서 60주기를 세기 때문에 항상 60초가 지나야 카운트(주요한 원인!) 될 것이다.이 문제를 해결하기위해선 60주기 다운카운트를 만들어주면 되지만 번거롭기때문에 아래 사진처럼
dec_clk을 선언하고Loadable_Down_counter_BCD_60의 출력을reg dec_clk으로 선언해줍니다. 그리고 조건문을 다음과 같이 작성하면 초가 59초일때 dec_clk이 1이되고 그 이후에는 dec_clk이 0이 되면서 잠시 1이됩니다. 그러면 이 잠시 상승하고 하강하는 시점, 원사이클 펄스를Loadable_Down_counter_BCD_60 cur_min 의 .clk_time(dec_clk)에 이 원사이클 펄스를 할당해주면sec카운터가 59초가 되고 00초가 될때 하강엣지가 발생하여 min카운트의 값을 - 1 을 하게됩니다!