赣南师院 物理与电子信息学院 SOPC技术课程设计报告书
专业班级: 09电信本          学生姓名: 赖新               学  号: 090802016      指导教师: 管立新             设计时间: 2011-12-21
四路抢答器设计
一、课题简介
SOPC技术是美国Altrea公司于2000年最早提出的,并同时推出了相应的开发软件Quartus II。SOPC是基于FPGA解决方案的SOC,与ASIC的SOC解决方案相比,SOPC系统及其开发技术具有更多的特色,构成SOPC的方案有多种途径,我们主要用到的是:基于FPGA嵌入IP硬核的SOPC系统
1.基于FPGA嵌入IP硬核的SOPC系统
即在FPGA中预先植入嵌入式系统处理器。目前最为常用的嵌入式系统大多采用了含有ARM的32位知识产权处理器核的器件。尽管由这些器件构成的嵌入式系统有很强的功能,但为了使系统更为灵活完备,功能更为强大,对更多任务的完成具有更好的适应性,通常必须为此处理器配置许多接口器件才能构成一个完整的应用系统。如除配置常规的SRAM、DRAM、Flash外,还必须配置网络通信接口、串行通信接口、USB接口、VGA接口、PS/2接口或其他专用接口等。这样会增加整个系统的体积、功耗,而降低系统的可靠性。但是如果将ARM或其他知识产权核,以硬核方式植入FPGA中,利用FPGA中的可编程逻辑资源和IP软核,直接利用FPGA中的逻辑宏单元来构成该嵌入式系统处理器的接口功能模块,就能很好地解决这些问题。
2.基于FPGA嵌入IP软核的SOPC系统
这种SOPC系统是指在FPGA中植入软核处理器,如:NIOS II核等。用户可以根据设计的要求,利用相应的EDA工具,对NIOS II及其外围设备进行构建,使该嵌入式系统在硬件结构、功能特点、资源占用等方面全面满足用户系统设计的要求。
二、设计要求
设计并制作一个简易4路抢答器,其参考结构示意图如下。
(1) 在主持人未按下开始按钮前,任何选手不得按抢答按钮,否则无效;
(2) 在主持人按下开始按钮后,选手开始抢答,选手按下对应的按钮后,身前的LED亮,数
码管上显示对应的号码,LCD显示是第几号选手获得了抢答的机会;
三、设计分析及系统方案设计
对于总开关的设计,采用的是在判断按键操作之前增加一个if语句,如果总开关开启,按键操作才被响应,如果总开关没有开启,按键操作都不被响应。对于按键的判断,采用的按键中断来实现的,某个按键按下后,中断响应,如果总开关开启,则根据键值进行响应的按键响应,即将对应的LED点亮,数码管上显示需要显示的数字,LCD显示第几位选手抢答成功。为了防止第一位选手抢答后,第二位选手将第一位选手的抢答冲掉,考虑到实际应用,采用的是在第一位选手按键操作响应后就进行一定时间的延时,从而保证在延时的这段时间,其他的选手不能将第一位选手的按键响应冲掉。
四、各功能模块硬件电路设计
(1)总体电路图
在此系统图中,包含CPU及外围LED、数码管、LCD的连接及引脚配置。
(2)SOPC builder配置图
此SOPC builder中,加入了20K RAM、16K ROM、四位按键(设置下降沿中断)、一位开关、四位LED、一个七段数码管、一片LCD。
五、系统软件设计
流程图
开始 否 总开关开启? 是 否 是否有按键? 是 执行响应的按键响应 清空LED、数码管、LCD显示 延时
六、系统调试运行结果说明计分析
系统运行环境:硬件是Altera公司CycloneII 2C35FPGA DE2开发板,软件是QuartusⅡ6.0和
NIOS Ⅱ。
系统运行结果:系统运行后,总开关未开启条件下,任何按键都没有用。总开关开启后,按下一个按键后,对应LED亮,数码管显示按键编号,LCD上显示第几个按键,在第一个按键按下的大约5秒钟之内,其他的按键都没有用。总开关关闭,LED和数码管熄灭,LCD显示“Please Waiting„”。
设计让需完善的地方:当响应按键操作后,会延时大约5秒,而这时如果立马关闭总开关,对应的显示设备不会熄灭,延时之后才会熄灭LED、数码管和改变LCD上的内容。我认为可以通过将总开关也设置成中断,并且优先级高于按键优先级,从而修复这个BUG。
七、结论
本设计中,主要进行了软核CPU的设计,CPU外围器件LED、数码管、LCD的连接,系统的组件,以及系统运行的程序,关键是按键中断的设计和按键响应程序。
程序已经把抢答器的功能基本实现,能够通过一个总开关控制抢答开始,四位按键能够区分开来哪个第一个按下,而且将第一个按下的信息通过不同的方式显示出来。
八、设计心得体会
经过几星期的努力,终于把这次课程设计做完了。虽然刚开始对何为SOPC一点都不懂,于是按部就班地上图书馆去查阅资料,上网去搜索终于有较表层的认识。但是这样远远不够的,还需要对四路抢答器的整体设计,包括具有什么功能,实现这些功能需要哪些元器件,还有软件与硬件的结合,代码的实现。这需要我再次翻开数电书,重新再学习一次。
此次课程设计让我认清了几点: 第一, 将理论付诸实践的困难。 第二, 查找资料的重要性。 第三, 细节决定成败。
第四, 查找故障的能力有待提高。
总的来说,课程设计有利于培养我们对电子设计的兴趣,也让我发现了自身很多不足,学会了不少知识,帮我积累了不少经验。这对我以后的学习和工作都是一笔不可多得的财富。最后感谢老师一直以来的支持和指导,老师辛苦了!
九、参考文献
[ 1 ]  康华先--- 电子技术基础(数字部分) ;第五版[M]高等教育出版社。 [ 2 ]   谢自美--- 《电子线路设计 实验 测试》;华中科技大学出版社。 [ 3 ]  谭浩强---《C程序设计》;清华大学出版社。
[ 4 ]   王建国---《SOPC设计基础与实践》;西安电子科技大学出版社
十、附录:
源代码如下: #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);     }   } }
赣南师范学院2011--2012学年第一学期SOPC技术课程设计
行政班级   电子信息工程09级   学号 090802016   姓名 ___赖新_ __ 选课班级   电子信息工程09级    任课教师  管立新  成绩 _________
课程设计题目:  设计要求: 1、在主持人未按下开始按钮前,任何选手不得按抢答按钮,否则无效; 2、在主持人按下开始按钮后,选手开始抢答,选手按下对应的按钮后,身前的LED亮,数码管上显示对应的号码,LCD显示是第几号选手获得了抢答的机会; 教师评语:      教师签字: 年   月   日