본문 바로가기

UOS/20-2_전자전기컴퓨터 설계 및 실험 2

Final Project_구현

 

한백 전자 HBE-Combo II-SE(실습장비)

우리가 이번 학기 실습 중에 계속 썼던 장비이다. 난 아직도 익숙하지 않다. 이걸로 많은 기능을 할 수 있다는데 내 관심 밖이어서 나는 보다시피 필요한 3가지만 이용했다. Button(Button 입력), LCD panel(Text 출력), PIEZO(Sound 출력).

 

 

'Distance Breaking' 게임 알고리즘

내가 만들고자 하는 게임은 다소 부끄러울만큼 단순한 알고리즘으로 구성되어 있다. Button을 입력하면 프로그램 내에서 자동으로 1부터 100까지의 수 중에서 하나의 수를 생성하고, 이는 100가지의 질문 중 하나를 선택할 수 있는 중요한 변수가 된다. 선택된 질문은 LCD panel에 등장하고 동시에 효과음(띠리리리리릭)이 PIEZO(출력 장치)에서 발생한다. 이게 끝이다.

 

 

Final Project 도전 과제

나의 도전 과제는 이러했다.

  1. Make 100 Questions : 재밌고 의미 있는 100개의 질문을 만들어서 입력하기
  2. Randomization : 질문을 랜덤으로 생성할 수 있는 코드 구현해보기
  3. Produce PIEZO sound : 질문 생성시에 심심하지 않도록 효과음 만들어 보기

더도 말고 덜도 말고 내 선에서 이 정도만 해도 충분할 거라고 생각했다. 하지만, 책이나 인터넷 찾아보면서 이 과제를 해결해보고자 노력했으나 나 스스로 그럴만한 능력이 되지 않다는 것을 깨달았다. 다행히 꾸준히 도움을 구했던 K 씨와 그를 통해 알게 된 학우분들의 도움으로 무난히 해결할 수 있었다. 나의 부족한 능력을 계속해서 인정할 수밖에 없었고 말이다.

 

 

1. Make 100 Questions

100 Questions
코딩 예시

우선, 100개의 질문을 손수 만들어야 했다. 요즘 유행하는 밸런스 게임에서도 따오기도 했고, 아이스 브레이커용 질문을 응용해서 만들어 보았다. 그 외 대부분은 내가 고민해서 만들었다. 평소에 대화를 많이, 그리고 꾸준히 해오는 나에게는 다행히 어려운 일은 아니었다. 그렇지만, 저 질문들을 코드화시켜서 일일이 입력시켜야 하는 작업이 필요하다. 다른 프로그램 언어에서는 문자를 그대로 입력하면 되지만, verilog는 그렇지 않아서 각 비트에 할당된 문자를 찾아서 하나씩 입력해주어야 한다. LCD Panel에 32개의 문자가 들어가는데 그것들 모두 써주어야 했다. 나중에 안 사실이지만, 만약에 4번째 칸에 m를 입력해주고 싶다고 하면 8'b01101101을 입력해줘도 되고 그냥 "m"으로 써주어도 된다고 한다....ㅂㄷㅂㄷ 총 100개를 이런 식으로 입력하고 검토하는 데만 꼬박 이틀 정도 걸린 거 같은데, 역시 사람이 머리가 좋아야 몸이 고생 안 한다.

 

 

2. Randomization

난수 생성 코드
질문 랜덤 선택 코드

 

이건 1~10까지의 수 중 난수를 생성할 수 있는 코드이다. 난수 명은 r_cnt로 지정했고, 저게 case문을 통하면 여러 질문 중 하나를 선택할 수 있게 된다. 이게 내 게임의 가장 주요한 원리이다. 이 코드가 꽤나 간단해보이지만, 내 머리로는 스스로 창조할 수는 없다. K 씨의 도움을 받았으니 할 수 있었다. 너무 고맙게도 그냥 다 해주셨다. 과제의 진정한 목적 상 스스로 하는 게 좋다고 느끼지만, 나는 끝내 그 장벽을 넘을 수 없었다. 이 코드 이용한다면 먼저 simulation test를 하면서 원리를 이해하는 것을 추천하고 싶다.

 

 

3. Proudce PIEZO sound

PIEZO 출력 코드(1)
PIEZO 출력 코드(2)
PIEZO.txt
0.00MB

 

 

좀 길어서 전체 코드의 사진으로 일부분만 가져왔는데, 전체 코드는 txt파일로 첨부해두겠다. 이 코드는 J 씨에게 모조리 도움을 받았다. verilog 공부해보신 분들은 코드 보시면 금방 아시겠지만 그래도 간략히 설명하자면, time_count는 piezo에서 소리 나는 각 구간별 시간을 나타낸다. 그리고, case문으로 순서를 설정할 수 있어서 소리가 계속 이어져 멜로디를 만들 수 있다. 나는 time_count를 60000으로 두었는데 이는 clk이 1 MHz로 계산했을 때 0.06초라는 것이다. 결국 0.06초의 간격으로 소리가 이어질 수 있도록 설정했다. 나는 도레미파솔라시도가 빠르게 소리 나면서 효과음처럼 들렸으면 좋겠어서 이렇게 설정했다. 이런 식으로 하면 다른 멜로디 쉽게 만들 수 있을 것이다. 참고로 이 코드에서 isPlaying이라는 변수가 있는데 pin 할당을 led에 두면 소리가 들리는 동안 led에서 불이 나올 수 있다. 설정해도 되고 안 해도 된다.

 

 

게임 시연

최종적으로 구현한 게임이다. 알고리즘이 정말 단순해서 큰 오류없이 무난히 완성할 수 있었다. 단지 노가다만 있었을 뿐. 아쉬운 점이 있다면 랜덤화해서 질문들을 출력할 때, 이미 출력된 질문들이 중복되어서 나올 확률이 있다. 100분의 1로 희박하지만 말이다. 중복방지용 코드는 게임을 구상할 때부터 일찌감치 포기했지만, 게임을 만들고 나니까 이 기능이 있었다면 좀 더 괜찮을 것 같다는 생각을 하게 되었다.

 

'UOS > 20-2_전자전기컴퓨터 설계 및 실험 2' 카테고리의 다른 글

Final Project_최종 발표  (0) 2020.12.13
Final Project_중간 발표  (0) 2020.12.13
Final Project_구상  (0) 2020.12.13
Final Project_Prologue  (0) 2020.12.13