SOPC四路抢答器设计.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateSOPC四路抢答器设计大连理工大学本科实验报告题目:四路抢答器设计课程名称: 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_table11=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 Text115=" The first one!" char Text215=" The second one" char Text315=" The third one!" char Text415=" The forth one!" char Text515=" Please Wait." int i; int Initial5=0x38,0x0c,0x01,0x06,0x80; for(i=0;i<5;i+) IOWR(LCD_16207_0_BASE,0,Initiali); 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_table1); for(i=0;i<15;i+) IOWR(LCD_16207_0_BASE,2,Text1i); usleep(2000); usleep(9000000); break; case 0x04: IOWR(LED_BASE,0,0x04); IOWR(SHU_BASE,0,seg_table2); for(i=0;i<15;i+) IOWR(LCD_16207_0_BASE,2,Text2i); usleep(2000); usleep(9000000); break; case 0x02: IOWR(LED_BASE,0,0x02); IOWR(SHU_BASE,0,seg_table3); for(i=0;i<15;i+) IOWR(LCD_16207_0_BASE,2,Text3i); usleep(2000); usleep(9000000); break; case 0x01: IOWR(LED_BASE,0,0x01); IOWR(SHU_BASE,0,seg_table4); for(i=0;i<15;i+) IOWR(LCD_16207_0_BASE,2,Text4i); usleep(2000); usleep(9000000); break; default: IOWR(LED_BASE,0,0x00); IOWR(SHU_BASE,0,seg_table10); break; else edge_capture=0x00; IOWR(LED_BASE,0,0x00); IOWR(SHU_BASE,0,seg_table10); for(i=0;i<15;i+) IOWR(LCD_16207_0_BASE,2,Text5i); usleep(2000); usleep(200000); 5 系统调试运行结果说明计分析系统运行环境:硬件是Altera公司CycloneII 2C35FPGA DE2开发板,软件是Quartus6.0和NIOS 。系统运行结果:系统运行后,总开关未开启条件下,任何按键都没有用。总开关开启后,按下一个按键后,对应LED亮,数码管显示按键编号,LCD上显示第几个按键,在第一个按键按下的大约5秒钟之内,其他的按键都没有用。总开关关闭,LED和数码管熄灭,LCD显示“Please Waiting”。设计让需完善的地方:当响应按键操作后,会延时大约5秒,而这时如果立马关闭总开关,对应的显示设备不会熄灭,延时之后才会熄灭LED、数码管和改变LCD上的内容。我认为可以通过将总开关也设置成中断,并且优先级高于按键优先级,从而修复这个BUG。6 结论本设计中,主要进行了软核CPU的设计,CPU外围器件LED、数码管、LCD的连接,系统的组件,以及系统运行的程序,关键是按键中断的设计和按键响应程序。程序已经把抢答器的功能基本实现,能够通过一个总开关控制抢答开始,四位按键能够区分开来哪个第一个按下,而且将第一个按下的信息通过不同的方式显示出来。参考文献-