Verilog_FND Counter_Loadable & LapTime
Loadable Counter
목적 : watch 모드와 set모드의 카운터를 나누어서 버튼을 누르면 load가 가능하게끔 카운터를 만든다.
- 매 클락마다 load_enable신호를 확인하여 모드가 변경되었으면 BCD_1을 load_BCD1에 할당한다!

BCDCounter를 Loadable형식으로 만든다 이렇게하면 set과 watch모드는 서로다른 카운터를 사용한다. watch모드의 loadable카운터에는 load_BCD1,load_BCD10에 set모드의 sec, min을 연결해주고, Set모드의 loadable 카운터에는 load_BCD1,load_BCD10에 watch모드의 sec,min을 연결해준다. 이렇게 하면 enable신호를 받았을때 set모드에서 watch모드로 변경되었을때 set모드의 시간주기를 watch모드로 load하여 watch모드에서 set모드에서 설정한 시간주기로 timer를 시작할 것이다. 즉 카운터를 다르게해서 각자모드에 설정된 주기를 모드가 바뀌었을때 load하여 그 시간주기부터 timer가 시작된다. 모드가 바뀔때는 엣지디텍터로 원사이클 펄스를 감지해서 모드를 바꾼다! 이것이 상승엣지라면 watch모드가 활성화되고 하강엣지면 set모드가 활성화된다
- loadable_counter의 대략적인 회로도

- Loadable_counter_BCD_60

Laptime



lap버튼을 T F/F의 입력으로 받고 출력을 lap으로 하여 lap버튼이 눌렸을때 led가 들어오게 한다. lap이 눌렸을때 현재 타이머에 나오는 시간을 우리는 value의 값(min_10,min_1, sec_10, sec_1)을 fnd_Controller로 넘겨서 FND에 표시한다. 우리는 이 value의 값을 cur_time이라는 변수에 저장해둔다. 그러면 btn_lap = 1일때 즉, lap버튼이 눌렸을때 reg로 선언된 lap_time에 시간값을 저장해둔 cur_time의 값을 할당한다. 이렇게 되면 lap버튼을 눌렀을 때 시간이 저장되고 value가 lap이 눌렸을때는 lap_time이 value로 들어가서 FND에 lap_time에 저장된 타이머 값이 나오게 되고 lap버튼이 눌리지 않았으때는 cur_time에 카운트되는 카운트 값이 FND에 표시된다. 이때 cur_time에는 lap버튼이 눌렸다고 주기가 멈추지 않기 때문에 계속 Timer가 진행되며 이 타이머 값을 FND에 표시한다.
lap버튼을 누르고 클리어를 해주는 기능또한 추가했다. 원래 reset버튼이 존재하지만 reset버튼은 시스템을 초기화하는 기능이므로 clear기능을 따로추가해준다! clear버튼을 누르면 lap버튼을 누르고 lap_time에 저장된 시간을 FND에 표시해주고 클리어 버튼을 누르면 초기화가 된다. 하지만 이렇게되면 clock은 초기화가 되지않고 BCD카운터만 초기화되기 때문에 60주기 clock_div_60 또한 초기화 시켜줘야한다. 그렇다면 clock_div_60 의 리셋 에는 reset_p와 btn_clear 두개를 or연산 시켜 mux로 만든 reset_start를 연결시켜준다면 clear버튼을 누르면 60주기 clock_div_60까지 초기화 될 것이다! 

- 이전엔
lap버튼을 누르면 T F/F의 입력으로 들어가 lap기능을 실행했습니다. 하지만 위에서 작성한 clear버튼을 실행시키면 clear가 되면서 스탑워치 카운터도 멈추지만 lap기능을 그대로 on 되어 있습니다. 이를 해결하기위해 T F/F의 인스턴스를 사용하는 것이 아닌 T F/F의 기능을 가져와 reset_p가 눌렸을때 lap = 0으로 lap버튼이 눌리면 lap을 반전시킵니다. 이렇게되면 사진처럼 lap의 값에따라 lap_time이 들어가거가, cur_time이 들어가는 기능을 그대로 사용할 수 있습니다. 그리고 clear가 눌렸을때 lap = 0 이되면서 lap도 기능이 off됩니다.