资源描述
本科实验报告
题目:四路抢答器设计
课程名称: SOPC设计与实践
学院(系):信息与通信工程学院
专 业: 电子信息工程
班 级:
学 号:
学生姓名:
成 绩:
2011 年 5 月 14 日
题目:四路抢答器设计
1 设计要求
在娱乐、竞赛类节目中,很多都需要用到抢答器,用来判断是谁第一个抢到答题机会。
本设计是四路抢答器,就是可以四个人一块抢答,并且将抢答结果通过LED、数码管、LCD来进行显示。即某一个人按下他对应的按钮后,他身前的LED亮,数码管上显示他对应的号码,LCD显示是第几号选手获得了抢答的机会。并且本设计设有总控制开关,用来控制何时开始抢答。
2 设计分析及系统方案设计
对于总开关的设计,我采用的是在判断按键操作之前增加一个if语句,如果总开关开启,按键操作才被响应,如果总开关没有开启,按键操作都不被响应。对于按键的判断,我采用的按键中断来实现的,某个按键按下后,中断响应,如果总开关开启,则根据键值进行响应的按键响应,即将对应的LED点亮,数码管上显示需要显示的数字,LCD显示第几位选手抢答成功。为了防止第一位选手抢答后,第二位选手将第一位选手的抢答冲掉,考虑到实际应用,我采用的是在第一位选手按键操作响应后就进行一定时间的延时,从而保证在延时的这段时间,其他的选手不能将第一位选手的按键响应冲掉。
3 各功能模块硬件电路设计
(1)总体电路图
在此系统图中,包含CPU及外围LED、数码管、LCD的连接及引脚配置。
(2)SOPC builder配置图
此SOPC builder中,加入了20K RAM、16K ROM、四位按键(设置下降沿中断)、一位开关、四位LED、一个七段数码管、一片LCD。
4 系统软件设计
(1)流程图
是
开始
总开关开启?
是否有按键?
执行响应的按键响应
清空LED、数码管、LCD显示
延时
是
否
否
(2)源代码:
#include "system.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "io.h"
#include "stdio.h"
volatile int edge_capture;
unsigned char seg_table[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};
static void handle_key_interrupt(void* context,alt_u32 id)
{
volatile int* edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD(KEY_BASE,3);
IOWR(KEY_BASE,3,0);
}
static void init_key_pio()
{
void* edge_capture_ptr=(void*)&edge_capture;
IOWR(KEY_BASE,2,0xf);
IOWR(KEY_BASE,3,0x0);
alt_irq_register(KEY_IRQ,edge_capture_ptr,handle_key_interrupt);
}
int main(void)
{
init_key_pio();
char sw;
char Text1[15]=" The first one!";
char Text2[15]=" The second one";
char Text3[15]=" The third one!";
char Text4[15]=" The forth one!";
char Text5[15]=" Please Wait...";
int i;
int Initial[5]={0x38,0x0c,0x01,0x06,0x80};
for(i=0;i<5;i++)
{
IOWR(LCD_16207_0_BASE,0,Initial[i]);
usleep(5000);
}
while(1)
{
IOWR(LCD_16207_0_BASE,0,0x01);
sw=IORD(SW_BASE,0);
if(sw==1)
switch(edge_capture)
{
case 0x08:
{
IOWR(LED_BASE,0,0x08);
IOWR(SHU_BASE,0,seg_table[1]);
for(i=0;i<15;i++)
{
IOWR(LCD_16207_0_BASE,2,Text1[i]);
usleep(2000);
}
usleep(9000000);
}
break;
case 0x04:
{
IOWR(LED_BASE,0,0x04);
IOWR(SHU_BASE,0,seg_table[2]);
for(i=0;i<15;i++)
{
IOWR(LCD_16207_0_BASE,2,Text2[i]);
usleep(2000);
}
usleep(9000000);
}
break;
case 0x02:
{
IOWR(LED_BASE,0,0x02);
IOWR(SHU_BASE,0,seg_table[3]);
for(i=0;i<15;i++)
{
IOWR(LCD_16207_0_BASE,2,Text3[i]);
usleep(2000);
}
usleep(9000000);
}
break;
case 0x01:
{
IOWR(LED_BASE,0,0x01);
IOWR(SHU_BASE,0,seg_table[4]);
for(i=0;i<15;i++)
{
IOWR(LCD_16207_0_BASE,2,Text4[i]);
usleep(2000);
}
usleep(9000000);
}
break;
default:
{
IOWR(LED_BASE,0,0x00);
IOWR(SHU_BASE,0,seg_table[10]);
}break;
}
else
{
edge_capture=0x00;
IOWR(LED_BASE,0,0x00);
IOWR(SHU_BASE,0,seg_table[10]);
for(i=0;i<15;i++)
{
IOWR(LCD_16207_0_BASE,2,Text5[i]);
usleep(2000);
}
usleep(200000);
}
}
}
5 系统调试运行结果说明计分析
系统运行环境:硬件是Altera公司CycloneII 2C35FPGA DE2开发板,软件是QuartusⅡ6.0和NIOS Ⅱ。
系统运行结果:系统运行后,总开关未开启条件下,任何按键都没有用。总开关开启后,按下一个按键后,对应LED亮,数码管显示按键编号,LCD上显示第几个按键,在第一个按键按下的大约5秒钟之内,其他的按键都没有用。总开关关闭,LED和数码管熄灭,LCD显示“Please Waiting…”。
设计让需完善的地方:当响应按键操作后,会延时大约5秒,而这时如果立马关闭总开关,对应的显示设备不会熄灭,延时之后才会熄灭LED、数码管和改变LCD上的内容。我认为可以通过将总开关也设置成中断,并且优先级高于按键优先级,从而修复这个BUG。
6 结论
本设计中,主要进行了软核CPU的设计,CPU外围器件LED、数码管、LCD的连接,系统的组件,以及系统运行的程序,关键是按键中断的设计和按键响应程序。
程序已经把抢答器的功能基本实现,能够通过一个总开关控制抢答开始,四位按键能够区分开来哪个第一个按下,而且将第一个按下的信息通过不同的方式显示出来。
参考文献
展开阅读全文