ディジタルシステム設計最終レポート

ディジタルシステム設計最終レポート
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