ディジタルシステム設計最終レポート 105736H 吉田明生 班員:105730J 真境名亮,105747C 安里悠矢 1 開発システムの詳細説明書 機能紹介 • ボタンを押したらスタートするボタン連打ゲーム. • ボタンは 5 つあるうちのどれを押しても構わない. • ゲームがスタートしたら時間をカウントし,その間にボタンを何回押せたかをカウントする. • ゲーム終了後 LCD が切り替わって 10 秒の間にどれだけ叩けたかを表示する. • 結果表示の後はスタート画面に戻る. ソフトウェアのソース #include "xparameters.h" #include "xutil.h" #include "xio.h" #include "xgpio.h" #include "xtime_l.h" #include "xexception_l.h" #include "xintc.h" #include "xstatus.h" #include "sleep.h" #include "cdc_hw.h" #include <string.h> #include <stdio.h> #include <math.h> #include <time.h> //User Device Init and Interupt Setup static XStatus Device_Init(void); static XStatus Interrupt_Setup(void); static void CDC_Handler(void); // LCD static WriteInst(XGpio *, unsigned char); static WriteData(XGpio *, unsigned char); 2 static XStatus LCD_Init(XGpio *lcd); static void LCD_SetLine(XGpio *lcd_ptr, int line); static void LCD_ReturnHome(XGpio *lcd_ptr); static void LCD_Clear(XGpio *lcd_ptr); static void LCD_DisplayString(XGpio *lcd_ptr, unsigned char *line); static void LCD_DisplayNumber(XGpio *lcd_ptr, int number); //user write 2 static int game_top(); /*ゲームのトップ画面, ボタンを押すとカウント処理に入る frag 0 のみで 処理*/ static int start_count();/*ゲーム前のカウント処理 frag 1 のみで処理*/ static int game_start();/*ゲームスタート frag 2 のみで処理*/ static int start_print(int x); /*スタート前のカウント描画*/ static void game_dis(int count,int time); /*カウント処理をディスプレイに表示*/ static int game_result();/*ゲームリザルト frag 3 のみで処理 一定時間で gametop に戻る*/ static int count=0; /*連打回数のカウント*/ static int rcount=0; /*リザルトの表示秒数の初期化*/ // // ASCII Code (0,1,2,3,4,5,6,7,8,9) // static char character_table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //Handles for Devices XGpio pushs; XGpio leds; XGpio led5; XGpio lcd; XIntc intc; //Interface Buffer Base Address #define BUF_RX_BASE_ADDRESS 0x00000000 #define BUF_TX_BASE_ADDRESS 0x00001000 //Define pointer for buffer unsigned int *buf_rx; 3 unsigned int *buf_tx; unsigned int buf_temp[8]; //---------------------------------------------------------------//PLB_CODEC_CNTLR Interrupt Handler //---------------------------------------------------------------static int frag = 0; //フラグ処理 static void CDC_Handler() { if(frag == 0) { game_top();/*game のトップ画面*/ } if(frag == 1) { start_count(); /*カウント処理を書く*/ } if(frag == 2) { game_start(); /*ゲームスタート*/ } if(frag == 3) { game_result(); /*ゲームリザルトを表示*/ } } //カウントの更新処理 static void game_dis(int count,int time){ XGpio_DiscreteWrite(&leds, 1, 0xf ); LCD_SetLine(&lcd,1); LCD_DisplayString(&lcd,"start "); LCD_DisplayNumber(&lcd,time); LCD_SetLine(&lcd,2); LCD_DisplayNumber(&lcd,count); } 4 /*ゲームのトップ画面*/ static int game_top() { //LCD による表示 LCD_SetLine(&lcd,1); LCD_DisplayString(&lcd, "COUNT GAME"); LCD_SetLine(&lcd,2); LCD_DisplayString(&lcd,"PUSH BUTTON "); //ボタンが押されたかどうかの判定 static int l=0, m=0; static int hantei = 0; static unsigned char p_in=0, p_in_prev=0; p_in = XGpio_DiscreteRead(&pushs, 1); //ボタンの処理// if ( p_in == 1 ) { frag = 1; LCD_Clear(&lcd); } else if(p_in ==2 ){ frag = 1; LCD_Clear(&lcd); }else if(p_in ==4 ){ frag = 1; LCD_Clear(&lcd); }else if(p_in ==8 ){ frag = 1; LCD_Clear(&lcd); }else if(p_in ==16 ){ frag = 1; LCD_Clear(&lcd); }else{ } SET_TX_BUF; usleep(1); 5 FREE_TX_BUF; return 0; } /*ゲーム開始前のカウント処理*/ static long int st; static int j =3; static int start_count() { // int j = 3 - st; start_print(j--); st++; //呼ばれるたびにカウントをする if(st == 3)//3 秒たったら frag=2 とする { frag =2; st =0; j = 3; LCD_Clear(&lcd); } sleep(1); return 0; } /*ゲーム開始前のカウント処理 (描画)*/ static int start_print(int x) { //LCD による表示 LCD_SetLine(&lcd,1); LCD_DisplayNumber(&lcd,x); return 0; } /*ゲームスタート 10sec*/ static unsigned int usec=0; static unsigned int msec=0; static unsigned int sec=0; 6 static int game_start() { static int l=0, m=0; static unsigned char p_in=0, p_in_prev=0; p_in = XGpio_DiscreteRead(&pushs, 1); //ボタンの処理// if ( (m==0) || (p_in_prev != p_in) ) { if ( p_in == 1 ) { count++; game_dis(count,m); } else if(p_in ==2 ){ count++; game_dis(count,m); }else if(p_in ==4 ){ count++; game_dis(count,m); }else if(p_in ==8 ){ count++; game_dis(count,m); }else if(p_in ==16 ){ count++; game_dis(count,m); }else{ game_dis(count,m); } m=1; p_in_prev=p_in; } // SET_TX_BUF; // FREE_TX_BUF; usec++; if(usec == 1000) { msec++; usec = 0; } 7 if(msec == 100) { sec++; msec =0; } if(sec == 2) { frag = 3; usec=0; msec=0; sec=0; LCD_Clear(&lcd); } usleep(1); return 0; } /*リザルトを表示*/ static int game_result() { //結果を表示 // XGpio_DiscreteWrite(&leds, 1, 0xf ); LCD_SetLine(&lcd,1); LCD_DisplayString(&lcd, "RESULT"); LCD_SetLine(&lcd,2); LCD_DisplayNumber(&lcd,count); rcount++; if(rcount == 3)//3 です { rcount =0; rag =0; count =0; LCD_Clear(&lcd); } sleep(1); return 0; } 8 メンバーの役割分担 • A班 真境名亮:タイマー機能作成 吉田明生:LCD 表示 安里悠矢:ゲーム機能作成 ML403 ボード,CODEC,FPGA 等の説明 ML403 ボード XILINX が出している Virtex-4FX FPGA をベースとするエンベデッドデザイン開発向けのプラット フォーム.記憶領域には 64MBDDR SDRAM,8MBZBT SRAM,64MB Flash,4kBIIC EEPROM があ る.インターフェイスはオーディオ入出力,Ethernet ポート,ボタンと LED(I/O) 等. CODEC 符号化方式を使ってデータの符号化と復号ができるソフトウェア,または同様の機能を持つ装置のこと.音 声や動画などのデータを別の形式に変換することができる. FPGA プログラム (再構成) 可能なディジタルシステム.基本的にはプログラマブル回路や FF,CPU 等で構成さ れる.ユーザー自身が回路の設計、再設計が可能なので仕様変更などにも柔軟に対応できる.FPGA は論理 回路をメモリを中心に構成することにより,情報を蓄積し,それを元に回路を構成することができる.動作の 定義には HDL ハードウェア記述言語) または回路図で設計を提供する.大規模な場合は HDL を用いること が多い.HDL で記述した設計を EDA ツールに入力し,ネットリストを生成する.ネットリストを FPGA に 対応させるため,place-and-route と呼ばれるソフトウェアを使用する. 開発プロジェクトの結果評価,反省点,感想 今回の実習を通して,一から開発する難しさを知ることができました.私たちの班は最初のテーマ決めに時 間がかかってしまい,その後の開発時間が少なくなってしまいました.そのせいでタイマー部分の実装が不完 全なものになってしまったのが残念でした.しかし,個人で何かを作るよりもチームで作るほうが,私が思い つかないような案が出てくるので,そういう部分は面白かったし,為になると思いました. 9
© Copyright 2024 ExpyDoc