收藏 分销(赏)

SOPC四路抢答器设计.doc

上传人:丰**** 文档编号:9779650 上传时间:2025-04-07 格式:DOC 页数:7 大小:239.50KB
下载 相关 举报
SOPC四路抢答器设计.doc_第1页
第1页 / 共7页
SOPC四路抢答器设计.doc_第2页
第2页 / 共7页
点击查看更多>>
资源描述
本科实验报告 题目:四路抢答器设计 课程名称: 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的连接,系统的组件,以及系统运行的程序,关键是按键中断的设计和按键响应程序。 程序已经把抢答器的功能基本实现,能够通过一个总开关控制抢答开始,四位按键能够区分开来哪个第一个按下,而且将第一个按下的信息通过不同的方式显示出来。 参考文献
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服