5 eda
Download
1 / 87

第 5 章 常用 EDA 工具软件 - PowerPoint PPT Presentation


  • 176 Views
  • Uploaded on

第 5 章 常用 EDA 工具软件. • 本章概要: 本章介绍几种目前世界上比较流行和实用的 EDA 工具软件,包括 Altera 公司的 Nios Ⅱ 、 ModelSim 和 Matlab ,以适应不同读者的需要。这些软件主要是基于 PC 机平台的,面向 FPGA 和 CPLD 或 ASIC 设计,比较适合学校教学、项目开发和相关的科研。 • 知识要点:( 1 ) ModelSim 工具软件的使用方法。 ( 2 )基于 Matlab/DSP Builder 的 DSP 模块设计。 ( 3 ) Nios Ⅱ 软件的使用方法

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第 5 章 常用 EDA 工具软件' - bryson


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
5 eda
5章 常用EDA工具软件

•本章概要:本章介绍几种目前世界上比较流行和实用的EDA工具软件,包括Altera公司的Nios Ⅱ、ModelSim和Matlab,以适应不同读者的需要。这些软件主要是基于PC机平台的,面向FPGA和CPLD或ASIC设计,比较适合学校教学、项目开发和相关的科研。

•知识要点:(1)ModelSim工具软件的使用方法。

(2)基于Matlab/DSP Builder的DSP模块设计。

(3)Nios Ⅱ软件的使用方法

•教学安排:本章作为选修内容,可安排6~8学时。读者可以根据不同的需要,在掌握Quartus II工具软件使用方法的基础上,进一步熟悉其他工具软件的使用方法,并了解这些软件的特性。

2014/9/10

1


5 1 modelsim
5.1 ModelSim

ModelSim是一种快速而又方便的HDL编译型仿真工具,不仅可以数字仿真,也可以模拟仿真。Altura公司的Quartus Ⅱ可以与ModelSim无缝连接,完成各种设计电路的仿真,因此在安装Quartus Ⅱ软件时,同时也可以安装ModelSim,在完成Quartus Ⅱ软件的注册后可以直接使用ModelSim(无需再注册)

下面以Quartus Ⅱ 9.0版本自带的ModelSim-ALTERA 6.4a版本为例,介绍ModelSim的使用方法,其他版本的使用方法基本类似。

2014/9/10

2


工具栏

工作区

命令窗口

ModeSim的主窗口界面

5.1.1 ModelSim的使用方法

ModelSim启动后,首先呈现出主窗口(Main Windows)界面,主窗口中包括命令窗口(Transcript)、工作区(Workspace)和工具栏。在命令窗口中可以输入ModelSim的命令,并获得执行信息;在工作区中用树状列表(Tree List)的形式来观察库(Library)、设计工程文件(Project)和设计仿真的结构。

2014/9/10

3


在使用ModelSim之前,应事先建立用户自己的工程文件夹,用于存放各种设计文件和仿真文件,然后还要建立work库。在VHDL中work是默认的工作库,因此ModelSim中必须首先建立一个work库,work库在建立ModelSim的第一个新工程(Project)就会自动生成,以后的其他工程也建立在此work库中。一般所有源代码都要编译到同一个库(包括VHDL和Verilog HDL)。ModelSim包含两类库,第一类是work(默认工作库),包括当前已经编译的设计单元,而且每次只能打开一个单元库。另一类是资源库,包括当前编译使用的参考设计单元,如VHDL的ieee.std_logic_1164库,这类库允许打开多个,并可以被VHDL中的Library和Use语句引用。

2014/9/10

4


建立新工程对话框

与QuartusⅡ设计类似,ModelSim要求每个设计都要建立工程,在工程的支持下完成设计文件的编译和仿真操作。在ModelSim的主窗口,执行“File”→“New”→“Project”命令,弹出建立新工程的对话框,,在对话框中填入要建立的新工程名称以及所在的文件夹,用鼠标左键单击(以下简称为“用鼠标单击”)“OK”按钮后,工程已被建立,在工作区中出现“Preject”标签页。

2014/9/10

5


添加项目到工程对话框

进入ModelSim编辑方式的界面

1. ModelSim编辑方法

当新建工程结束后,ModelSim会自动弹出添加项目到工程(Add items to the Project)对话框,用鼠标单击对话框中的“Create New File”图标,可以进入ModelSim的编辑新文件的出口,也可以在ModelSim的主窗口界面,执行“File”→“New”→“Source”→“VHDL”命令,即可进入ModelSim的VHDL(或Verilog HDL)编辑方式。

2014/9/10

6


ModelSim的编辑方式(source)界面输入源程序(如VHDL十进制加法计数器),并保存在用户工程文件夹中(如用cnt10y.vhd为文件名)。cnt10y.vhd源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE ieee.Numeric_Std.ALL;

ENTITY cnt10y IS

PORT(clr:IN STD_LOGIC;

clk:IN STD_LOGIC;

q:BUFFER INTEGER RANGE 9 DOWNTO 0;

cout:OUT STD_LOGIC);

END cnt10y;

ARCHITECTURE one OF cnt10y IS

BEGIN

2014/9/10

7


PROCESS(clr,clk)

BEGIN

IF clr='0' THEN q<=0;

ELSIF clk'EVENT AND clk='1' THEN

IF (q=9) THEN

q<=0;

cout<='0';

ELSE

q<=q+1;

cout<='1';

END IF;

END IF;

END PROCESS;

END one;

2014/9/10

8


2. ModelSim编译方法

完成源程序的编辑后,在ModelSim编辑方式窗口执行“Compile”→“Compile”命令,在弹出的编译HDL源文件(Compile HDL Source File)对话框中,在“文件名”栏目下选中被编译的文件(如cnt10y)后,用鼠标单击“Compile”按钮,即可对源程序进行编译,如果不存在错误,则编译成功。编译成功后,cnt10y的设计实体就会出现在work库中。

3. ModelSim仿真方法

ModelSim仿真包括装载设计文件、设置激励信号和仿真等操作过程。

2014/9/10

9


ModelSim的信号窗口

设计文件装载对话框

(1)装载设计文件

在ModelSim的主窗口,执行“Simulate”→“Start Simulate命令,在弹出仿真文件装载对话框中,用鼠标将work库中的cnt10y点黑选中,然后用鼠标单击“OK”按钮,即可完成设计文件的装载,此时工作区会出现“Sim”标签,表示装载成功。

2014/9/10

10


2)设置仿真激励信号

完成仿真文件的装载后,一般会自动弹出的目标(Objects)窗口,若目标窗口没有打开,可在ModelSim的主窗口,执行“View”→“Objects”命令,打开目标窗口,经过装载的十进制加法计数器设计电路的复位输入端clr、时钟输入端clk、计数器状态输出端q和进位输出端cout已在窗口内。

用鼠标右键点击目标窗口中的复位输入信号clr,弹出快捷菜单,在菜单中选择“Force”命令,弹出被选信号激励(Force Selected Signal)对话框,可以对被选信号进行Force赋值。在Force赋值对话框中将“Value:”中的数值改写为1,则为clr当前赋1值。另外,“Delay For:”中的值是信号赋值前的延迟时间,“Cancel After:”中的值是仿真取消后的值,这两个参数一般可以不填。被选激励信号的值确定后,用鼠标单击“OK”按钮结束Force赋值操作。

2014/9/10

11


选择端口信号操作示意图

当设计电路的全部激励信号设置完毕后,将ModelSim的Objects窗口中全部端口信号用鼠标全部选中,然后用鼠标右键点击这些被选型号,在弹出的快捷菜单中,执行“Add”→“To Wave”→“Selected Items”命令(在命令窗口上也可以执行上述命令),即可将选中的端口信号加入到ModelSim的波形(Wave)窗口中。

2014/9/10

12


十进制加法计数器的仿真波形

(3)仿真设计文件

在ModelSim的主窗口界面,执行“View”→“Wave”命令,打开波形(Wave)窗口。按动ModelSim的波形窗口上的“运行”按键,仿真波形将按照按一次键输出一个时钟周期的方式对设计电路进行仿真。在仿真期间,可以在ModelSim的Wave窗口用鼠标右键点击需要改变Force值的信号(如复位信号clr)在弹出的快捷菜单中执行“Force”命令,进入Force赋值对话框后,可以对被选的信号重新赋值,来验证信号的功能。十进制加法计数器设计电路的仿真结果如图所示。

2014/9/10

13


添加文件到工程对话框

5.1.2 ModelSim与Quartus II的接口

Quartus II完成的HDL设计文件,也可以用ModelSim进行仿真。进行仿真前,必须编译所以待仿真的HDL文件成为仿真库,在编译时获得优化,提高仿真速度。下面以嵌入式锁相环mypll为例,介绍ModelSim与Quartus II的接口方法。

执行ModelSim工作区窗口下的“Project”→“ Add to Project” →“Existing File”命令,弹出的添加文件到工程对话框,在对话框的“File Name”栏目下直接查找现有的HDL源文件所在位置和名称(如D:/myeda/mypll.vhd)后,用鼠标单击“OK”按钮,完成文件的添加。当添加的HDL文件通过编译后,源文件的设计实体就会出现在work库中。

2014/9/10

14


锁相环mypll的仿真结果

完成添加设计文件的编译后,即可采用上述的ModelSim仿真方法,对设计文件进行仿真。mypll的仿真结果如图所示。

2014/9/10

15


5.1.3 ModelSim交互命令方式仿真

ModelSim交互命令方式,是在ModelSim的主窗口的命令窗口上,通过输入命令来实现的,具有更好的调试和交互功能。实际在图形用户交互方式中,每点击一个图标命令时,在命令窗口就出现相关的命令。ModelSim提供了多种指令,既可以单步,也可以构成批处理文件,用来控制编辑、编译和仿真流程。

5.1.4 ModelSim批处理工作方式

如果采用单步指令来控制仿真流程,每次都要输入相应的指令,是很繁琐的事情。ModelSim提供了一个简化方式,即可以把这些命令形成一个批处理文件后再执行。如果读者对ModelSim的命令不熟悉,可以先用图形用户交互方式完成设计电路的仿真,然后把命令窗口中命令复制下来,构成批处理文件。

2014/9/10

16


ModelSim的主窗口,执行“File”→“New”→“Source”→“DO”命令,进入ModelSim的DO文件编辑方式。在编辑窗口输入下列计数器仿真批处理文件(cnt10y.do)的代码:

vsim work.cnt10y //打开work库中的cnt10y文件

# Loading std.standard //打开VHDL相关库

# Loading ieee.std_logic_1164(body)

# Loading ieee.numeric_std(body)

# Loading work.cnt10y(one)

force -freeze sim:/cnt10y/clr 1 0 //设置复位信号为1

force -freeze sim:/cnt10y/clk 1 0, 0 {50 ps} -r 100 //设置时钟

add wave \ //添加下列端口信号到波形窗口

{sim:/cnt10y/clr } \

{sim:/cnt10y/clk } \

{sim:/cnt10y/q } \

{sim:/cnt10y/cout }

2014/9/10

17


run

run 100 //执行100单位时间(ps)

force -freeze sim:/cnt10y/clr 0 0 //设置复位信号为0

run 200 //执行200单位时间

force -freeze sim:/cnt10y/clr 1 0 //设置复位信号为1

run 2000 //执行2000单位时间

完成计数器仿真批处理文件的编辑后,用“cnt10ym.do”为文件名保存在与计数器设计文件相同的文件夹中(.do是DO文件的属性后缀),并通过ModelSim的编译。在ModelSim的命令窗口中执行“do cnt10y.do”,完成对计数器设计(cnt10y)的仿真。

2014/9/10

18


5 2 matlab dsp builder dsp
5.2 基于Matlab/DSP Builder的DSP模块设计

Matlab是当前国际控制界最流行的面向工程与科学计算的高级语言。Altera公司充分利用了Matlab的优势,将Quartus II与其进行无缝连接,完成DSP等复杂系统的设计。

本节介绍利用Matlab/DSP Builder工具进行DSP模块设计、Matlab模型仿真、SignalCompiler使用方法、使用Modelsim进行RTL级仿真、使用Quartus II实现时序仿真、使用Quartus II硬件实现与测试。

下面以一个简单的正弦信号调制电路的设计为例,介绍基于Matlab/DSP Builder的DSP开发技术。

2014/9/10

19


正弦信号发生器原理图

5.2.1 设计原理

正弦信号调制电路电路由阶梯信号发生器模块IncCounter、正弦函数值查找表模块SinLUT、延时模块Delay、乘法器模块Product、数据控制模块DATAIN和输出模块Output等6个部分构成。阶梯信号发生器模块IncCounter产生线性递增的地址信号,送往SinLUT查找表。SinLUT是一个正弦函数值的查找表模块,由递增的地址获得正弦波值输出,输出的8位正弦波数据经延时模块Delay后送往Product乘法模块,与DATAIN的数据相乘生成正弦波调制的数字信号,由Output输出。Output输出的数据送往D/A即可获得正弦调制信号。

2014/9/10

20


工作区

命令窗口

命令历史

Matlab软件界面

5.2.2 建立Matlab设计模型

利用Matlab建立DSP设计模型是基于Matlab/DSP Builder的DSP模块设计的主要过程。

1. 运行Matlab

启动后的Matlab软件界面面中有三个窗口,分别是命令窗口(Command Windows)、工作区(Workspace)、命令历史(Command History)。在命令窗口中,可以键入命令,同时得到响应信息、出错警告和提示等。

2014/9/10

21


SignalCompilder组件图标

建立MATLAB设计模型的编辑窗口(右)和Simulink库管理器窗口(左)

2. 新建一个模型文件

在Matlab软件界面执行“File”菜单的“New”,在弹出的子菜单中选择“model”方式,弹出建立MATLAB设计模型的编辑窗口,设计电路的模型在此编辑窗口中完成编辑、分析、仿真控制和生成设计文件。

2014/9/10

22


3. 放置SignalCompiler图标

用鼠标左键点击Library browser窗口左侧的库内树形列表中的Altera DSP Builder条,展开DSP Builder库,再点击AltLab项展开AltLab库,用鼠标选中库管理器右侧的SignalCompiler组件图标,按住鼠标左键将SignalCompiler图标拖动到新模型窗口中。SignalCompiler组件图标是一个控制符号,用鼠标左键双击它时,可以启动软件对编辑窗口中的设计模型(电路)进行分析,并引导进入下一步的编译、适配和生成HDL代码文件操作。

2014/9/10

23


IncCounter模块图标及其参数设置对话框

4. 放置Increment Decrement模块

用鼠标将Altera DSP Builder中的Arithmetic库展开,把库中的Increment Decrement模块(图标)拖放到新建模型编辑窗口中。Increment Decrement是阶梯信号发生器模块,用鼠标左键点击Increment Decrement模块下面的文字“Increment Decrement”,就可以修改模块名字。用此方法将模块名其修改为“IncCounter”。

2014/9/10

24


SinLUT模块图标及其参数设置对话框

5. 放置SinLUT(正弦查找表)模块

用鼠标将Altera DSP Builder中的Gate & Control库展开,将库中的LUT模块拖放到新建模型编辑窗口,将模块的名字修改成“SinLUT”。用鼠标双击SinLUT模块,弹出inLUT模块参数设置对话框。在此对话框中,把Bus Type(总线宽度)设置为“Unsigned Integer”(无符号整数);把Output[number of bits](输出位宽)设置为“8”;把LUT Address Width(查找表地址线位宽)设置为“6”。

2014/9/10

25


Delay模块图标及其参数设置对话框

6. 放置Delay模块

用鼠标将Altera DSP Builder中的Storage库展开,将库中的Delay模块拖放到新建模型编辑窗口。Delay是一个延时环节,用鼠标双击Delay模块,弹出Delay模块参数设置对话框。在Delay模块参数设置对话框中,参数Depth是设置信号延时的深度。当Depth为1时,延时传输函数为1/z1,表示信号传输延时1个时钟周期;当Depth为n时,延时传输函数为1/zn,表示信号传输延时n个时钟周期。

2014/9/10

26


DATAIN模块图标及其参数设置对话框

7. 放置数据输入端口DATAIN模块

用鼠标将Altera DSP Builder中的IO & Bus库展开,将库中的Input模块拖放到新建模型编辑窗口,修改Input模块的名字为DATAIN。鼠标双击DATAIN模块,弹出的DATAIN模块参数设置对话框。在参数设置对话框中,把Bus Type设置为“Unsigned Integer”(无符号整数),把[number of bits].[]设置为“1”,表示该输入模块是1位无符号数据输入。该模块在生成HDL代码文件时,是一个名为DATAIN,宽度为1位的输入端口。

2014/9/10

27


Product模块图标及其参数设置对话框

8. 放置乘法器Product模块

用鼠标将Altera DSP Builder中的Arithmetic库展开,将库中的Product模块拖放到新建模型编辑窗口。Product有两个输入,一个是经过一个Delay的SinLUT查表输出,另一个是外部1位端口DATAIN送来的数据,用DATAIN对SinLUT查找表输出的控制,产生正弦调制输出。用鼠标双击Product模块,弹出Product模块参数设置对话框,在Product模块参数设置对话框中,Pipeline参数是设置Product模块使用的流水线数,即控制Product的乘积延时几个脉冲周期后出现。

2014/9/10

28


Output模块图标及其参数设置对话框

9. 放置输出端口Output模块

用鼠标将Altera DSP Builder中的IO & Bus库展开,将库中的Output模块拖放到新建模型编辑窗口。Output模块的图标如图5.56所示,用鼠标左键双击Output模块图标,弹出Output模块参数设置对话框。在参数设置对话框中,把Bus Type设置为“Unsigned Integer”(无符号整数),把[number of bits].[]设置为“8”,表示该输出模块是8位无符号数据输出。该模块在生成HDL代码文件时,是一个名为Output,宽度为8位输出端口。

2014/9/10

29


Random Number模块图标及其参数设置对话框

5.2.3 Matlab模型仿真

1. 加入仿真激励模块

在Simulink管理器中,用鼠标将Simulink的Sources库展开,将库中的Random Number模块拖放到新建模型编辑窗口,用鼠标双击Random Number 模块图标,弹出Random Number模块参数设置对话框。

2014/9/10

30


Scope模块图标(中)、Scope窗口(左)和Genera参数设置窗口(右)

2. 加入波形观察模块

用鼠标将Simulink的Sinks库展开,将库中的Scope(示波器)模块拖放到新建模型编辑窗口,用鼠标双击Scope(示波器)模块图标,弹出Scope窗口。用鼠标单击Scope窗口工具栏上的“Parameters”(参数设置)按钮(左起第二个工具按钮),弹出Scope模块参数设置对话框。

2014/9/10

31


仿真参数设置对话框

3. 设置仿真参数

在新建模型编辑窗口中,执行“Simulation”菜单的“Simulation Parameters”命令,弹出Simulation Parameters(仿真参数)设置对话框,其中“Start time”(开始时间)设置为“0.0”,“Stop Time”(结束时间)设定为500,其他设置按照默认。

2014/9/10

32


正弦波调制电路的仿真波形

4. 启动仿真

执行“Simulation”菜单的“Start”命令开始仿真。如果设计有错误,Matlab会有提示,改正错误后再仿真,直至设计错误为0时才能出现仿真结果。本例设计的正弦信号调制电路的仿真结果如图所示。

2014/9/10

33


启动DSP Builder对话框

SignalCompiler窗口

5.2.4 SignalCompiler使用方法

在Matlab中完成仿真验证后,就需要把设计转到硬件上加以实现。通过DSP Builder可以获得针对特定FPGA芯片的HDL代码。用鼠标左键双击FirstDSP模型窗口中的SignalCompiler模块图标,将启动DSP Builder,在出现对话框中点击“Analyze”按钮,SignalCompiler就会对FirstDSP模型进行分析,检查模型有无错误。如果设计存在错误,SignalCompiler就会停止分析过程,并在Matlab软件界面的命令窗口给出相关信息。如果设计不存在错误,则在分析结束后打开SignalCompiler窗口。

2014/9/10

34


5.2.5 使用Modelsim进行RTL级仿真

在simulink中进行仿真是对模型文件.mdl进行的,属于系统验证性质的仿真,并没有对生成的HDL代码文件进行仿真。

在对SignalCompiler进行设置时,将“Generate Stimuli for VHDL Testbench”选中后,DSP Builder在“MDL to VHDL”的模型文件转换过程会自动生成针对HDL仿真器Modelsim的测试文件,因此可以直接使用Modelsim对生成的VHDL代码进行功能仿真。仿真步骤如下:

打开Modelsim软件,执行Modelsim软件界面上“Tools”菜单的“Execute Macro…”命令,在弹出的文件选择对话框中,把文件目录切换到FirstDSP.vhd的工作目录(如myeda_q)下,在此目录中将“tb_FirstDSP.tcl”文件选中并打开,Modelsim软件就开始对tb_FirstDSP.tcl启动仿真,随后自动打开wave窗口,显示仿真结果。

2014/9/10

35


修改波形参数后的Modelsim仿真结果

Modelsim仿真结果

2014/9/10

36


5.3.6 使用Quartus II实现时序仿真

打开Quartus II集成环境,执行Quartus II软件界面上的“File” 菜单的“Open Project …”命令,在弹出的“Open Project”对话框中,选择FirstDSP模型所在工作目录,打开DSP Builder为Quartus II建立的设计项目“FirstDSP”,并在设计项目中打开VHDL顶层设计文件“firstdsp.vhd”。

在SignalCompiler中的Quartus II编译过程中,具体的器件由Quartus II自动决定,在实际使用中,需要选择具体器件型号。然后执行“Processing”菜单的“Start Compilation”命令对firstdsp.vhd顶层设计文件进行编译。

编译结束后,执行“Processing”菜单的“Start Simulation”命令,启动时序仿真。在仿真过程结束后,点击“Simulator Tool”(仿真工具)界面的“Repot”按钮,系统自动弹出Quartus II仿真波形界面,显示仿真结果。

2014/9/10

37


FirstDSP设计文件的Quartus 仿真波形

2014/9/10

38


5.2.7 DSP Builder的层次设计

对于一个复杂的DSP系统设计,如果把所有的模块放在同一个DSP Builder的Simulink图中,设计图就变得非常庞大而复杂,不利于阅图和排错。利用DSP Builder的层次设计,就可以方便地解决这个难题。

DSP Builder的层次设计的思路是利用DSP Builder软件工具,将设计好的DSP模型生成子系统(SubSystem),这个子系统是一个的元件,可以独立工作,也可以与其他模块或子系统构成更大的设计模型,还可以作为基层模块,被任意复制到其他设计模型中。

2014/9/10

39


生成DSP Builder子系统操作过程

生成的子系统图

在Matlab软件界面打开正弦信号调制电路设计模型文件(即FirstDDS),用鼠标操作方式将模型文件中的全部模块及模块之间的连线选中(即将键盘的Shift按钮按下后,用鼠标左键点击要选中的模块或连线),但不要将SignalCompiler图标、仿真的激励模块Random Number和波形观察模块Scope选中。用鼠标右键点击原理图选中的部分,在弹出的快捷菜单中选择“Create subsystem”项,完成DSP Builder子系统的生成。生成的子系统如图所示。

2014/9/10

40


5 3 nios ii
5.3 Nios II嵌入式系统开发软件

SOPC Builder是Altera公司推出的一种可加快在PLD内实现Nios II嵌入式处理器及其相关接口的设计工具。其功能与PC机应用程序中的“引导模板”类似,设计者可以根据需要确定处理器模块及其参数,选择所需的外围控制电路(如存储器控制器、总线控制器、I/O控制器、定时器等)和外设(如存储器、鼠标、按钮、LED、LCD、VGA等),创立一个完整的嵌入式处理器系统。SOPC Builder还允许用户修改已经存在的设计,为其添加新的设备和功能。

2014/9/10

41


5.3.1 Nios II的硬件开发

Nios II是一个用户可以自行定制的CPU,用户可以增加新的外设,增加新的指令,分配外设的地址等。Nios II的硬件开发就是由用户定制合适的CPU和外设。SOPC Builder提供了大量的IP Core来加快Nios II外设的开发速度,用户也可以使用VHDL或Verilog HDL来定制外设。

Nios II的硬件开发必须得到特定的开发板的硬件支持。下面以DE2(含DE2 70)开发板为例,介绍Nios II(9.0版本)硬件开发的具体流程。

在DE2开发板上,支持Nios II系统的外部设备包括SDRAM、SRAM、FLASH、LCD、七段数码管、发光二极管、按钮开关、电平开关、VGA、ISP1362、I2C器件等,大部分外部都采用Nios II软件提供的组件,但SRAM、七段数码管、VGA控制器和I2C器件属于DE2开发板自定义的组件,因此在进行Nios II系统开发之前,应将这些组件的程序包加入到Nios II的用户自定义组件(User Logic)中。

2014/9/10

42


DE2开发板提供的用户光盘的\DE2\DE2_NIOS_HOST_MOUSE_VGA工程文件夹(或其他工程文件夹)中,包含SRAM、七段数码管、VGA控制器、I2C器件的程序包,它们分别是user_logic_SRAM_16Bits_512K、user_logic_SEG7_LUT_8、 user_logic_VGA_Controller和user_logic_Open_I2C。将这些程序包(文件夹)复制到用户工程(如SOPC_DE2)目录中,打开SOPC Builder软件后,在其组件库的“User Logic”项下,就可以找到这些自定义组件。对于新版DE2开发板上的组件程序包,DE2的组件名分别为SRAM_16Bits_512K、SEG7_LUT_8、Binary_VGA_Controller等,将这些组件的文件夹复制到工程目录中后,这些组件会出现在SOPC Builder软件组件库的“Terasic Technologies Inc”栏目下。

2014/9/10

43


1. 新建SOPC设计项目

设计前首先需要在Quartus II中建立一个设计项目,并选择Cyclone II系列的EP2C35F672C6或EP2C70F896C6器件为目标芯片(EP2C35F672C6是DE2开发板上的目标芯片,EP2C35F672C6是DE2 70开发板上的目标芯片)。

执行“Tools”菜单的“SOPC Builder…”命令,打开Quartus II集成环境的SOPC开发工具,呈现的SOPC Builder软件窗口界面。执行SOPC Builder软件窗口“File”菜单的“New system”命令,弹出“Create New System”对话框,在对话框中输入需要建立的SOPC系统的名称(例如使用nios_0为工程名称),设定语言为VHDL或Verilog HDL(建议使用Verilog HDL)。完成设定后用鼠标单击“OK”按钮,进入SOPC Builder设计。

2014/9/10

44


SOPC Builder软件窗口界面

SOPC Builder界面分成三个部分,界面左边是组件(Nios II嵌入式系统元件)选择栏,用树型结构列出了SOPC Builder的组件;右边空白处用于加入用户定制Nios II系统的组件;下方是提示栏,用于显示SOPC Builder的提示信息和警告错误信息。在界面的右上方,可以选择器件系列和系统工作频率。

2014/9/10

45


2. 加入Nios II系统的组件

基本的SOPC系统大致可以分为FPGA、存储器和外围元件三个部分。FPGA部分的核心是NIOS CPU CORE(CPU核),设计工作主要在FPGA部分进行。

基于DE2开发板的Nios II系统包含NIOS CPU CORE(CPU核)、通用异步通信总线JTAG UART、串口UART、按钮开关BUTTON PIO、电平开关SW PIO、绿色LED 、红色LED、七段数码管、Avalon三态总线桥、片外SRAM、Timer(定时器)、LCD(液晶显示器)、Flash(快闪存储器)、FLASH控制器、SDRAM控制器、系统ID组件、I2C(I2C组件)、VGA控制器和ISP1362(USB控制器)。

2014/9/10

46


1)加入NIOS CPU CORE(CPU核)

在SOPC Builder的组件库中,用鼠标双击Component Library(组件库)中的“Nios II Processor”项,弹出添加新的Nios II(CPU核)对话框。

在对话框中提供Nios II系列微处理器的三个成员供选择:

① Nios II/e(经济型)成员,具有占用最小逻辑的优化,占用600~700LEs(逻辑元件)。

② Nios II/f(快速型)成员,具有高性能的优化,占用1400~1800LEs。

③ Nios II/s(标准型)成员,在占用逻辑和高性能优化方面的性能居中,占用1200~1400LEs。

2014/9/10

47


组件操作快捷菜单

选择Nios II后的SOPC Builder界面

本设计选择标准型Nios II/s成员。完成设置后,系统将“cpu_0”作为一个CPU核组件已经加入SOPC系统,并显示该系统已经有instruction_Master(指令主控器)、data_Master(数据总线主控器)和jtag_debug_module(JTAG调试模式)存在。用鼠标右键点击选中“cpu_0”,弹出组件操作快捷菜单,在快捷菜单中选择“Rename”项,可以更改组件名称(本设计保持默认为“cpu_0”)。在快捷菜单中还可以选择“Edit…”(编辑)、“Lock Base Address”(锁定地址)等操作。

2014/9/10

48


加入JTAG UART对话框

(2) 加入JTAG UART

JTAG UART(JTAG通用异步通信总线)用于Flash存储器的读写控制。用鼠标双击组件库中的“Interfase”→“Serial”栏目下的“JTAG UART”项,在弹出加入JTAG UART属性对话框中。对话框中各参数保持默认值不变,完成JTAG UART组件的加入后,组件名称保持默认的“jtag_uart_0”不变。

2014/9/10

49


加入UART对话框

(3) 加入UART

UART是常用的串口,Nios II系统可以通过UART串口与计算机通信,也用于NIOS系统的仿真调试。用鼠标双击组件库中的“Interfase”→“Serial”栏目下的“UART(RS232 series port)”项,弹出UART属性对话框。在对话框中选择波特率为115200,其余参数保持默认设置,完成UART的加入后,组件名称保持默认的“uart_0”不变。

2014/9/10

50


4) 加入BUTTON PIO

DE2开发板上有4只按钮开关key3~key0,设计中需要加入一个4位的按钮PIO。用鼠标双击组件库中的“Peripherals”→“ Microcontroller Peripherals”栏目下的“PIO”项,弹出加入PIO的“Basic setting”对话框。在对话框中设置“Width”(位宽)为4位,在“Direction”栏目下选择“Input Ports Only”(输入)模式。然后用鼠标单击“Next”进入PIO的“Input Options”选项设置对话框页面,在此对话框页面中可选择产生中断请求(IRQ)的触发模式,包括“Level”(电平)和“Edge”(边沿)两种触发模式;在选择“Edge”触发模式下,还要选择触发边沿的类型,其中有“Rising Edge”(上升沿)、“Falling Edge”(下降沿)和“Either Edge”(任意边沿或双边沿)三种边沿类型。在本设计中选择“Edge”触发模式下的“Either Edge”类型。完成PIO的加入后,将组件名称更改为“button_pio”。

2014/9/10

51


5)加入电平开关SW PIO

DE2开发板上有18只按钮开关SW17~SW0,设计中需要加入一个18位的SW PIO。用鼠标双击组件库中的“Peripherals”→“ Microcontroller Peripherals”栏目下的“PIO”项,在弹出的加入PIO的“Basic setting”对话框中,设置“Width”为18位,在“Direction”栏目下选择“Input Ports Only”(输入)模式。完成电平开关组件的加入后,将组件名称更改为“switch_pio”。

(6)加入绿色LED

DE2开发板上有9只绿色发光二极管LEDG8~LEDG0,设计中需要加入发光二极管PIO。在加入PIO对话框中,设置“Width”为9位,在“Direction”栏目下选择“Output Ports Only”(输出)模式。完成绿色LED组件的加入后,将组件名称更改为“led_green”。

2014/9/10

52


7)加入红色LED

DE2开发板上有18只红色发光二极管LEDR17~LEDR0,设计中需要加入发光二极管PIO。在加入PIO对话框中,设置“Width”为18位,在“Direction”栏目下选择“Output Ports Only”(输出)模式。完成红色LED组件的加入后将组件名称更改为“led_red”。

(8)加入七段数码管

DE2开发板上有8只七段数码管hex7~hex0,设计需要加入8个七段码数码管。用鼠标双击组件库中“User Logic”的“SEG7_LUT_8”项,加入七段数码管PIO。完成七段数码管组件的加入后,将组件名称更改为“SEG7_Display”。

2014/9/10

53


9)加入片外SRAM

DE2开发板上有一片512×16KB的SRAM,属于自定义组件。用鼠标双击组件库中“User Logic”的“SRAM_16Bits_512K”项,加入SRAM。完成片外SRAM组件的加入后,将组件名称更改为“sram_0”。

(10)加入定时器Timer

用鼠标双击SOPC Builder界面的组件库中“Preripherals”→“ Microcontroller Preripherals”下的“Interval Timer”项,弹出加入Timer对话框,一切都按照对话框默认值配置,完成Timer的加入,组件名称保持默认的“timer_0”不变。

2014/9/10

54


11)加入LCD(液晶显示器)

用鼠标双击SOPC Builder界面的组件库中的“Preripherals”→“Display”的“Character LCD”项,完成LCD的加入。完成LCD组件加入后,将组件名称更改为“lcd_16207_0”。添加的LCD的型号为Optrex 16207,支持2行字符显示,每行16个字符。

(12)加入Avalon三态总线桥

NIOS CPU与SRAM等外部扩展器件相连时需要Avalon三态总线桥。用鼠标双击组件库中“Bridges and Adapters”→“Memory Mapped”的“Avalon-MM Tristate Bridge”项,在加入Avalon三态总线桥对话框中,参数设置采用系统默认值。组件名称保持默认的“tri_state_bridge_0”不变。

2014/9/10

55


13)加入Flash(快闪存储器)

用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”的“Flash Memory Interface”项,弹出加入Flash对话框,在对话框的“Attributes”页面的“Presets”下拉菜单中,选择“(Custom)”(惯例)项,并在对话框的“Size”栏目下,填入Address Width(地址宽度)为20bits,Data Width(数据宽度)为8bits。

用鼠标单击对话框上部的“Timing”按钮(或下部的“Next”按钮),进入Flash参数设置的“Timing”页面,此页面用于对Flash的建立(Setup)时间、等待(Water)时间和保持(Hold)时间参数进行设置,将Setup时间设置为40(ns),Water时间设置为160(ns),Hold时间设置为40(ns)。完成Flash组件的加入后,组件名称保持默认的“cfi_flash_0”不变,并将其输入端口“s1”与Avalon三态总线桥组件的“tristate_master”端口连接。

2014/9/10

56


14)加入FLASH控制器

FLASH控制器用于控制Flash存储器的操作。用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”→“Memory”的“EPCS Serial Flash Controller”项,弹出加入Flash控制器对话框。完成FLASH控制器的加入,保持组件默认的名称“epcs_flash_controller”不变。

(15)加入SDRAM控制器

SDRAM控制器用于控制SDRAM存储器的操作。用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”→“ SDRAM”的“SDRAM Controller”项,弹出加入SDRAM控制器对话框的“Memory Profile”页面。在页面的“Presets”栏目中选择“Custom”(常规),设置“Data Width”(数据宽度)为16Bits,其他参数保持默认值。

2014/9/10

57


用鼠标单击对话框上方的“Timing”按钮(或用鼠标单击下方的“Next”按钮),进入对话框的“Timing”页面,保持此页面参数的默认设置。完成SDRAM控制器的加入后,保持组件默认的名称“sdram_0”不变。

(16)加入系统标识System ID组件

系统标识system ID是SOPC中的一个简单只读组件。Nios II处理器系统利用它来检验软件程序和配置与在FPGA中的硬件电路是否一致。如果运行程序的ID号和FPGA中的系统标识不一致,软件将不能正确运行。用鼠标双击组件库中“Peripherals”→“Debug and Performance”的“System ID Peripheral”项,弹出加入System ID组件对话框。完成System ID组件的加入后,将组件的名称更改为“sysid”。

2014/9/10

58


5.3.2 调整SDRAM地址

首先进入cpu_0的编辑方式,将设置复位地址(Reset Address)和其余的程序和数据(Exception Address)放在sdram_0中,然后执行SOPC窗口“System”菜单中的“Auto-Assign Base Addresses”命令,系统将自动调整SDROM和其他设备的基本地址。

完成cpu_0的编辑修改后,用鼠标单击SOPC窗口下的“Generate”按钮,启动系统生成Nios II开发者的SOPC系统。至此Nios II核(nios_0)已生成,用鼠标单击SOPC窗口“Exit”按钮,退出SOPC Builder窗口界面(也可以不退出)。

2014/9/10

59


5.3.3 生成Nios II硬件系统

Nios II核生成后还要将其下载到目标芯片中,转换成实际的硬件电路并进行调试,验证设计的正确性。生成Nios II硬件系统需要建立相应的顶层设计文件,顶层设计文件可以用原理图编辑法实现,也可以用HDL文本编辑法实现。基于DE2开发板的Nios II硬件系统的顶层文件,采用Verilog HDL文本编辑方式实现。

1. 编辑Nios II顶层文件

在基于DE2开发板的Nios Ⅱ系统中,需要一块复位电路Reset_Delay实现系统的复位操作,还需要一块锁相环电路SDRAM_PLL产生50MHz和27MHz的系统时钟。用户的Nios Ⅱ系统加入了I2C组件和VGA组件,也需要把I2C控制器文件I2C_Controller.v、I2C配置文件I2C_AV_Config.v和VGA控制器文件VGA_Controller.v复制到自己的工程文件夹中。

2014/9/10

60


2. 引脚锁定

由于DE2开发板中的电路是固定的,Nios II系统的引脚锁定也是唯一的,因此可以利用DE2开发板提供的引脚锁定文件,节省引脚锁定操作的时间。

将DE2/DE2_NIOS_HOST_MOUSE_VGA/目录下的顶层文件的引脚锁定文件DE2_NIOS_HOST_MOUSE_VGA.qsf,复制或以“另存为”方式生成用户自己的引脚锁定文件(如SOPC_DE2.qsf)即可。

完成引脚锁定后,再次编译顶层设计文件。至此,基于DE2开发板的Nios II系统的开发完成。

2014/9/10

61


5.3.4 Nios II系统的调试

对于初学,建立一个新的Nios II系统是困难而复杂的,但任何一个SOPC开发系统(如DE2或DE2 70),都有自己的示例,每个示例均有相应的Nios II系统,可以利用SOPC开发系统上建立的Nios II系统来完成嵌入式系统的开发或研究。下面以DE2(或DE2 70)开发板为例,介绍Nios II系统的IDE调试方法。

在Quartus II的主窗口,打开DE2的一个实例的工程,如“DE2_demonstrations”或“DE2_70_demonstrations”文件夹下的“DE2_NIOS_HOST_MOUSE_VGA”工程。执行主窗口“Tools”菜单的“SOPC Builder…”命令,进入该工程的SOPC Builder开发环境。

2014/9/10

62


工作间选择对话框

点击SOPC Builder主窗口的“System Generation”页面中的“Nios II IDE”命令(或者直接点击桌面上“Nios II IDE”图标),进入Nios II的IDE调试方式。在进入IDE软件界面之前,一般先弹出“Workspace Launcher”(工作间选择)窗口。在此窗口选择用户工程目录(如F:\DE2_demonstrations\DE2_NIOS_HOST_MOUSE_VGA)。当工作间选择结束后,弹出Nios II IDE主窗口界面(在Nios II IDE主窗口执行“File”→“Switch Workspace”命令,也可以进行工作间选择)。

2014/9/10

63


Nios IDE主窗口界面

编辑区

C/C++工程

浏览器

提示信息

浏览器

在Nios II IDE主窗口界面,上部是主菜单和工具栏,中下部是工作界面。每个工作界面都包括一个或多个窗口,如C/C++工程浏览器窗口、编辑区窗口、提示信息浏览器窗口等。

2014/9/10

64


1. 新建软件工程

执行IDE软件的“File”→“New”命令,弹出“New project”(新建工程)快捷菜单,在菜单中选择“C/C++ Application”命令,进入新建工程(New Project)对话框。 在新建软件工程对话框的“Select Project Template”(选择工程模板)栏目中,是已经做好的软件工程设计模板,用户可以选择其中的某一个模板来创建自己的工程。也可以选择“Blank Project”(空白工程),完全由用户来编写所有的代码。如果选择已经做好的软件工程(如“Hello LED”、“ Hello world”、“Count Binary”等),用户可以根据自己的需要,在其基础上更改程序,完成C/C++应用出现的编写。一般情况下使用做好的软件工程比从空白工程做起来容易得多,也方便得多。

2014/9/10

65


本例在“Select Project Template”中选择“Count Binary”模板,工程项目名会自动变为“count_binary_0”(第2次选择该模板时工程项目名会变为“count_binary_1”),并出现在新建工程对话框的“Name”栏目中,此新建的工程名称可以由用户更改。

用鼠标单击新建工程对话框的“Finish”按钮后,新建工程就会添加到工作区中,同时Nios II IDE会创建一个系统库项目syslib(例如count_binary_0_syslib[nios_0])。在新建的count_binary_0工程中,count_binary.c是该工程C/C++主程序,用户可以根据需要对count_binary.c程序进行补充或修改。

2014/9/10

66


count_binary.c是一个PIO控制程序,在程序中使用一个8位的整型变量不断重复地从0计数到ff,然后用4个按钮(SW0-SW3)来控制计数结果分别输出到发光二极管LED、七段数码管和LCD上。count_binary.c程序比较复杂,不适于初学。为了便于初学与调试,下面以一个简单的C/C++调试程序替换原来的count_binary.c程序。即把count_binary.c程序中的原有内容除了头文件count_binary.h外,其余全部清除,然后将用户的应用程序重新编辑输入到count_binary.c中作为主程序。简单C/C++调试程序如下:

2014/9/10

67


#include "count_binary.h"

int alt_main (void)

{

int second;

while (1)

{

usleep(100000); //延迟0.1s

second++;

IOWR(SEG7_DISPLAY_BASE,0,second);

IOWR(LED_RED_BASE,0,second);

}

}

上述调试程序中,用一个变量second记录0.1s的延迟次数,并用DE2开发板上的七段数码管和红色发光二极管显示second中的数据。

2014/9/10

68


2. 编译工程

完成用户C/C++应用程序的编写后,用鼠标右键点击选中的工程名(如count_binary_0),在弹出的编辑工程快捷菜单中选择“Builder Project”项,或执行“Project”菜单的“Builder Project”命令,开始编译工程文件(也可以执行“Project”菜单的“Builder All”命令,对全部已建工程进行编译)。编译开始后,Nios II IDE会首先编译系统库工程以及其他相关工程,然后再编译主工程,并把源代码编译到.elf文件中。编译完成后会在Tasks浏览器中显示警告和错误信息。

2014/9/10

69


3. 调试工程

用鼠标右键点击选中的工程名(如“count_binary_0”)在弹出的快捷菜单中选择“Debug As”中的“Nios II Instruction Set Simulator”项,进入仿真模式调试方式。进入仿真模式后,IDE软件将生成C/C++程序的汇编程序代码,并呈现在“Disassembly”窗口中,把主窗口引导到适合软件调试的“Debug perspective”工作界面。在主窗口执行“Run”菜单的“Run As”的“Nios II Instruction Set Simulator”命令,或直接按动工具栏上的“Run”命令按钮,开始对设计工程进行仿真调试。开始仿真调试后的信息和仿真结果将呈现在信息浏览器的“Console”(控制台)窗口中。

2014/9/10

70


4. 运行工程

运行工程是通过Nios II IDE将C/C++应用软件的机器代码文件(.elf)下载到用户Nios II系统的工作存储器SDRAM中,通过执行程序实现相应的功能。

在运行工程之前,首先执行IDE主窗口“Tool”菜单的“Quartus II Programmer…”命令,把顶层设计的编程下载文件(如SOPC_DE2.sof)下载到DE2开发板的目标芯片中。然后执行“Run”菜单的“Run…”命令,弹出运行设置对话框,对运行工程进行设置。运行设置对话框共有“Main”、“Target Connection”、“Debugger”、“Source”和“Common”5个页面。在“Main”页面的“Project”栏目中填入或选择运行的工程名称,如“count_binary_0”。

2014/9/10

71


用鼠标单击选中运行设置对话框左面“Configurations”栏目中的“count_binary_0 Nios II HM Configurations”,进入“Target Connection”页面。在此页面的“JTAG Cable”栏目中选择工程目标代码下载使用的接口电缆,如果连接了多条JTAG电缆,就需要从“JTAG cable”的下拉菜单中选择与目标芯片开发板相连的电缆,如果开发板(如EDA6000)通过并行接口与计算机连接,则选择“ByteBlasterMV[LPT1]”,若是通过USB接口(如DE2开发板)与计算机连接,则选择“BSB-Blaster[USB-0]”。在“JTAG Device”栏目中选择下载的目标芯片类型,这里选择“automatic”或“1[EP2C35]”。在“Communication device”栏目中选择“jtag_uart_0”,表示选择使用UART接口。如果试验中不需要使用UART接口则选择该栏目中的“none”项。

2014/9/10

72


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“Run”按钮,开始程序下载、复位处理器和运行程序的过程。

在完成一次运行设置后,对于同一个工程没有必要每次运行前都设置,只要这些Nios Ⅱ主窗口中的“Run As”→“ Nios Ⅱ Hardware”命令,就可以直接运行工程。

2014/9/10

73


5.3.5 Nios II运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“的常用组件与编程

在一个基于Nios II的SOPC系统上,常用组件包括通用异步串口UART、发光二极管LED、七段数码管、按钮、LCD、存储器、定时器、鼠标、VGA等。另外,Nios II还允许用户创建自己的外围设备,并通过用户逻辑接口向导将其集成到Nios II处理器系统中。这种自动化工具能够检验VHDL或Verilog HDL源代码,识别顶层端口并将这些端口连接到合适的处理器总线信号上,整个过程用户介入很少,使电路与系统设计方便而快捷。下面以基于DE2(或DE2 70)开发板的Nios II系统为例,介绍Nios II系统的常用组件的硬件结构和软件编程,让读者进一步掌握Nios II嵌入式系统的开发技能。

2014/9/10

74


1. 运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“通用输入输出端口PIO

通用输入输出端口PIO包括输入IO(如按钮)、输出IO(如发光管LED、七段数码管等)和双向三态IO(如液晶显示屏LCD)。

(1)红色发光二极管LEDR

在DE2开发板有18只红色发光二极管,硬件设备命名为LEDR17~LEDR0,Nios II系统命名为LED_RED。采用Nios II IDE方式调试运行C++应用程序,利用Nios II IDE的“count_binary”工程模板(或其他模板)建立C++工程时,在系统为工程自动生成system.h头文件。

2014/9/10

75


例如,让运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“DE2开发板上的18只红色发光二极管LEDR17~LEDR0依次向左移位发光,的C/C++源程序LEDR18.c如下:

#include "count_binary.h"

int alt_main (void)

{ int i,data;

while (1)

{ data = 0x01;

for (i=0; i<18; i++)

{ IOWR(LED_RED_BASE,0,data);

data <<= 1;

usleep(100000); //延迟

}

}

}

2014/9/10

76


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“2)绿色发光二极管LEDG

在DE2开发板有9只绿色放光二极管LEDG8~LEDG0,Nios II系统命名为LED_GREEN。让DE2开发板上的9只绿色发光二极管LEDG8~LEDG0依次向右移位发光的C/C++源程序如下:

#include "count_binary.h"

void main(void)

{ int i, data;

while (1)

{ data = 0x01;

for (i=0; i<8; i++)

{ IOWR(LED_GREEN_BASE,0,data);

data <<= 1;

usleep(100000); } }

}

2014/9/10

77


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“3)七段数码管

在DE2上有8只七段数码管HEX7~HEX0,Nios II系统命名为SEG7_DISPLAY。让DE2开发板上的8只七段数码管HEX7~HEX0以两屏显示sum数据的C/C++源程序如下:

#include "count_binary.h"

int alt_main (void)

{ int sum;

while (1)

{ sum = 0x20090101;

IOWR(SEG7_DISPLAY_BASE, 0,sum);

usleep(1000000); //延迟

sum = 0x00235959;

IOWR(SEG7_DISPLAY_BASE,0, sum);

usleep(1000000); } //延迟

}

2014/9/10

78


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“4)电平开关SW

在DE2上有18只电平开关SW17~SW0,Nios II系统命名为SWITCH_PIO。例如,用key变量读取DE2开发板上18只电平开关SW上的数据,并用七段数码管显示读出的数据的C/C++源程序如下:

#include "count_binary.h"

int alt_main (void)

{

int key;

while (1)

{

key = IORD(SWITCH_PIO_BASE,0);

IOWR(SEG7_DISPLAY_BASE,0,key);

}

}

2014/9/10

79


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“5)按钮BUTTON

在DE2开发板上有4只按钮KEY3~KEY0,在nios_0系统上命名为BUTTON_PIO。例如,让ED2开发板上的18只红色发光二极管LEDR17~LEDR0依次向左移位或向右移位发光,用按钮KEY0来控制LED移位的方向的C/C++源程序如下:

#include "count_binary.h"

int alt_main (void)

{ int i, key, data;

while (1)

{ key = IORD(BUTTON_PIO_BASE,0);

if (key & 0x02)

{ data = 0x01;

for (i=0; i<18; i++)

{ IOWR(LED_RED_BASE,0,data);

data <<= 1;

usleep(100000); } //延迟

2014/9/10

80


} 运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“

else

{

data = 0x20000;

for (i=0; i<18; i++)

{IOWR(LED_RED_BASE,0,data);

data >>= 1;

usleep(100000);

}

}

}

}

2014/9/10

81


运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“nios_0系统加入按钮组件BUTTON_PIO时,是把它设置为具有中断功能的按钮,BUTTON_PIO有一个用于储存按钮值的边沿捕获寄存器edge_capture_ptr,采用中断方式时,每当任何按钮按下,其值就被边沿捕获寄存器捕获并保存其中。用边沿捕获寄存器捕获按钮数据的语句格式为:

*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);

另外,采用中断方式时还需要对按钮进行开放中断、复位边沿捕获寄存器和登记中断源的初始化处理过程。按钮初始化过程语句如下:

void* edge_capture_ptr = (void*) &edge_capture;

/* 开放全部4个按钮的中断. */

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);

2014/9/10

82


/* 运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“复位边沿捕获寄存器. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);

/* 登记中断源.*/

alt_irq_register( BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts );

例如,编写一个按钮控制程序,在DE2开发板用3个按钮(KEY3~KEY1)分别控制七段数码管显示不同的数据,其C/C++源程序button_2.c见教材。

2014/9/10

83


2. 运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“定时器

Nios II系统中的定时器是SOPC Builder组件库中的一个组件模块,该定时器是一个32位的可控减法计数器,在Nios II软件开发中,主要通过对定时器中的几个寄存器进行读写操作来定制该定时器实现定时。例如,编写一个秒显示程序,利用usleep()函数实现1秒定时,定时到后让秒计数器second加1,然后在DE2开发板的七段数码管上显示秒计数的结果,其C/C++应用程序如下:

#include "count_binary.h"

int main (void)

{ int second;

while (1)

{ usleep(1000000);

second++;

IOWR(SEG7_DISPLAY_BASE,0,second); }

}

2014/9/10

84


3. 运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“液晶显示器LCD

对LCD的编程可以采用直接在底层开发应用程序、调用标准函数开发和使用标准函数控制I/O设备3种方式,其中使用标准函数控制I/O设备方式最简单,下面介绍这种方式。

使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)函数是最简单的控制I/O设备的方法。例如,将字符“hello world!”发送给任何一个与stdout相连的C/C++源程序如下:

#include "stdio.h"

int main()

{

printf("hello world!");

return 0;

}

2014/9/10

85


工程参数进行设置对话框运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“

在编译此源程序之前,用鼠标右键点击Nios II IDE的工作界的C/C++工程浏览器窗口中的软件工程名(如count_binary_0),在弹出的编辑工程快捷菜单中选择“System Library Properties”项,弹出count_binary_0工程参数进行设置的对话框(Properties for count_binary_0_syslib)。

2014/9/10

86


如果在对话框中的“运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“stdout”(标准输出)、“stderr”(标准错误)和“stdin”(标准输入)栏目中都选择“lcd_16207_0”(DE2开发板上的LCD命名)项,则应用程序的信息或变量变化的数据将在LCD上显示;如果都选择“jtag_uart_0”(DE2开发板上的JTAG总线命名),则上述信息将在IDE软件界面的“Console”(控制台)上显示。

2014/9/10

87


ad