课程目标:学习并掌握完整的SOPC开发流程。

开发环境:Quartus15.1

学习内容:1、使用QSYS工具建立能够运行流水灯项目的NIOS II处理器系统

     2、在quartus ii中添加NIOS II 系统文件(完成SOPC系统搭建);

     3、在nios II EDS中创建NIOS ii软件工程,实现流水灯代码;

     4、在开发板上运行流水灯程序。

设计流程:

创建一个新的project 工程

新建一个GHRD.v顶层文件

打开QSYS

选择最新的NIOS II CPU 核

由于是第一次使用NIOS ii 的CPU 核,所以选择默认的设置点击finish即可

添加on-chip-ram作为CPU的运行内存

修改一下内存大小,保证内存足够大

添加只输出型的四位PIO

同样,将其重命名为易观察的名字

主要单元添加完毕后,即可进行总线类型的连接了

首先是数据总线主机与从机相连

然后是指令总线与从机存储数据的模块的数据总线相连

连接时钟

创建全局复位网络

连接完毕后的连接图

导出PIO信号

分配基地址

此时,警告框还是有两个错误,这是因为,在设置CPU时,没有设置复位地址和异常地址,双击nios2_gen2_0,将vector指向指令存储器

保存并生成.qsys文件

生成HDL文件

生成例化模板

点击copy,将内容粘贴到之前创建的GHRD的顶层文件中

至此,系统的NIOS II处理器就搭建完成了

下面就是对SOPC系统进行完善,在quartus II 软件中添加NIOS ii处理器系统并分配引脚

添加quartus II处理器系统QSYS文件

对顶层的GHRD文件进行编写

  1. module GHRD(
  2. clk50m,
  3. rst_n,
  4. led,
  5. );
  6. input clk50m;
  7. input rst_n;
  8. output [:]led;
  9. cpu u0 (
  10. .clk_clk (clk50m), // clk.clk
  11. .reset_reset_n (rst_n), // reset.reset_n
  12. .pio_led_export (led) // pio_led.export
  13. );
  14.  
  15. endmodule

编译完成了可以对比编译结果查看自己所用的FPGA,观察逻辑结构是否够用,由图可知是够用的。

分配引脚

编写EDS代码

打开后将工作空间设置到GHRD开发环境的工作空间

新建一个模板工程

led_run_bsp的板级支持包的工程结构

为了保证工程在后面可以直接调用,这里新建一个文件夹来编写代码

在文件夹下创建两个文件夹啊inc(存放头文件.h)src(存放源文件.c)

创建一个.h文件

编写led.h代码

  1. #ifndef LED_H_
  2. #define LED_H_
  3.  
  4. #include"system.h"
  5. #include"altera_avalon_pio_regs.h"
  6. #include"alt_types.h"
  7.  
  8. typedef void *LED_HANDLE;
  9.  
  10. typedef struct{
  11.  
  12. alt_u32 led_base;
  13. alt_u32 led_data;
  14.  
  15. }CoreCourse_LED;
  16.  
  17. #define LED_ALL_OFF 0xffffffff
  18.  
  19. #define LED0 0x00000001
  20. #define LED1 0x00000002
  21. #define LED2 0x00000004
  22. #define LED3 0x00000008
  23. /*
  24. #define LED4 0x00000010
  25. #define LED5 0x00000020
  26. #define LED6 0x00000040
  27. #define LED7 0x00000080
  28. #define LED8 0x00000100
  29. #define LED9 0x00000200
  30. #define LED10 0x00000400
  31. #define LED11 0x00000800
  32. #define LED12 0x00001000
  33. #define LED13 0x00002000
  34. #define LED14 0x00004000
  35. #define LED15 0x00008000
  36. #define LED16 0x00010000
  37. #define LED17 0x00020000
  38. #define LED18 0x00040000
  39. #define LED19 0x00080000
  40. #define LED20 0x00100000
  41. #define LED21 0x00200000
  42. #define LED22 0x00400000
  43. #define LED23 0x00800000
  44. #define LED24 0x01000000
  45. #define LED25 0x02000000
  46. #define LED26 0x04000000
  47. #define LED27 0x08000000
  48. #define LED28 0x10000000
  49. #define LED29 0x20000000
  50. #define LED30 0x40000000
  51. #define LED31 0x80000000
  52. */
  53.  
  54. LED_HANDLE LED_Init(const alt_u32 led_base);
  55. void LED_Off(CoreCourse_LED *p, alt_u32 ledx);
  56. void LED_On(CoreCourse_LED *p, alt_u32 ledx);
  57. void LED_Toggle(CoreCourse_LED *p, alt_u32 ledx);
  58. void LED_WriteData(CoreCourse_LED *p, alt_u32 leds);
  59.  
  60. #endif /* LED_H_ */

创建一个.c空文件

同样编写led.c代码

  1. #include "led.h"
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. /******************************************************************************
  6. * 函数名 : LED_Init
  7. * 描述 : 初始化LED结构体并返回结构体指针地址
  8. * 输入 : led_base ,system.h中定义的LED的基地址
  9. * 输出 : 无
  10. * Return :经过初始化的LED结构体指针
  11. *******************************************************************************/
  12. LED_HANDLE LED_Init(const alt_u32 led_base) {
  13.  
  14. CoreCourse_LED *p;
  15.  
  16. p = malloc(sizeof(CoreCourse_LED));
  17. if (!p)
  18. return p;
  19.  
  20. memset(p, , sizeof(CoreCourse_LED));
  21.  
  22. p->led_base = led_base;
  23. p->led_data = 0xffffffff;
  24.  
  25. IOWR_ALTERA_AVALON_PIO_DATA(p->led_base, p->led_data);
  26.  
  27. return p;
  28. }
  29.  
  30. /******************************************************************************
  31. * 函数名 : LED_Off
  32. * 描述 : 关闭一个或多个LED
  33. * 输入 : p ,LED结构体指针
  34. * :LEDx,需要关闭的LED
  35. * 输出 : 无
  36. * Return :无
  37. *******************************************************************************/
  38. void LED_Off(CoreCourse_LED *p, alt_u32 ledx) {
  39. p->led_data = p->led_data | ledx;
  40. IOWR_ALTERA_AVALON_PIO_DATA(p->led_base, p->led_data);
  41. }
  42.  
  43. /******************************************************************************
  44. * 函数名 : LED_On
  45. * 描述 : 打开一个或多个LED
  46. * 输入 : p ,LED结构体指针
  47. * :LEDx,需要打开的LED
  48. * 输出 : 无
  49. * Return :无
  50. *******************************************************************************/
  51. void LED_On(CoreCourse_LED *p, alt_u32 ledx) {
  52. p->led_data = p->led_data & (~ledx);
  53. IOWR_ALTERA_AVALON_PIO_DATA(p->led_base, p->led_data);
  54. }
  55.  
  56. /******************************************************************************
  57. * 函数名 : LED_Toggle
  58. * 描述 : 翻转一个或多个LED
  59. * 输入 : p ,LED结构体指针
  60. * :LEDx,需要翻转的LED
  61. * 输出 : 无
  62. * Return :无
  63. *******************************************************************************/
  64. void LED_Toggle(CoreCourse_LED *p, alt_u32 ledx) {
  65. p->led_data ^= ledx;
  66. IOWR_ALTERA_AVALON_PIO_DATA(p->led_base, p->led_data);
  67. }
  68.  
  69. /******************************************************************************
  70. * 函数名 : LEDS_WriteData
  71. * 描述 : 直接控制所有LED的状态,输入的LED将被点亮,未输入的将被关闭
  72. * 输入 : p ,LED结构体指针
  73. * :LEDx,需要点亮的LED
  74. * 输出 : 无
  75. * Return :无
  76. *******************************************************************************/
  77. void LED_WriteData(CoreCourse_LED *p, alt_u32 leds){
  78. p->led_data = leds;
  79. IOWR_ALTERA_AVALON_PIO_DATA(p->led_base, p->led_data);
  80. }
  81.  
  82. /* main函数中初始化示例代码
  83. *
  84. * LED_HANDLE hLED;
  85. hLED = LED_Init(PIO_LED_BASE);
  86. if (!hLED) {
  87. // printf("Failed to init LED\n");
  88. }
  89. */
  90.  
  91. /* LED_WriteData()函数使用示例代码
  92. *
  93. *LED_WriteData(hLED, LED0 | LED2); //LED0和LED2点亮,LED1和LED3关闭
  94. }
  95. */
  96.  
  97. /* LED_On()函数使用示例代码
  98. *
  99. *LED_On(hLED, LED0 | LED2); //点亮LED0和LED2
  100. }
  101. */
  102.  
  103. /* LED_Off()函数使用示例代码
  104. *
  105. *LED_Off(hLED, LED1 | LED3); //熄灭LED1和LED3
  106. }*/
  107.  
  108. /* LED_Toggle()函数使用示例代码
  109. *
  110. *LED_Toggle(hLED, LED3); //翻转LED3
  111. }*/

将helloworld.c文件更改为main.c文件,并编写main.c

  1. /********************************************************************
  2. * 文 件 名:main.c
  3. * 功 能:LED显示控制。
  4. * 通过PIO直接控制4个LED产生亮灭效果
  5. * 说 明:
  6. *
  7. ********************************************************************/
  8. #include "system.h"
  9. #include "altera_avalon_pio_regs.h"
  10. #include "alt_types.h"
  11. #include "led.h"
  12.  
  13. /******************************************************************************
  14. * 函数名 : DelayNs
  15. * 描述 : 简易延时
  16. * 输入 : 需要延时的数值
  17. * 输出 : 无
  18. * Return :无
  19. *******************************************************************************/
  20. void DelayNs(alt_u32 i)
  21. {
  22. while (i--)
  23. ;
  24. }
  25.  
  26. /********************************************************************
  27. * 名 称:main()
  28. * 功 能:使用所有LED API控制LED运行
  29. ********************************************************************/
  30. int main(void) {
  31. alt_u32 i;
  32. //volatile alt_u32 j;
  33.  
  34. LED_HANDLE hLED;
  35. hLED = LED_Init(PIO_LED_BASE);
  36. if (!hLED) {
  37. // printf("Failed to init LED\n");
  38. }
  39.  
  40. while () {
  41. //测试LED_WriteData函数功能
  42. i = ;
  43. while (i--){
  44. LED_WriteData(hLED, LED0 | LED2); //LED1和LED3点亮,LED0和LED2关闭
  45. DelayNs();
  46.  
  47. LED_WriteData(hLED, LED1 | LED3); //LED0和LED2点亮,LED1和LED3关闭
  48. DelayNs();
  49. }
  50.  
  51. LED_WriteData(hLED, LED_ALL_OFF); //关闭所有的LED
  52.  
  53. DelayNs();
  54.  
  55. //测试LED_On函数和LED_Off函数功能
  56. i = ;
  57. while (i--){
  58. LED_On(hLED, LED0 | LED2); //点亮LED0和LED2
  59. DelayNs();
  60.  
  61. LED_On(hLED, LED1 | LED3); //点亮LED1和LED3
  62. DelayNs();
  63.  
  64. LED_Off(hLED, LED0 | LED2); //熄灭LED0和LED2
  65. DelayNs();
  66.  
  67. LED_Off(hLED, LED1 | LED3); //熄灭LED1和LED3
  68. DelayNs();
  69. }
  70.  
  71. LED_WriteData(hLED, LED_ALL_OFF); //关闭所有的LED
  72.  
  73. //测试LED_Toggle函数功能
  74. i = ;
  75. while (i--){
  76. LED_Toggle(hLED, LED3); //翻转LED3
  77. DelayNs();
  78. }
  79. }
  80. return ;
  81. }

添加led_run_bsp的路径

添加led.h的路径

对工程进行编译

将quartus之前生成的.sof文件烧写到FPGA开发板中,然后在NIOS ii中选择进行仿真运行

等待一会后会弹出如下界面,之后可以按照keil仿真的方法进行

实验现象http://v.youku.com/v_show/id_XMjk0NDQwOTQyOA==.html?spm=a2h3j.8428770.3416059.1

本文的源代码将在下篇文章上传,并讲解如何将别人的NIOS ii工程转换成自己开发可以使用的工程。

完整的SOPC开发流程体验的更多相关文章

  1. 一款APP的完整开发流程 (转载)

    来源:https://www.sohu.com/a/239089829_100063940 近年来,在市场和政策的双轮驱动下,我国服务外包产业快速发展,服务智能化趋势显现.随着企业核心业务外包活动的日 ...

  2. MVC5+EF6 入门完整教程3 :EF完整开发流程

    https://www.cnblogs.com/miro/p/4053473.html 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型, ...

  3. 20个可以帮你简化iOS app开发流程的工具

    这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...

  4. 微信小程序开发流程

    2017年1月9日,张小龙在2017微信公开课Pro上发布的小程序正式上线,一夜之间,小程序可谓家喻户晓,但通过接下来的几个月的观察,微信小程序并没有想象中的那么火爆.进入4月以来,微信小程序团队进行 ...

  5. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  6. iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具

    如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都 ...

  7. app开发流程有哪些

    app开发流程是需求方和供求方相互协调的过程,一般分为需求分析.功能设计.功能实现.项目测试.上线等几个步骤,下面我们就来一起看看ytkah团队进行app开发各个流程主要做哪些事情,让您对app开发设 ...

  8. IOS应用程序开发流程

    应用程序开发流程 1.IOS开发需要思考的问题 用户是谁?不同应用程序的内容和用户体验大不相同,这取决于想要编写的是什么应用程序,它可能是儿童游戏,也可能是待办事项列表应用程序,又或者是测试自己学习成 ...

  9. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

随机推荐

  1. leetcode121

    public class Solution { public int MaxProfit(int[] prices) { //寻找最优极值点(包括2个端点) ) { ; } ) { ] - price ...

  2. leetcode461

    public class Solution { public int HammingDistance(int x, int y) { ]; ]; ; ; do { aryA[i] = x % ;//将 ...

  3. board_led.h/board_led.c

    /******************************************************************************* Filename: board_led ...

  4. MYSQL性能优化(2)

    Insert语句优化 1.  多行并为一个语句  insert into table values (行1),(行2),........... 2. 使用中间内存队列, 逻辑是立马执行插入,其他数据放 ...

  5. 数据库设计,表与表的关系,一对多。One-To-Many(2)

    一对多:主键数据表中只能包含一个记录,而在其关系记录表中这条记录可以与一个或多个记录相关,也可以没有记录与之相关. 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系:一对多: ...

  6. Java并发辅助类的使用

    目录 1.概述 2.CountdownLatch 2-1.构造方法 2-2.重要方法 2-3.使用示例 3.CyclicBarrier 3-1.构造方法 3-2.使用示例 4.Semaphore 4- ...

  7. 微信小程序实现计算器功能

    page { height:100%;} .calculator { width: 100%; height: 100vh; border:solid 1px; background: rgb(238 ...

  8. [FE] 有效开展一个前端项目1

    今天的前端如果没有用到 npm,效率是比较低的:所以要从使用的工具来讲. 1. 一切都依赖于 nodejs: 下载一个 linux 的源码包就可以开始安装了. $ wget https://nodej ...

  9. js 冒泡事件 点击任意地方隐藏元素

    $(function () { $("#but").click(function (e) {// $();//显示速度 /*阻止冒泡事件*/ e = window.event || ...

  10. mysql学习笔记--表操作

    一.显示所有表 1. 语法:show tables; 二.创建表 1. 语法:create table [if not exists] 表名( 字段名  数据类型  [null | not null] ...