SOC操作步骤
QSYS操作步骤(流水灯例子):1. 创建Quartus II工程,加入开发板(或硬件)的TCL资源文件
2. 启动Qsys
3. 进入Qsys后,加入:Nios II,On-chip Memory,PIO(用于LED驱动),System ID,Timer
4. 在Qsys中连接它们(按照同步电路和加速器原则连接时钟驱动,复位驱动和中断)
5. 在Qsys的Memory中设置复位向量和异常向量所在存储器
6. 在Qsys中的所有组件分配地址,建议采用自动分配方式(【System】-【Assign Base Addresses】)
7. 为Qsys中的PIO生成输出端口(Export中设置)
8. 保存Qsys工程,同时为之命名
9. 生成Qsys工程(在Generation标签页中点击【Generate】)
10. 将生成的Qsys集成到Quartus II中,既可以使用例化,也可以用符号(框图原理图):在Quartus中加入已经生成的.qsys文件
11. 分配管脚,执行时序约束,全编译,下板
12. 启动Eclipse(下拉菜单【Tools】-【Nios II SBT for Eclipse】),工作区建议选择工程文件夹根目录,建议用工程文件夹名作为工作区命名
13. 在Eclipse中生成BSP工程:SBP工程名建议用工程名加上“_BSP”,装入正确的SOPC信息文件,点击【Finish】。成功生成后,在工程浏览器(Project Explorer)中应该看到
14. 在Eclipse中生成APP工程:APP工程名建议用工程名加上“_APP”,指出正确的BSP位置。点击【Finish】。成功生成后,在工程浏览器(Project Explorer)中应该看到
15. 右键点击APP工程,弹出菜单中选择New,新建一个源文件,源文件模板建议采用C模板。为源文件起名,注意加上扩展名:“.c”。点击【Finish】,等待刷Makefile。
16. 测试所生成的APP-BSP是否正确:写一个空的C主程序。建立工程:右键点击APP,在弹出的菜单中选择【Build Project】。注意第一次时间比较长。等待刷Makefile。
17. 写APP程序,右键弹出菜单选择【Build Project】
18. 如果无错误,则可以直接在SBT中运行所编制的C程序:(确认开发板已经下载,电源开着):右键点击APP工程,在弹出菜单中选择【Run As】-【Nios II Hardware】,等待下载启动过程。注意如果JTAG未能够检测到正确的ID和时间戳,则会弹出【Run Configurations ...】窗口,让使用者自己刷连接。
19. 观察硬件(开发板),所编写的C程序应该已经运行(灯在闪烁)
Qsys的维护步骤(QuartusII中没有新的全编译,仅软件修改):
1. 启动Eclipse后,按照正常过程BuildAPP工程和Run(或Debug)
Qsys的维护步骤(QuartusII中修改了硬件和固件,进行了新的全编译,软件修改或升级):
1. 启动Eclipse后,右键点击APP工程,在弹出菜单中选择【Clean Project】,等刷Makefiles
2. 右键点击BSP工程,在弹出菜单中选择【Clean Project】,等刷Makefiles
3. 再次右键点击BSP工程,在弹出菜单中选择【Nios II】-【Generate BSP】,等待刷Makefiles
4. 再次右键点击APP工程,在弹出菜单中选择【Build Project】,重新建立即可
谢谢楼主分享 谢谢分享,不错的资料! 将SBT软件中的存储器初始化到QuartusII中的步骤
1. 在Eclipse中,右键点击APP工程,在弹出菜单中选择【Make Target】-【Build】
2. 在弹出的“Make Targets”窗口中,选择“mem_init_generte”,点击【Build】。则Eclipse将会在software文件夹中生成qip文件
3. 回到QuartusII中,将qip加入到当前工程中
4. 在QuartusII中全编译,下载后的网表中将包括程序的初始化,即编程下载后,目标开发板就开始运行程序。
SOC中的中断服务程序ISR执行步骤
主要的三任务:分别为
1. 编写中断服务程序
2. 在主程序中为中断服务程序注册(给出中断服务程序入口,中断号)
3. 设置中断服务程序与主程序的通信
具体步骤(以定时器中断服务为例):
1. 在进入Eclipse,生成APP以及一个空的主程序后,编写一个定时器的中断服务程序
2. 编写中断服务程序入口,Altera的SOC建议采用如下形式(SBT自动选择注册程序):
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID, PIO_KEY_IRQ,
handle_keys_interrupts, edge_capture_keys_ptr, 0x0);
#else
alt_irq_register(PIO_KEY_IRQ, edge_capture_keys_ptr,
handle_keys_interrupts);
#endif
3. 中断服务程序中,必须具备如下语句:
3.1 如果中断设备有沿捕获,则要写沿捕获寄存器的信息(指针)
其例子为:
volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE);
3.2 中断设备沿捕获寄存器的沿标志清除,例如:
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0);
3.3 建议的一次读中断设备的伪操作,用于延迟中断服务程序的退出,例如:
IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE);
4. 中断注册可以放在需要启动中断的主程序中,建议的中断注册形式为:
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID, PIO_KEY_IRQ,
handle_keys_interrupts, edge_capture_keys_ptr, 0x0);
#else
alt_irq_register(PIO_KEY_IRQ, edge_capture_keys_ptr,
handle_keys_interrupts);
#endif
5. 启动中断之前,必须启动中断设备,包括中断设备的开中断和沿捕获寄存器复位,例如:
///////////////PIO开中断//////////////////
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x3);
///////////////PIO的捕获寄存器复位//////////////////
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x0);