Verilog_Timer(DownCounter)

공이지·2024년 7월 20일
  • 시간을 지정하고 00:00 초가 되는 Down타이머입니다. 초기작성코드!
  • 알람버튼 기능을 추가하기 전 코드내용입니다.
  • 타이머의 버튼 동작을 레지스터로 선언하여 기능을 구현했다. 타이머의 시작버튼을 누르면 set모드 ,timer모드f/f으로 토글시킨다 하지만 타이머가 0초가 되엇을때도 다시 set모드 로 돌아와야하기에 아래 조건을 줘서 이 또한 추가해줌.

BCD 60 Down Counter

  • 최종코드
  • 지금까지 시간이 상승하는 업카운터를 만들었지만 이제는 시간을 다운 카운트하는 타이머를 만들어야한다. 그래서 기존에 있던 Loadable_counter_BCD_60다운 카운터로 만들었습니다.
  • 설명 : 기존의 업카운터와 다른점은 BCD_19 이상이라면 0으로 초기화 시키고 9 이하의 값이라면 +1을 하여 값을 더해주고 BCD_105이상이라면 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 을 하게됩니다!
profile
화이팅..!

0개의 댓글