tag 标签: qsys

相关博文
  • 热度 28
    2015-5-26 18:27
    3410 次阅读|
    1 个评论
    近期在用 nios ii 做项目时,发现一个奇怪的现象,在 NIOS II EDS 软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序。经过分析系统可知,系统的硬件设计和 Qsys 系统中 NIOS II CPU 系统的搭建都是没有任何问题的。那么为什么会存在这样的问题呢,这里我先简单介绍下我的系统: 我的系统主要由 NIOS II 最强板 CPU , SDRAM 、预留系统定时器、预留时间戳定时器、 system ID 、 EPCS 控制器以及 JTAG_UART 组成。具体如下图所示(点击图片可查看高清大图): 在 Qsys 环境中,我一开始将 CPU 的复位向量( Reset Vector )设定在了 EPCS 上,然后在 NIOS II EDS 中建立了软件工程,编译,下载运行都没有问题,但是并没有将 fpga 配置文件和代码固化到 EPCS 中去,因此复位时存在问题是肯定的。后来为了调试方便,在 Qsys 系统中将 CPU 的复位向量也修改指向了 SDRAM ,然后在 NIOS II EDS 软件中,重新生成了 BSP 之后,软件的编译,下载运行都没有问题,只是每当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来。 记起去年做毕业设计时,曾经为在含有 EPCS 的系统中无法下载程序的问题苦恼过,当时下载程序时,每次都在进度为 64% 时报如下的错误,“ Nios II ‘Launching New_configuration’ has ecountered a problem.Dowenloading Elf Process failed.” 相信这个报错也是大家最深恶痛绝的(注,此图是我从网上下载的,自己做系统已经很久不出这个问题了,想弄张这样的图片只能百度了): 在网上找了一大堆问题,有说是 SDRAM 相位不对的,这个我以前也确实遇见过不过自从我将 SDRAM 的时钟相移设定为 -90 度后,就基本没遇到过这个问题了。还有说是硬件本身有问题的,这里不排除此种情况,但是我的系统中却并非如此。最终是在新浪博客还是百度空间中的某位前辈的文章中找到的答案我忘记了。当时忘了记下博客地址了,只是将内容复制出来,存了一个 word 文档。现在这篇文档已经能够在百度文库中直接检索到了,尊重他人版权,我这里就只发文章在文库中的地址了: http://wenku.baidu.com/link?url=YOyixrJXWj0ZunlJGqdUFdLv8wkF1KCXxXcEkHGpaulHwlsXPwjR29GxGBxQ-AhMrwot6oKnSziAdDYZrGayB6ZrLu8XaAHmhIikud3wPNC   他的解决方案就是在 BSP editor 中修改了两个与 bootloader 位置相关的选项,将 allow_code_at_reset 和 enable_alt_load 两个选项的勾选取消了,如下图(点击图片可查看高清大图):   该文章中介绍,当创建不带 EPCS 控制器的 NIOS II 系统时,在 NIOS II EDS 中创建工程时, bsp editor 中这两项是勾选上的。当创建了带 EPCS 控制器的 NIOS II 系统时,在 NIOS II EDS 中创建工程时, bsp editor 中这两项是没有勾选上的。由此可知,当复位向量为 SDRAM 时,这两个选项应该勾选上。具体的原因见该文中作者在 Altera 提供的相关手册中找到原始解释。 当我在系统中将此两项勾选上后,再次生成 bsp ,然后编译、下载,处理器就能够正常执行复位了。   小梅哥 2015 年 5 月 26 日于北京至芯科技  
  • 热度 25
    2014-8-6 10:18
    3041 次阅读|
    0 个评论
      1、 SOPC(System On a Programmable Chip.)即可编程片上系统,SOPC Builder是Quartus II中传统的Nios II 硬件设计工具,可以灵活定制NiosII CPU的许多特性甚至指令,可使用Altera公司提供的大量IP核来加快开发Nios II外设的速度,提高外设性能,也可以使用第三方的IP核或VHDL来自行定制外设。完成Nios II的硬件开发后,SOPC Buider可自动生成与自定义的Nios II CPU和外设系统、存储器、外设地址映射等相应的软件开发包SDK。在生成的SDK基础上,启动Nios II IDE(传统的)或 Nios II SBT for Eclipse(7.0版本以后的)进入Nios II软件开发流程。用户可使用汇编或C,甚至C++来进行嵌入式程序设计,使用GNU工具或其它第三方工具进行程序的编译连接以及调试。   2、 Qsys是Altera公司为Quartus II 10.0版本推出的新的嵌入式处理器硬件设计工具,Qsys系统级集成工具可以使嵌入式设计人员面向Nios II, 以及基于ARM或MIPS的嵌入式处理器和可配置Intel Atom处理器开始硬件设计。Qsys利用了业界首创的FPGA优化芯片网络技术来支持多种业界标准IP协议,提高了结果质量,具有很高的效能。Qsys采用类似SOPC Builder的界面,支持与现有嵌入式系统移植的后向兼容。而且,这一高级互联技术将支持分层设计、渐进式编译以及部分重新配置方法。 Qsys是Altera SOPC Builder工具的后续产品,引入了FPGA优化芯片网络技术,与SOPC Builder相比,存储器映射和数据通路互联性能提高至两倍,SOPC Builder适合单层次设计,而Qsys提高了系统级设计效能,适合多层次设计,并且,Qsys支持业界标准IP接口,如AMBA,使之可以支持设计重用。   3、 Altera公司建议用户从Quartus II 10.0版本开始使用Qsys设计Nios II硬件系统, 老版本SOPC Builder的设计可以移植到Qsys,具体参考Altera的“SOPC Builder to Qsys Migration Guidelines”(AN-632-2.0,SOPC Builder到Qsys移植指南)。
  • 热度 18
    2012-9-19 22:04
    2403 次阅读|
    3 个评论
    uC/OS-II总是运行进入就绪态任务中优先级最高的任务。确定哪个优先级最高,下面要由哪个任务运行了,这一工作是由任务调度函数OS_Sched (void)完成的。当前就绪任务要交出CPU控制权并进行任务切换的相关操作都调用了OS_Sched (void)函数。 如图1所示,当前运行态任务交出CPU控制权必须是以下某个函数被调用或某事件发生:OSFlagPend()、OSMboxPend()、OSMutexPend()、OSQPend()、OSSemPend()、OSTaskSuspend()、OSTimeDly()、OSTimeDlyHMSM()、OSTaskDel()或中断等。 图1 我们来看看OS_Sched (void)函数的程序:   以下是代码片段: //*_bsp→UCOSII→src→os_core.c void  OS_Sched (void) { #if OS_CRITICAL_METHOD == 3    /* Allocate storage for CPU status register */     OS_CPU_SR  cpu_sr = 0; #endif     OS_ENTER_CRITICAL();     if (OSIntNesting == 0) {  /* Schedule only if all ISRs done and ... */         if (OSLockNesting == 0) { /* ... scheduler is not locked */             OS_SchedNew();             if (OSPrioHighRdy != OSPrioCur) {                      /* No Ctx Sw if current task is highest rdy */                 OSTCBHighRdy = OSTCBPrioTbl ; #if OS_TASK_PROFILE_EN 0     OSTCBHighRdy-OSTCBCtxSwCtr++;  /* Inc. # of context switches to this task */ #endif                 OSCtxSwCtr++;   /* Increment context switch counter  */                 OS_TASK_SW();   /* Perform a context switch  */             }         }     }     OS_EXIT_CRITICAL(); } 在该函数中,简单的讲,只是做了两件事,首先找出当前优先级最高的就绪任务(也可能是运行态任务本身),其次调用了任务级的任务切换函数OS_TASK_SW(),由此进行切换任务间的出栈入栈操作,并模拟一次CPU中断完成任务切换。 任务级的任务切换函数OS_TASK_SW()首先对当前运行任务在CPU寄存器中的现场进行保存,即入栈;其次把即将运行的就绪态任务上一次运行时的现场恢复到当前CPU寄存器中,即出栈,注意每个任务都有自己专属的堆栈区;最后使用软中断指令或陷阱TRAP人为模拟一次中断产生,从而让这个中断返回的时候顺利的从原任务程序中切换到了新任务程序中(因为当前CPU寄存器的现场已经从原任务的变成了新任务的)。 OS_TASK_SW()实际上是个宏调用,而OSCtxSw(void)函数通常是汇编语言编写的,因为C编译器通常不支持C语言直接操作CPU的寄存器。   以下是代码片段: //*_bsp→HAL→inc→os_cpu.h #define  OS_TASK_SW           OSCtxSw void OSCtxSw(void); OSCtxSw(void)函数程序如下: //*_bsp→HAL→src→os_cpu_a.S /********************************************************************************* *   PERFORM A CONTEXT SWITCH *   void OSCtxSw(void)    - from task level *   void OSIntCtxSw(void) - from interrupt level * * Note(s): 1) Upon entry, *             OSTCBCur     points to the OS_TCB of the task to suspend *             OSTCBHighRdy points to the OS_TCB of the task to resume * ********************************************************************************/ .global OSIntCtxSw .global OSCtxSw OSIntCtxSw: OSCtxSw: /* * Save the remaining registers to the stack. */ addi sp, sp, -44 #ifdef ALT_STACK_CHECK bltu  sp, et, .Lstack_overflow #endif #if OS_THREAD_SAFE_NEWLIB ldw r3, %gprel(_impure_ptr)(gp)   /* load the pointer */ #endif /* OS_THREAD_SAFE_NEWLIB */ ldw r4, %gprel(OSTCBCur)(gp) stw ra,  0(sp) stw fp,  4(sp) stw r23, 8(sp) stw r22, 12(sp) stw r21, 16(sp) stw r20, 20(sp) stw r19, 24(sp) stw r18, 28(sp) stw r17, 32(sp) stw r16, 36(sp) #if OS_THREAD_SAFE_NEWLIB /* * store the current value of _impure_ptr so it can be restored * later; _impure_ptr is asigned on a per task basis. It is used * by Newlib to achieve reentrancy. */ stw r3, 40(sp)                  /* save the impure pointer */ #endif /* OS_THREAD_SAFE_NEWLIB */ /* * Save the current tasks stack pointer into the current tasks OS_TCB. * i.e. OSTCBCur→OSTCBStkPtr = sp; */ stw sp, (r4)                  /* save the stack pointer (OSTCBStkPtr */ /* is the first element in the OS_TCB  */ /* structure.                          */ /* * Call the user definable OSTaskSWHook() */ call OSTaskSwHook 0: 9: /* * OSTCBCur = OSTCBHighRdy; * OSPrioCur = OSPrioHighRdy; */ ldw r4, %gprel(OSTCBHighRdy)(gp) ldb r5, %gprel(OSPrioHighRdy)(gp) stw r4, %gprel(OSTCBCur)(gp) /* set the current task to be the new task */ stb r5, %gprel(OSPrioCur)(gp) /* store the new task's priority as the current */ /* task's priority   */ /* * Set the stack pointer to point to the new task's stack */ ldw sp, (r4) /* the stack pointer is the first entry in the OS_TCB structure */ #if defined(ALT_STACK_CHECK) (OS_TASK_CREATE_EXT_EN 0) ldw et, 8(r4)                  /* load the new stack limit */ #endif #if OS_THREAD_SAFE_NEWLIB /* * restore the value of _impure_ptr ; _impure_ptr is asigned on a * per task basis. It is used by Newlib to achieve reentrancy. */ ldw r3, 40(sp)                  /* load the new impure pointer */ #endif /* OS_THREAD_SAFE_NEWLIB */ /* * Restore the saved registers for the new task. */ ldw ra,  0(sp) ldw fp,  4(sp) ldw r23, 8(sp) ldw r22, 12(sp) ldw r21, 16(sp) ldw r20, 20(sp) ldw r19, 24(sp) ldw r18, 28(sp) ldw r17, 32(sp) ldw r16, 36(sp) #if OS_THREAD_SAFE_NEWLIB stw r3, %gprel(_impure_ptr)(gp) /* update _impure_ptr */ #endif /* OS_THREAD_SAFE_NEWLIB */ #if defined(ALT_STACK_CHECK) (OS_TASK_CREATE_EXT_EN 0) stw et, %gprel(alt_stack_limit_value)(gp) #endif addi sp, sp, 44 /* * resume execution of the new task. */ ret #ifdef ALT_STACK_CHECK .Lstack_overflow: break 3 #endif .set OSCtxSw_SWITCH_PC,0b-OSCtxSw 这个OS_TASK_SW()函数貌似非常神秘,毕竟是用汇编语言写的,估计大伙都看不懂。不过没有关系,它在做的事情也并不神秘。正如我们前面所言,它首先模拟产生一次软中断,接着让当前运行的任务入栈,让即将运行的最高优先级的就绪态任务出栈,就此完成CPU寄存器现场的转换(偷梁换柱的精髓就在此),最后执行一条ret指令表示前面的软中断程序已经执行完毕,返回(即进入新的任务执行程序)。 关于软中断如何产生,开始也让笔者非常纳闷,教科书上总是非常学术的告诉我们“使用软中断指令或陷阱TRAP人为模拟一次中断产生”,而理论上这个软中断或TRAP指令应该是一条简单的汇编指令而已,但在NIOS II中移植的这个OS_TASK_SW()函数中却没能找到,整个函数寻觅下来好像真没有哪条指令看上去像软中断或TRAP指令,找遍NIOS II Processor Reference Handbook也没能看到哪条指令能够完成软中断或TRAP的功能。在原作者的《嵌入式实时操作系统uC/OS-II(第2版)》第14章给出的80x86上移植的OS_TASK_SW()函数实例中也没有找到类似的指令,其操作程序和NIOS II中移植的大同小异,那到底怎么回事? 有意思的是,最一篇讲述软中断指令的文章(http://course.cug.edu.cn/21cn/微机原理与应用/0329.htm)中找到了蛛丝马迹,这里提出了8086/8088中软中断的助记符为INT OPR,并且给出了这条指令实际运行状况却是多个相关寄存器的“躲闪腾挪”后完成的。那么回头看作者给出的80x86和NIOS II移植程序,虽然没有和INT OPR类似的专用的软中断指令,但函数里面某些指令操作却同样能够完成软中断这个动作。 参考资料: 1.       《嵌入式实时操作系统uC/OS-II(第2版)》91页:3.05 任务调度。 2.       《嵌入式实时操作系统uC/OS-II(第2版)》92页:3.06 任务级的任务切换,OS_TASK_SW()。 3.       《嵌入式实时操作系统uC/OS-II(第2版)》355页:14.05.02 OSCtxSw()。 4.       Altera Nios II 11.0 Software Build Tools for Eclipse的模板uC/OS-II工程。
  • 热度 22
    2012-9-6 08:51
    2916 次阅读|
    2 个评论
    Qsys与uCOS学习笔记3:Hello uC/OS-II uC/OS-II(又名Micro C/OS)是基于嵌入式系统的完整的,可移植、可固化、可裁剪的可剥夺型实时内核,其已经广泛应用在航空飞行器、医疗设备、工业控制等可靠性和稳定性要求较高的场合。该内核的代码也是完全开源的,如果不做商业用途,完全免费。因此对于广大的嵌入式爱好者与工程师们而言,了解OS从uC/OS-II开始不失为一个很好的选择。 之前是使用特权同学自己的SF-NIOS2开发套件进行了EDS上的uC/OS-II样板工程测试,为了当前学习笔记的持续性,这里重新就DE2-115板重新整理一个Hello uC/OS-II实例的创建和演示。   Qsys组件添加 在一个工程实例基础上,添加一个Interval Timer外设,设置该Timer的定时Period为10ms,用于作为uC/OS-II的时钟节拍(Clock tick),如图1所示。 图1   修改该Timer外设名称为ucosii_timer。将它的clk和reset信号分别连接到clk组件的clk和clk_reset信号上,将它的Avalon从机接口s1连接到nios_qsys_0的data_master上,并将它的irq连接到nios_qsys_0的d_irq上。 图2   自动分配地址,点击SystemàAssign Base Addresses。自动分配中断向量号,点击SystemàAssign Interrupt Numbers,接着点击Generate生成新的系统。 完成Qsys新系统的Generate,接着重新编译Quartus II的project。自此,硬件的修改已经就绪。   软件工程创建 如图3所示,打开EDS后,点击FileàNewàNios II Application and BSP from Template新建模板工程。 图3 如图4所示,在新建工程向导中,选择SOPC Information File name为当前工程目录下的sopcinfo文件。Project name命名为ucosii_swprj,选择Project template为Hello MicroC/OS II。最后点击Finish创建工程。 图4 新建工程出现在工程管理窗口后,右键单击ucosii_swprj文件夹,选择NIOS IIàBSP Editor,如图5所示。 图5 如图6所示,确定Main页面中Common里面的stderr/stdin/stdout均为jtag_uart,ucosii_timer为sys_clk_timer即可。点击Generate更新设置。 图6 右键点击应用工程,选择Build Project进行软件工程编译。完成后Console窗口打印如图7所示的信息,可见这个uC/OS-II内核以及软件的HAL占用了大约94KB的存储空间,uC/OS-II其实还是很小的,只不过NIOS II各种外设的HAL比较大,不过也都是可以裁剪的。 图7 uC/OS-II运行调试 首先将Quartus II工程产生的sof硬件配置文件烧录到FPGA中。 接着应用工程上点击右键弹出菜单选择Run asàNios II Hardware,在线运行uC/OS-II实例工程。 这个uC/OS-II工程的实验目的只是创建两个task分别打印一串字符,正如readme所描述: Readme - Hello MicroC/OS-II Hello Software Example Hello_uosii is a simple hello world program running MicroC/OS-II.  The purpose of the design is to be a very simple application that just demonstrates MicroC/OS-II running on NIOS II.  The design doesn't account for issues such as checking system call return codes. etc. 在NIOS II Console中,我们可以看到最终运行的效果,如图8所示,两个任务所打印的字符串”Hello from task1”和”Hello from task2”循环出现。 主要实例源码如下:   #include #include "includes.h" /* Definition of Task Stacks */ #define   TASK_STACKSIZE       2048 OS_STK    task1_stk ; OS_STK    task2_stk ; /* Definition of Task Priorities */ #define TASK1_PRIORITY      1 #define TASK2_PRIORITY      2 /* Prints "Hello World" and sleeps for three seconds */ void task1(void* pdata) { while (1) { printf("Hello from task1\n"); OSTimeDlyHMSM(0, 0, 3, 0); } } /* Prints "Hello World" and sleeps for three seconds */ void task2(void* pdata) { while (1) { printf("Hello from task2\n"); OSTimeDlyHMSM(0, 0, 3, 0); } } /* The main function creates two task and starts multi-tasking */ int main(void) { OSTaskCreateExt(task1, NULL, (void *)task1_stk , TASK1_PRIORITY, TASK1_PRIORITY, task1_stk, TASK_STACKSIZE, NULL, 0); OSTaskCreateExt(task2, NULL, (void *)task2_stk , TASK2_PRIORITY, TASK2_PRIORITY, task2_stk, TASK_STACKSIZE, NULL, 0); OSStart(); return 0; } 源码中,一个标准的uC/OS-II工程,如图9所示,初始化时调用OSInit();函数;接着调用OSTaskCreate();或OSTaskCreateExt();函数创建用户任务;最后调用OSStart();函数运行任务。这里的main函数里虽然没有出现OSInit();函数,但实际上在HAL后台外设初始化时候肯定调用了。中间是任务的创建,这里创建两个任务task1和task2,优先级分别为1和2,并且分配了相应的堆栈空间。在两个任务中,分别打印字符串”Hello from task1”和”Hello from task2”,字符串打印后调用OSTimeDlyHMSM(0, 0, 3, 0);函数做了3s的延时。如果修改这个延时时间,打印效果会发生改变,根据延时的情况,Console窗口出现的打印字样频率和速度会不一样。   图9 前面提到我们的实例其实是有OSInit();函数存在的,而且是在系统的main();函数之前就调用了。这里也探个究竟,也算是给大家讲讲NIOS II的软件执行顺序吧。NIOS II软件在上电后其实并非如同一帮的裸奔的嵌入式软件一样直接从main();函数开始执行程序,而是先执行HAL里面的alt_main();函数,这个函数在bsp工程下的HALàsrc里面,找到名为alt_main();的函数便是。 图10 打开alt_main.c源代码文件后,如图11所示,alt_main();函数中执行了Qsys系统的几乎所有可用外设的初始化,因为我们这个模板工程用的是uC/OS-II的例子,所以必有其初始化,图11中的ALT_OS_INIT();便是。如果右击该函数,选择Open Declaration,则我们便能看到这样的定义: #define ALT_OS_INIT()    OSInit(); 图11 再来简单的熟悉一下这个模板工程中所涉及的几个函数,包括OSInit();函数、OSTaskCreate();函数、OSTaskCreateExt();函数、OSStart();函数。 OSInit();函数 void  OSInit (void) 在使用uC/OS-II的任何功能之前,必须调用该函数。该函数建立了两个任务:空闲任务——在所有其他任务均未就绪时运行;统计任务——计算CPU的利用率。此外,该函数也对uC/OS-II所有的变量和数据结构进行初始化。 OSTaskCreate();函数 INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio) 除了OSInit();函数执行时为系统建立的2个基本任务(优先级最低的2个任务),uC/OS-II建议用户另外保留2个优先级最低的任务和4个优先级最高的任务,为了将来的内核升级只用,当然了,其实也可以不保留。所以,通常来讲,用户至少可以建立56个任务。 OSTaskCreate();函数有4个入口参数,其含义分别为:task是指向任务代码的指针;p_arg是任务开始执行时,传递给任务的参数的指针;ptos是分配给任务的堆栈的栈顶指针;prio是分配给任务的优先级。 OSTaskCreateExt();函数 INT8U  OSTaskCreateExt (void   (*task)(void *p_arg), void    *p_arg, OS_STK  *ptos, INT8U    prio, INT16U   id, OS_STK  *pbos, INT32U   stk_size, void    *pext, INT16U   opt) OSTaskCreateExt();函数其实是OSTaskCreate();函数的扩展,前4个参数的定义用法完全一致,后面5个入口参数的定义为:id是为要建立的任务创建一个特殊标志符,主要是保留为了将来内核升级使用,当前只要将此参数值设置成和任务的优先级一样就行;pbos指向任务堆栈栈底的指针,用于堆栈的检验;stk_size用于指定堆栈的容量;pext指向用户附加的数据域的指针,用来扩展任务的任务控制块OS_TCB;opt用于设定OSTaskCreateExt();的选项,指定是否允许堆栈的检验,是否将堆栈清0,任务是否要进行浮点操作等。 OSStart();函数 void OSStart (void) 该函数负责从任务就绪表中找出用户建立的优先级最高的任务控制块,并开始执行这个任务。调用该函数后,软件就将控制权交给了uC/OS-II的内核,开始运行多任务。在调用该函数之前,必须先建立一个任务,否则,应用程序将会崩溃。 NIOS II上的uC/OS-II移植,其实就这么简单。当然了,如果要不断的深入进去,一定大有学问。
  • 热度 26
    2012-4-19 09:39
    3208 次阅读|
    0 个评论
    FPGA器件密度提高到百万逻辑单元,设计团队需要实现更大更复杂的系统,并在更短的时间内满足越来越高的性能需求。相应的,FPGA设计面临着三个最为突出的问题,即:设计团队规模越来越大、需要花费很多时间来尝试重新使用其他人的设计、需要花费大量时间来进行验证。   为了应对不断增长的复杂性,如何切实可行地提升设计效能成为业界共同探索的一个问题。Altera亚太区产品市场经理解晓东介绍,提高设计抽象级即相当于提高了设计效能。随着器件容量的增加、设计复杂度的增加,设计抽象级从门级发展到了寄存器传送级(RTL),又向IP级、系统级演变,Altera的开发工具也从原理图输入向Quartus II综合、SoPC Builder进阶。如今,SoPC Builder的下一代产品Qsys更是以不可阻挡的姿态出现在业界。   Altera亚太区产品市场经理解晓东   Qsys系统集成工具是Quartus II开发软件的一部分,它采用业界首创的FPGA优化芯片网络技术,能够提供存储器映射和数据通路互联。相比其前身SOPC Builder,Qsys的性能几乎提高至两倍,同时支持业界标准IP接口,例如AMBA。Qsys将采用使用方便的SoPC Builder界面,支持与现有嵌入式系统移植的后向兼容。而且,这一高级互联技术将支持分层设计、渐进式编译以及部分重新配置方法。Qsys可提高设计抽象级,自动生成互联,使用标准接口,为设计人员大幅缩短了开发时间,增强了设计重用性。   攻克设计规模难题   下图鲜明地展示了Qsys给系统设计带来的好处。图中绿色部分表示标准内核,是一个将标准IP进行组合的搭积木的过程。蓝色部分表示胶合逻辑,需要进行仲裁、中断控制、带宽匹配等工作。橙色部分则表示定制逻辑,它与标准模块不同,可根据设计需求进行差异化开发,许多拥有IP的公司最关心的正是这一部分的设计。在不使用Qsys的情况下,这三部分工作都需要进行匹配。但有了Qsys以后,它的兼容IP和互联特性可分担标准内核和胶合逻辑方面的工作,使设计人员将更多的精力集中在定制逻辑上,创造差异化的价值。   Qsys目前可提供超过一百个兼容IP,如:接口协议IP(PCIe、TSE)、存储器IP(DDR/DDR2/DDR3)、视频和图像处理(VIP)IP(VIP套装包括:缩放器、矩阵、去隔行器以及alpha混合合成器)、嵌入式IP(JTAG、UART、SPI、RS232)以及多种处理器IP。   值得一提的是,Qsys几乎可支持所有常用的嵌入式处理器,例如基于ARM Cortex A9的SoC FPGA和基于Nios II的软核处理器,以及Altera嵌入式联盟所提供的其他处理器(如:MIPS MP32、ARM Cortex-M1、Nios II SC DO-254以及Freescale ColdFire V1等)。解晓东介绍,软核处理器可通过FPGA模拟CPU,其优点在于占用资源少,25K逻辑单元可放置几十个处理器,若用户对性能要求有差异,Altera软核有三档配置可满足不同需求。     此外,Qsys可完成自动集成任务,在运用标准IP加速开发的同时,其GUI界面支持快速集成,避免了繁琐而又容易出错的集成任务。   攻克设计重用难题   设计重用是提升效率的有效环节,但是它通常会导致以下问题:设计者需重新设计接口;设计者需对各种修改过的设计提供支持;在没有文档记录的情况下,其他人不得不搞清楚接口是怎样工作的。针对这些问题,Qsys进行了优化,其片上网络架构可完成无线接口的互连,它支持标准接口,例如Altera的Avalon接口、ARM的AMBA  AXI接口,具有经过维护的可用的文档,用户不需进行重新设计接口的工作。解晓东强调,在设计重用方面,业界多数工具(包括SoPC Builder在内)只能做到IP级,而Qsys是唯一可做到子系统级别的工具。     设计重用的另一个特性是:在设计重复使用流程时,可将RTL设计导入Qsys,作为其中一个IP来用。通过将低层次的抽象设计放到高层次Qsys中,可将文本格式编写的代码引入Qsys,打包后生成接口,在标准库中生成设计模块,从而在设计中重用这些模块,整个过程是非常容易操作的图形化过程。解晓东补充,SoPC Builder是完全平铺式的设计流程,对于一些复杂的设计而言,界面拉得很长,不便于查找设计问题;而Qsys可将一些IP进行子系统打包,使设计更具层次性。这对于一些国际化的公司非常实用,便于他们在全球范围内共享设计,进行重用。   攻克验证难题   如果说设计过程是充满了创造力的愉悦享受,验证过程相比就乏味了很多。基于寄存器的调试需要逐个去查询寄存器,工作量非常庞大,也存在着很多的不确定性。Qsys采用了系统控制台的调试工具,去对地址位置进行读写操作,而非对每个寄存器都读写,通过在总线系统上读写可快速锁定问题出现在哪个模块,从而加快验证进程。此外,Qsys提供定制的、图形化的界面,方便易用,使调试过程不再枯燥。   亚太区Qsys研讨会巡回举行中 为帮助用户更快、更好地了解Qsys,今年3月至6月,Altera在亚太区15个城市巡回举办“采用Qsys实现系统集成研讨会”,通过技术演讲、技术演示、实践练习等方式,与会者可以观看基于Qsys的PCIe至DDR3设计演示,并通过实践练习来开发设计,体验Qsys如何大幅提升设计效能。这一研讨会已有超过200名工程师参加,现正接受网上注册。下图为在北京清华大学实验室的研讨会现场。   相关链接: 注册可点击 http://www.altera.com.cn/education/events/evt-qsys-workshop.html 关于Qsys系统集成工具,更多信息可访问 http://www.altera.com.cn/products/software/quartus-ii/subscription-edition/qsys/qts-qsys.html 在FPGA系统设计上发挥芯片网络体系架构的优势(白皮书) http://www.altera.com.cn/literature/wp/wp-01149-noc-qsys_CN.pdf SoPC Builder至Qsys移植指南 http://www.altera.com.cn/literature/an/an632.pdf PCIe DDR3参考设计 http://www.altera.com/support/refdesigns/ip/interface/ref-pciexpress-ddr3-sdram.html  
相关资源