11.dsd alarmed clock

19
- 1 - 제출일 : 2011.10.28 [Team Project] Alarmed Digital Clock 구현 5조 20800204 20800577

description

 

Transcript of 11.dsd alarmed clock

Page 1: 11.dsd alarmed clock

- 1 -

제출일 : 2011.10.28

[Team Project]

Alarmed Digital Clock 구현

5조

20800204

노 동 기

20800577

장 호 상

Page 2: 11.dsd alarmed clock

- 2 -

- 목 차 -

1. 설계 주제 ------------------------------------- pg.3

2. 설계 사양 ------------------------------------- pg.3

3. 상세기능 설명 ------------------------------------- pg.4

4. 설계 과정 Top Schematic ----------------------- pg.5

① Core_alarmclk

a. time_count ------------------------------------- pg.6

b. alarm_cnt ------------------------------------- pg.8

c. controller ------------------------------------- pg.9

d. comparator ------------------------------------- pg.11

e. led_output ------------------------------------- pg.12

f. Etc ------------------------------------- pg.13

존슨카운터 , dss4_drv, mux_8bit_2, mux_4bit_2

② debounce_pulse ------------------------------------ pg.14

③ CLK Controller ------------------------------------ pg.14

④ clk_div100 ------------------------------------- pg.15

⑤ 전체적인 흐름 ------------------------------------- pg.16

5. 설계 검증 ------------------------------------- pg.17

6. 오류 및 수정 ------------------------------------- pg.17

7. 설계를 마치고.. ------------------------------------- pg.18

8. 역할 분담 ------------------------------------- pg.19

Page 3: 11.dsd alarmed clock

- 3 -

1. 설계 주제

Xilinx ISE Design Suite 13.2 를 이용하여 Alarmed digital clock을 구현해 보고 NEXYS2

board 에 구현된 프로그램을 올려본다.

2. 설계 사양

① 시, 분, 초까지 표시 가능

- 24시간 형태로 표시 ex)14:24:12

② 시간을 조정할 수 있게 설계

③ 알람 기능

- 알람을 시, 분 단위까지 설정할 수 있도록 설계

- 알람 설정한 시간이 되면 신호를 줄 수 있게 설계

④ 입력단자

모드설정(MODE) : BTN2

시,분 설정(SEL): BTN1

숫자 증가(INC): BTN0

Reset(RST): BTN3

System Clock 50MHz(CLK)

CLK주기 조절키 : SW1, SW0

⑤ 출력단자

분,초: 4-digit 7-segment (DISP1)

시: LED (LD5~LD4, LD3~LD0)

Alarm 표시: LED 사용 (LD7~LD0)

현재 동작 모드 표시: LED 2개

(LD7~LD6, 00:시계모드, 01: 시간설정모드, 10: 알람설정모드, 11: 알람모드)

Page 4: 11.dsd alarmed clock

- 4 -

3. 상세기능 설명

① Reset 기능

RST 키를 누르면 무조건 시계모드로 동작하고, 현재 시간과 alarm 시간은 00:00:00 가 됨.

② 모드 설정

MODE키를 누를 때마다 “시계모드”→“시간 설정모드”→“알람시간 설정모드”→

“시계모드”로 설정이 바뀜

③ 각 모드 설명

a. "시계모드"

정상적으로 시계가 동작하는 모드

b. "시간 설정모드”와 “알람시간 설정모드”

SEL을 눌러 설정할 단위 선택(시, 분, 초(시간 설정 모드만 지원))

처음에는 시, SEL를 누를 때마다 시 → 분 →초 로 바뀜.

INC를 누르면 해당 시간/분 증가

c."알람모드" : 따로 State가 있지 않고 알람을 설정하면 알람모드가 됨.

알람 시간은 시/분까지만 설정

현재 시간과 알람 설정 시간이 일치하면 8개의 LED를 사용하여 알람 표시

(LED에는 Johnson counter를 이용하여 출력)

④ CLK 조절키(SW1, SW0)

테스트를 위해 CLK을 빠르게 조정할 수 있는 키를 만들어 두었다.

Page 5: 11.dsd alarmed clock

- 5 -

4. 설계 과정

Top Schematic

① Core_alarmclk

Page 6: 11.dsd alarmed clock

- 6 -

a. time_count : 시간을 count 하는 Block

“hour” symbol은 시 단위를 count 하는 block 이며, mod24(0~23까지 count 하는 counter)을

이용해 만들었다. CE 단자에 MUX를 이용해 time_set이 0일 때는 hren(hour enable)이 1일 때, count 되

도록 하였다. time_set이 1일 때(시간 조정 모드일 때)는 inc와 hr_sel이 모두 1일 때 count 되게 설계

하였다.

"mod_60" symbol은 분 단위를 count 하는 block이며 CD4RE(10진count)와 mod6(0~5까지 count

하는 counter)를 이용해 만들었다. CE 단자에 MUX를 이용해 time_set이 0일 때는 min_en이 1일 때,

count 되도록 하였다. time_set이 1일 때(시간 조정 모드일 때)는 inc와 min_sel이 모두 1일 때 count

되게 설계하였다.

core_alarmclk 안의 time_count 내부 구조

hour 내부 구조

mod_60 내부구조

Page 7: 11.dsd alarmed clock

- 7 -

"mod_60s" symbol은 초를 count 하는 block이며 CD4RE(10진count)와 mod6(0~5까지 count 하는

counter)를 이용해 만들었다. CE 단자에 MUX를 이용해 time_set이 0일 때는 1hz clk에 맞게 count 되게

하였다. time_set이 1일 때(시간 조정 모드일 때)는 inc와 sec_sel이 모두 1일 때 count 되게 설계하였

다.

mod_60s 내부구조

Page 8: 11.dsd alarmed clock

- 8 -

b. alarm_cnt : 알람시간을 설정하고 설정한 시간을 저장해 놓는 block

“alarm_hr” symbol은 알람의 시 단위를 count 하는 block 이며, mod24(0~23까지 count 하는

counter)을 이용해 만들었다. CE 단자에 3-input AND gate를 이용, alarm_set, hr_sel, inc 가 모두 1

일 때 count 되게 설계하였다.

“alarm_min” symbol은 알람의 분 단위를 count 하는 block 이며,CD4RE(10진count)와

mod6(0~5까지 count 하는 counter)를 이용해 만들었다. CE 단자에 3-input AND gate를 이용,

alarm_set, min_sel, inc 가 모두 1일 때 count 되게 설계하였다.

core_alarmclk 안의 alarm_cnt 내부 구조

alarm_hr 내부구조

alarm_min 내부구조

Page 9: 11.dsd alarmed clock

- 9 -

c. controller : 동작 모드(시계, 시간설정, 알람 설정)를 결정하고, 시간설정과 알람 설정 모드에서는

시, 분, 초 중 현재 변경하고자 하는 부분을 인식한다.

FSM을 작성하여, Verilog로 구현하였다.

모드를 설정하는 "mode_ctrl"과 시, 분, 초 중 변경하고자 하는 부분을 알려주는

“sel_ctrl”로 나눠서 작성했다.

위의 State diagram을 verilog로 작성한 결과이다. S00(clk_mod)로 시작하여, mode_key가 1이

되면, S10(time_set)으로 상태가 변한다. S10이 된 상태에서 다시 mode_key가 1이 되면,

S20(alarm_set)으로 변하다. S20이 된 상태에서 mode_key가 1이 되면, 다시 시작점(S00)로 돌아가며,

mode_key가 0일 때는 상태가 변하지 않는다.

core_alarmclk 안의 controller 내부 구조

mode_ctrl

Page 10: 11.dsd alarmed clock

- 10 -

위의 State diagram을 verilog로 작성한 결과이다. S0에서 시작하고, 어떤 sate든지 clk_mod가

1이면 S0로 돌아가 대기한다. SO에서 clk_mod가 0이면 S1(hr_sel)로 이동한다. S1에서는 sel가 1이면

S2(min_sel)로, 0이면 제자리에 머문다. S2에서는 sel가 1이고 alarm_set이 1이면 S1(hr_sel)로 이동하

고, sel가 1이고 time_set이 1이면 S3(sec_sel)로 이동하고 나머지 경우엔 제자리에 머문다.

S3에서는 sel가 1이거나 mode_key가 1이면 S1(hr_sel)으로 이동하고 나머지 경우엔 제자리에 머문다.

sel_ctrl

S1

S2S3

S0

Page 11: 11.dsd alarmed clock

- 11 -

d. comparator : 알람을 설정했을 때, 알람 설정된 시간과 시계의 시간을 비교해서 같으면 "EQ"신호를

보내 주는 Block 이다.

시의 10자리 비교

시의 1자리 비교

분의 10자리 비교

분의 1자리 비교

다 같으면 EQ 신호 출력

Page 12: 11.dsd alarmed clock

- 12 -

e. led_output

LED(7:0)는 존슨카운터(CJ8RE) 의 출력을

받아들이는 입력이다.

아래 쪽 두 mux는 eq가 0이면 time_set과

alarm_set을 출력하여 mode를 led로 나타내

준다. eq가 1일 때는 존슨카운터로부터 들

어오는 입력을 출력하게 설계했다.

위의 6개의 mux는 eq가 0일 때는 시간

이 출력되고, eq가 1일 때는 존슨카운터로

부터 들어오는 입력을 출력하게 설계했다.

시의 10 자리 출력 선택

시의 1 자리 출력 선택

mux_8bit 내부구조

Page 13: 11.dsd alarmed clock

- 13 -

f. Etc

알람 신호(알람 설정시간과 시간이 일치한다는 신호) 출력을 위한 counter

0000000->1000000->1100000->1110000->1111000->1111100->1111110->1111111->0111111->0011111

->0001111->0000111->0000011->0000001->0000000 반복

4bit 신호를 7segment display로 출력해주는 symbol이다. 위의 block은 시간(time_count)의 분

과 초를 출력하고, 아래의 block은 알람시간(alarm_cnt)의 분을 출력한다.

2:1 mux 8개를 연결해서 만든 8bit mux

alarm_set이 1이면 시간의 segment 신호를

0이면, 알람 시간의 segment 신호를 출력해준다.

2:1 mux 4개를 연결해서 만든 4bit mux

alarm_set이 1이면 시간의 an 신호를 0이면 알람

시간의 an 신호를 출력해준다.

존슨카운터

DSS4_DRV

mux

Page 14: 11.dsd alarmed clock

- 14 -

② debounce_pulse

Push button의 입력을 noise를 제거하고 single_pulse로 출력하기 위해 사용하는 block

아래의 회로는 CLK 1주기 동안 KEY_OUT을 HIGH로 출력하는 회로이다.

③ CLK Controller

검증을 위해서 실제 시간보다 CLK 주기를 빠르게 주어야 할 때가 있다.

1Hz(CE1), 10Hz(CE10), 100Hz(CE100), 500Hz(CE500) 중 원하는 CLK을 골라서 출력 할 수 있게

해주는 Block을 4:1 MUX로 구현했다.

Page 15: 11.dsd alarmed clock

- 15 -

④ clk_div100

시스템 CLK(50MHz)을 나누어서 낮은 주기의 CLK을 만드는 Block

CD4RE(10진카운터)를 cascading해서 디자인 하였다. 50MHz 시스템 CLK을 넣어 나온 TC(CEO)는

한번 10진 카운터를 지날 때 마다, 1/10씩 주기가 줄어든다.

Page 16: 11.dsd alarmed clock

- 16 -

⑤ 전체적인 흐름

외부에서 주는 신호는 mode 변경하는 신호, 숫자를 증가시키는 inc 신호, 자리를 변경해주는

sel 신호가 있다. mode 키를 누를 때마다 time_set, alarm_set 신호를 controller에서 발생 시켜주고

이에 따라 작동모드가 변경된다. time_set이나 alarm_set이 HIGH 일 때, sel 신호로 자리를 변경할 수

있으며(시, 분 , 초), inc로 해당 자리를 증가 시킬 수 있다.

발생할 수 있는 출력은 time(시간), alarm(알람 시간) eq(알람 시간 = 시간 일 때 발생) 이며,

output controller에 의해 선택되어, 7segment나 led를 통해 출력 된다.

simple flowchart

Page 17: 11.dsd alarmed clock

- 17 -

MODE SEL INC 출 력

S0(time) X X 시간이 출력된다.

S1(time_set)

시 자리 HIGH “시”자리가 올라간다.

분 자리 HIGH “분”자리가 올라간다.

초 자리 HIGH “초”자리가 올라간다.

S2(alarm_set)시 자리 HIGH “시”자리가 올라간다.

분 자리 HIGH “분”자리가 올라간다.

time_count = alarm_cnt led 가 모두 깜빡인다.

5. 설계 검증

① 시계모드 검증

00:00:00부터 23:59:59 까지 정상적으로 카운트 되었으며 23:59:59 다음에 00:00:00으로 돌아

가는 것을 확인 하였다.

② 시간설정 모드 검증

MODE를 한번 눌렀을 때, 시간 설정모드로 넘어 갔으며, 이때 SEL키와 INC키를 통해 자리 변환

과 해당 자리를 증가할 수 있음을 검증하였다.

③ 알람설정 모드 검증

시간설정 모드에서 MODE키를 눌렀을 때 알람 설정모드로 넘어갔다. 이때 시간과 분 단위를 SEL

키와 INC 키를 이용해 조정할 수 있었으며, 00:01으로 설정하고 알람이 LED로 출력 되는 것을 검증하였

다.

6. 오류 및 수정

하위 module들을 만들고 나서 그 다음에 top module을 만드는 계층적 설계를 이용하였다. 그런

데 이때 top module을 다 구성하고 나서 만약 하위 module로 가서 어떤 내용을 수정하면 자동으로 저장

되지 않고 일일이 symbol update를 해줘야 해서 상당히 손이 많이 갔었다. 그리고 제대로 업데이트가

되지 않을 때 오류도 많이 났었다.

symbol wizard를 사용하여서 symbol을 만들 때, 크기를 지정해줄 때 default값은 256으로 되어

있는데 여기에 32의 배수를 더한 숫자(ex. 288, 320)로 하지 않으면 wire가 symbol에 제대로 연결이 되

지 않는 현상이 일어났었다. symbol wizard로 생성한 symbol에 입출력 값이 잘 들어가지 않는 이유를

찾을 수가 없어서 TA에게 문의하였고 문제를 해결할 수 있었다.

처음에는 DSS4_DRV symbol을 1개만 사용하고, time_count와 alarm_cnt에서 나오는 분과 초의

입력 값을 그 전에 MUX를 이용하여서 넣었었는데, 논리는 맞는 듯 보였으나 이유를 알 수 없게 계속 제

대로 동작하지 않았다. 그래서 다른 방법으로 시도하였는데, DSS4_DRV symbol 2개를 사용하여서, 알람

모드일 때 분을 표시하는 것과 시간 모드일 때의 분과 초를 입력한 후 그 다음에 MUX를 사용하였다. 즉

MUX사용 순서를 바꾸기만 하였는데 alarm_set 신호에 따라 7-segment에 원하는 값이 출력되었다.

Page 18: 11.dsd alarmed clock

- 18 -

7. 설계를 마치고..

노 동 기

이번 Alarm clock 설계는 7주 동안 Xilinx에서 schematic tool에 대해 배운 내용의 총 집합이

었다. 처음 Xilinx tool에서 wire를 연결하는 내용부터 배우기 시작해서 이번 alarm clock 설계까지 상

당히 흥미롭고 재밌게 설계과제들을 수행해왔었던 것 같다. 그렇지만 처음에 설계사양을 봤을 때는 우

리가 배운걸로 할 수 있을까 라는 기분이 들어서 약간은 막막했었다. 하지만 이 설계사양이 우리가 원

하는 대로 구동되려면 무슨 모듈이 필요하고 어떤 식으로 논리를 수행하도록 해야 할까 차근차근 생각

해보면서 하나씩 구상해갔다. 간단히 예를 들면 ‘시간을 count 하는 모듈은 우리가 배운 counter를 이

용하여서 하면 되겠다.' 이런 식으로 필요한 module들을 생각하여서 Datapath를 구상해 가는 것은 상당

히 흥미로운 작업이었다. 이번 설계를 하면서 이러한 과정들, 설계사양이 있을 때 어떤 방법으로 어떻

게 하나하나 진행해나가야 하는지에 대하여 많이 연습하고 배운 것 같다. 그다음 controller를 구상하

였는데 사실 좀 어려움을 겪어서 교수님께서 제공해주신 FSM그림을 보고 참고하여서 controller를 만들

었다. 그리고 schematic뿐만 아니라 verilog도 제대로 배워서 설계에 적용해봐야겠다고 생각했다. 설계

프로젝트를 수행하는 내내 많은 시행착오와 수정작업을 거쳤고, 밤늦게까지 설계하는 날들이 많았다.

하지만 그만큼 디버깅하는 방법과 문제 해결방법에 대해 상당히 많이 배울 수 있었다. 내가 구상한대로

설계되었을 때의 그 기쁨들로도 이번 설계 프로젝트는 마냥 힘들었다고 말할 수 없을 거 같고, 상당히

보람차고 즐거웠다.

이번 설계프로젝트는 팀 프로젝트였는데, 서로의 의견을 나누고 어떻게 할지 구상한 후 할 일

을 나누는, 이런 것들 모두에 상당히 어려웠었다. 그리고 분할한 설계를 다시 합치는 데에도 상당히 많

은 시간이 걸렸다. 하지만 그만큼 같이 과제를 수행한다는 것 자체에 대해 여러모로 배울 수 있었고 생

각해볼 수 있는 기회였다.

장 호 상

처음에 설계과제를 받았을 때는 지금까지 배운 내용으로 쉽게 설계할 수 있을 거라고 생각했

다. Top Schematic을 설계하고 필요한 Block 들을 나눠서 설계해서 합칠 때 까지는 순조롭게 진행되었

다. 그러나 막상 각자 설계한 것을 하나로 합쳐서 실행했을 때 오류가 발생했다.

중요한 것은 어디서부터 어떻게 잘못 되었는지 찾아내기가 굉장히 어려웠다. 어떤 설계이든 이번 과제

와 같은 스케일은 한 번에 성공하길 바랄 수는 없는 것 같다.

그런대 설계하면서 배우는 것 보다, 오류를 발견하고 수정하면서 배우는 것이 확실히 내 것이 되는 것

같다. 인내심의 한계를 느껴가면서 최종적으로 설계를 마무리 했을 때의 희열은 어느 것과 바꿀 수 없

었다. 7주 동안 기본적인 툴의 사용법은 꽤나 익숙해 졌고, 어느 정도 수준의 설계는 할 수 있을 것 같

다. 7주 동안 상당히 일정이 빠듯하게 진행되었고, 수업시간에도 정해진 분량을 살짝 무리해서 빼려는

교수님의 열정(?) 때문에 고난의 시간이었다. 지금 와서 생각해보면 이런 시스템이 오히려 긴장감 있

고, 더 집중해서 교수님 말씀을 듣게 해주며, 같은 것을 배워도 빠르게 습득할 수 있게 해준 것 같다.

학기 시작할 때는 과연 잘 해 낼 수 있을지 의심이 들었지만, 7주라는 짧은 시간동안 많은 것

을 배웠고, 직접 손으로 해보고 눈으로 확인했기 때문에 오랫동안 기억에 남을 것 같다.

Page 19: 11.dsd alarmed clock

- 19 -

8.역할분담

노 동 기 : alarm_count, controller, led_output

장 호 상 : time_count, comparator, mux(4bit,8bit)

기타 나머지 block 들은 같이 설계하였습니다.