FPGA 之 SOPC 系列(七)NIOS II 高级技术

今天给大侠带来今天带来FPGA 之 SOPC 系列第七篇,NIOS II 高级技术,希望对各位大侠的学习有参考价值,话不多说,上货。

本篇是有关SOPC的深入设计,帮助读者掌握如何定制用户指令。定制用户逻辑外设和定制用户指令是使用Nios II嵌入式软核处理器的SOPC系统的重要特性,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求,同时介绍了Nios II C语言至硬件加速编译器(C2H)。

以下为本篇的目录简介:

  • 7.1 定制基于Avalon的用户外设

  • 7.2 定制Nios II用户指令

  • 7.3 Nios II C语言至硬件加速编译器(C2H)简介

7.1 定制基于Avalon的用户外设

NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求。

用户定制SOPC Builder元件的开发流程

(1)指定硬件功能

(2)指定微处理器访问和控制该硬件的应用程序接口

(3)定义一个AVALON接口:提供正确的控制机制、足够的吞吐性能

(4)采用VHDL或Verilog编写硬件设计

(5)单独测试硬件设计

(6)编写C头文件,定义寄存器映射

(7)使用元件编辑器将硬件和软件文件打包成一个元件

(8)例化元件为SOPC系统的一个模块

(9)使用NIOSII处理器测试元件的寄存器级访问

(10)编写元件的驱动程序

(11)反复改进元件的设计:硬件、软件、元件更新

(12)编译完整的包含一个或多个该元件的SOPC系统

(13)执行系统级的验证,若必要,进行反复设计

(14)完成元件设计,发布共享元件

定制用户外设简介

下图为带Avalon Slave端口的典型元件组成框图:

在这里我们将详细的通过一个控制LED灯亮度的元件来介绍基于AVALON总线的用户外设的过程。

LED灯亮度原理:

PWM输出一个占空比可调的方波。当一个周期11个时钟,高电平输出7个时钟时的PWM输出波形如下图所示。

PWM设计说明:

本实例的PWM是按下列要求设计的:

1.任务逻辑按一个简单时钟进行同步操作。

2.可以使用微控制器(Nios II)来设置PWM的周期和占空比的值。因此要提供一个可对PWM寄存器进行读写的接口和控制逻辑。

3.定义寄存器来存储PWM周期和占空比的值。

4.微控制器可以通过控制寄存器的禁止位来关闭PWM输出。

元件内部还包括使能控制寄存器、周期设定寄存器以及占空比设置寄存器。设计中我们将各寄存器映射成AVALON SLAVE端口地址空间内一个单独的偏移地址。每个寄存器都可以进行读写访问,软件可以读回寄存器中的当前值,寄存器及偏移地址设定如下:

构建一个符合AVALON-MM slave 接口规范的可以实现我们功能的时序逻辑,在这里,我们利用VERILOG语言来编写。在程序中会涉及到AVALON信号,我们把这些要用到的信号陈列如下。

代码如下:

module led_control( clk, reset_n, chipselect, address, write, writedata, read, byteenable, readdata, led_out ); input clk; input reset_n; input chipselect; input [1:0]address; input write; input [31:0] writedata; input read; input [3:0] byteenable; output [31:0] readdata; output led_out; reg [31:0] clock_divide_reg; reg [31:0] duty_cycle_reg; reg control_reg; reg duty_cycle_reg_selected; reg clock_divide_reg_selected; reg control_reg_selected; reg [31:0] led_counter; reg [31:0] readdata; reg led_out; wire led_enable; //地址译码 always @ (address) begin clock_divide_reg_selected<=0; duty_cycle_reg_selected<=0; control_reg_selected<=0; case(address) 2'b00:clock_divide_reg_selected<=1; 2'b01:duty_cycle_reg_selected<=1; 2'b10:control_reg_selected<=1; default: begin clock_divide_reg_selected<=0; duty_cycle_reg_selected<=0; control_reg_selected<=0; end endcase end //写led输出周期的时钟数寄存器 always @ (posedge clk or negedge reset_n) begin if(reset_n==1'b0) clock_divide_reg=0; else begin if(write & chipselect & clock_divide_reg_selected) begin if(byteenable[0]) clock_divide_reg[7:0]=writedata[7:0]; if(byteenable[1]) clock_divide_reg[15:8]=writedata[15:8]; if(byteenable[2]) clock_divide_reg[23:16]=writedata[23:16]; if(byteenable[3]) clock_divide_reg[31:24]=writedata[31:24]; end end end //写led周期占空比寄存器 always @ (posedge clk or negedge reset_n) begin if(reset_n==1'b0) duty_cycle_reg=0; else begin if(write & chipselect & duty_cycle_reg_selected) begin if(byteenable[0]) duty_cycle_reg[7:0]=writedata[7:0]; if(byteenable[1]) duty_cycle_reg[15:8]=writedata[15:8]; if(byteenable[2]) duty_cycle_reg[23:16]=writedata[23:16]; if(byteenable[3]) duty_cycle_reg[31:24]=writedata[31:24]; end end end //写控制寄存器 always @ (posedge clk or negedge reset_n) begin if(reset_n==1'b0) control_reg=0; else begin if(write & chipselect & control_reg_selected) begin if(byteenable[0]) control_reg=writedata[0]; end end end //读寄存器 always @ (address or read or clock_divide_reg or duty_cycle_reg or control_reg or chipselect) begin if (read & chipselect) case(address) 2'b00:readdata<=clock_divide_reg; 2'b01:readdata<=duty_cycle_reg; 2'b10:readdata<=control_reg; default:readdata=32'h8888; endcase end //控制寄存器 assign led_enable=control_reg; //led功能部分 always @(posedge clk or negedge reset_n) begin if(reset_n==1'b0) led_counter=0; else begin if(led_enable) begin if(led_counter>=clock_divide_reg) led_counter<=0; else led_counter<=led_counter+1; end else led_counter<=0; end end always @(posedge clk or negedge reset_n) begin if(reset_n==1'b0) led_out<=1'b0; else begin if(led_enable) begin if(led_counter<=duty_cycle_reg) led_out<=1'b1; else led_out<=1'b0; end else led_out<=1'b0; end end endmodule

在工程里添加好这个.v文件后,命名为led_control.v并将其存放到工程目录下就OK

接下来我们开始添加这个元件了,我们在Q2里打开sopc builder,进入后,点击file->new component 。

点击后,如下图,我们点击ADD,添加进来我们建立的那个.V文件。加入后,稍微等一下,系统开始对它的端口进行分析了,当出现NOERROR时,说明就OK了。关闭它就行。点击NEXT,我们可以看到,我们的那些端口信号都出现了。

根据功能要求来配置这些信号,其中,INTERFACE是AVALON接口类型了。SIGNAL TYPE指的是各个AVALON接口类型下的信号类型。好在系统已经分析好了,只有一个LED_OUT需要改动,因为它的朝向不是avalon模块了,改完后如下。

改完后点击NEXT,找到slave addressing把它改成native,意思就是地址对齐的选项,选择为静态地址对齐,其他的地方默认。其他的选项说明一下这个TIMIING部分,led的avalon slave端口与avalon slave端口时钟信号同步,读写的建立时间保持时间为0,因为读、写寄存器仅需要一个时钟周期,所以读写为0等待不需要延时。点击NEXT,在GROUP建立一个名称,叫MYIP,那么这个元件就放到这个组里了。

点击FINISH,后点击YES,就会生成一个led_control_hw.tcl脚本文件,回到sopc builder界面,在左侧中的myip中可以找到led_control元件了。

添加路径,这个路径设置是为了让SOPC BUILDER可以找到led_control.v的位置。不然的话,下次进入SOPC BUILDER时,这个元件可能无效。操作是在tool->options,点击右侧的ip search path,接下来的操作一目了然。

  • 自动地址分配

  • 分配中断

  • 管脚分配

  • 编译

编译好后查看一下system.h的变化情况,我们可以发现,多出来一个ledcontrol部分了下面给出测试代码:

#include<unistd.h> #include"system.h" // typedef struct{ volatile unsigned int divi; volatile unsigned int duty; volatile unsigned int enable; }LED_CONTROL; int main() { int dir=1; // LED_CONTROL *led_control=(LED_CONTROL*)LED_CONTROL_BASE; // led_control->divi=1000; led_control->duty=0; led_control->enable=1; while(1){ if(dir>0){ if(led_control->duty<led_control->divi) led_control->duty+=100; else dir=0; } else{ if(led_control->duty>0) led_control->duty-=100; else dir=1; } usleep(100000); } return 0; }

7.2 定制Nios II用户指令

用户定制指令:将一个包含多条标准指令的指令序列减少为硬件实现的一条指令

1)NIOSII处理器配置向导提供了图形化界面添加封装用户定制指令;

2)NIOSII支持256条定制指令;

3)NIOSII IDE在system.h中为每条定制指令产生一个宏,用户在应用程序中通过调用宏访问定制指令。

Nios II定制指令综述

组合逻辑指令结构框图如下图所示:

多周期指令结构框图如下图所示:

扩展指令结构框图如下图所示:

带内部寄存器的乘加指令结构框图如下图所示:

定制指令实现方式 定制指令支持多种设计文件,包括:Verilog HDL, VHDL, EDIF netlist file, Quartus II Block Design File (.bdf), 和Verilog Quartus Mapping File (.vqm)。

具体实现方法有: 1.导入HDL文件实现定制指令; 2.通过DSP Builder实现定制指令加速模块; 3.直接使用SOPC Builder中自带的定制指令。

简易步骤如下:

(1)打开NIOSII CPU的定制指令设置页;

(2)添加用户定制指令设计文件;

(3)发布用户定制指令

(4)将定制指令加入系统,完成定制指令添加。

7.3 Nios II C语言至硬件加速编译器(C2H)简介

  • C2H是能够提升对时间性能要求较高的ANSIC函数的工具,它将这些函数转换为FPGA中的硬件加速器。

  • C2H支持标准ANSI C代码,可加速实现多种应用程序,提高其运行效率,包括访问片内、外部存储器和外设等。

  • C2H帮助Nios II用户以最少的资源占用来达到提高系统性能的目的。

Nios II C2H编译器设计流程非常简单,编写好应用程序后,用户需要做的工作首先是分析软件代码,确定出现性能瓶颈的函数,然后在Nios II IDE中高亮显示所需的函数,右键单击加速便可以生成自动链接至软件流程的硬件加速器。

FPGA 之 SOPC 系列第七篇就到这里结束,下一篇将带来第八篇,程序固化相关内容。

【QQ交流群】

群号:173560979,进群暗语:FPGA技术江湖粉丝。

多年的FPGA企业开发经验,各种通俗易懂的学习资料以及学习方法,浓厚的交流学习氛围,QQ群目前已有1000多名志同道合的小伙伴,无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有。

【微信交流群】

现微信交流群已建立08群,人数已达数千人,欢迎关注“FPGA技术江湖”微信公众号,可获取进群方式。

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!

FPGA 之 SOPC 系列(七)NIOS II 高级技术相关推荐

  1. FPGA 之 SOPC 系列(六)Nios II 程序开发 II

    FPGA 之 SOPC 系列(六)Nios II 程序开发 II 今天给大侠带来今天带来FPGA 之 SOPC 系列第六篇,Nios II 程序开发 II,希望对各位大侠的学习有参考价值,话不多说,上 ...

  2. FPGA 之 SOPC 系列 汇总篇

    FPGA 之 SOPC 系列 汇总篇 FPGA 之 SOPC 系列已经连载了九篇,该系列目前更新完毕,现给各位大侠整理一下第一篇至第九篇的汇总篇,以方便参考学习. 第一篇:概述.SOPC技术.NIOS ...

  3. FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建

    FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建 今天给大侠带来今天带来FPGA 之 SOPC 系列第四篇,NIOS II 外围设备--标准系统搭建,希望对各位大侠的学习有参 ...

  4. FPGA 之 SOPC 系列(二)SOPC开发流程及开发平台简介

    今天给大侠带来今天带来FPGA 之 SOPC 系列第二篇,SOPC开发流程及开发平台简介相关内容,希望对各位大侠的学习有参考价值,话不多说,上货. 本篇首先详细介绍了SOPC开发的基本流程,然后通过实 ...

  5. FPGA 之 SOPC 系列(一)

    今天给大侠带来今天带来FPGA 之 SOPC 系列第一篇,SOPC概述,希望对各位大侠的学习有参考价值,话不多说,上货. 概述 + 在开始今天第一篇之前,让我们一起来看一些相关名词的解释,以方便后续更 ...

  6. FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比

    FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比 今天给大侠带来今天带来FPGA 之 SOPC 系列第九篇,同时也是最后一篇,SOPC 补充:altera与xilinx ...

  7. FPGA 之 SOPC 系列(八)程序固化

    今天给大侠带来今天带来FPGA 之 SOPC 系列第八篇,程序固化,希望对各位大侠的学习有参考价值,话不多说,上货. 本篇主要讲解在完成软件与硬件开发之后,如果利用flash烧写工具对工程的固化,达到 ...

  8. 【连载】【FPGA黑金开发板】NIOS II那些事儿--硬件开发(一)

     声明:本文为原创作品,版权归黑金动力社区(http://www.heijin.org)所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 前言 从今天开始,NIO ...

  9. 【连载】【FPGA黑金开发板】NIOS II那些事儿--LED实验(四)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 这一节,我将给大家讲解第一个与硬件有关的程序,虽然内容简单,却极具代表性. ...

  10. 【连载】【FPGA黑金开发板】NIOS II那些事儿--NIOS II 常见问题(FAQ)

    为了帮助初学者快速入门NIOS II,在此建立NIOS II FAQ,希望大家把自己遇到的问题提出来,然后在这里总结起来,以帮助以后遇到同样问题的人. 首先需要声明一点,下面部分问题来自网络,如果版权 ...

最新文章

  1. 听说程序猿不会撩妹,我笑了
  2. LIVE 预告 | 哈工大微软:多任务、多语言、多模态的预训练模型 | CVPR21系列
  3. intellij idea 1314 插件推荐及快速上手建议 (已更新!)
  4. 哪些模块可用于python性能分析_Python调用C模块以及性能分析
  5. DNS通道检测 国内学术界研究情况——研究方法:基于特征或者流量,使用机器学习决策树分类算法居多...
  6. js获取当前Frame在父页面中的id
  7. JqueryAjax异步加载在ASP.NET
  8. 细谈普通网站的后台构建实战----my note
  9. LVS(6)——NAT准备工作
  10. yum安装Docker失败No package docker available
  11. 他回国后对学生说,玩会这12个游戏就能掌握python基础,其实不难
  12. 【To Do】程序员面试金典——18.11最大子方阵
  13. 如何安装老版本Eclipse汉化——以2020-06为例
  14. 【Python】Python爬虫豆瓣电影数据并进行数据分析
  15. 老张和小梁的求职之旅
  16. 2018年度总结(人若无名,专心练剑)
  17. layui分页和模板引擎
  18. W10的AndroidStudio4.0.1的下载安装与配置
  19. WPF基础到企业应用系列8——依赖属性之“风云再起”
  20. 《被讨厌的勇气》- 要有被讨厌的勇气

热门文章

  1. OpenCV3.1.0安装在ubuntu16.40(Linux)步骤(电赛AM5708板子可用)
  2. “安卓之父”因性侵丑闻离职谷歌获9000万美元补偿,曝二次离职再捞900万
  3. 谷歌云没有信用卡怎么注册服务器,谷歌云免费服务器申请方法
  4. 高速电路中菊花链、fly-by与T点拓扑
  5. 南阳 oj 6174问题
  6. 在我差点崩溃了的时候,还好有主从复制
  7. office 论文 页码_原创:如何设置毕业论文的页眉和页码(word2007和word2010)
  8. cocos2d-x开源游戏引擎,C++开发iphone/android/uphone/win32游戏
  9. PS与CSS字间距转换
  10. VS2019 调用大漠插件免注册方法引发异常 0x00000000 处(位于 DMSPACE1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突。