上周Altera推出了Quartus II 12.1版本的设计套件。我第一时间安装完成,新版软件SDI的IP对Cyclone V的支持又上了一个台阶,Triple-Speed模式能使用了。28nm的器件库还没有完备,下一阶段估计还会通过SP来增加。 这次的试用笔记相对比较简单,介绍一下如何搭建一个简单的Qsys系统,并如何使用按键中断。做这么一个工作,是因为发现论坛里关注这次试用报告的人不多,我估计大多数路过的人都是FPGA新手,所以写这么一个入门的笔记。 Qsys作为SOPC Builder的升级,势必会取代SOPCBuilder,所以在新的设计中,建议采用Qsys。 这次搭建的一个简单的片上系统,主要由以下几个模块构成: 1. 首先添加Clock Source,重命名为clk_in,选择已知时钟频率 50MHz. 2. 添加Nios II cpu,选择core为NiosII/e模式,别的先保留作为默认,改名为niosii. 3. 添加On-chip Memory,大小为102400 bytes,重命名为onchip_mem. 4. 添加jtag-uart,使用参数默认。 5. 添加PIO,位宽选择3,方向选择输入,选中同步捕捉,沿为下降沿,使能单比特置位。选中IRQ,类型为EDGE. 6. 导出刚刚添加的PIO的管脚,在Conduit Endpoint栏里输入pb. 7. 将onchip_mem与niosii的数据和指令总线相连,在niosii选项里设置reset地址。 8. 配置所有模块的时钟为clk_in. 9. 连接niosii的data master到别的模块,并连上IRQ. 10. 自动生成基地址和创建全局复位连接。 硬件编译下载后,需要编写中断处理软件。 #include <stdio.h> #include <io.h> #include <unistd.h> #include "system.h" #include "sys/alt_irq.h" // 定义全局变量以储存边沿捕获值 volatile int edge_capture; void push_button_isr(void *context) { /* Cast context to edge_capture's type. Itis important that this be * declared volatile toavoid unwanted compiler optimization. */ volatile int* edge_capture_ptr = (volatile int*) context; /*在下面的语句中0x00代表是数据寄存器 0x01代表是方向寄存器 0x02代表是中断掩码器 0x03代表是边沿捕获寄存器*/ /* Store the value in the Button's edgecapture register in *context. */ *edge_capture_ptr = IORD(PUSH_BUTTON_BASE,3); /* 点亮相应的LED */ IOWR(LED_BASE,0,std); /* 清除边沿捕获寄存器 */ IOWR(PUSH_BUTTON_BASE,3,0x07); } void push_button_init() { /* Recast the edge_capture pointer to matchthe alt_irq_register() function * prototype. */ void* edge_capture_ptr = (void*) &edge_capture; /* Enableall 3 button interrupts. */ IOWR(PUSH_BUTTON_BASE, 2, 0x07); /* Resetthe edge capture register. */ IOWR(PUSH_BUTTON_BASE, 3, 0x07); /*Register the interrupt handler. */ alt_ic_isr_register(PUSH_BUTTON_IRQ_INTERRUPT_CONTROLLER_ID,PUSH_BUTTON_IRQ, push_button_isr, edge_capture_ptr, NULL ); } int main() { printf("Hello fromNios II!\n"); usleep(delay); push_button_init(); while(1) { }; return 0; } |