本节以正弦波发生模块的设计为例(图 4-2),它由 4个部分构成:InCount是阶梯信号发生模块,产生线性递增的
地址信号,送往 SinLUT。SinLUT是一个正弦函数值的查找表模块,由递增的地址获得正弦波值输出,输出的 8位正弦
波数据经延时模块 Delay后送往 Product乘法模块,与SinCtrl相乘。由于 SinCtrl是1位输入,SinCtrl通过Product就完
成了对正弦波输出有无的控制。SinOut是整个正弦波发生器模块的输出,送往D/A即可获得正弦波信号。
1 建立设计模型
1、打开Matlab环境。可以看到 Matlab的主窗口界面被分割成三个窗口:命令窗口( Command Window)、工作区
(Workspace)、命令历史( Command History)。在命令窗口中,可以键入 Matlab命令,同时获得 Matlab对命令的响应信
息、出错警告提示等。然后建立工作库。在建立一个新的设计模型前,先建立一个新的文件夹,作为work目录。
2. 新建一个simulink的模型文件(后缀为 mdl),在simulink的库管理器中选择“ File”菜单(图 4-6),在出现的菜
单中选择New,在弹出的子菜单中选择新建模型 model。图4-6右下角显示的就是新模型窗。点击此窗上方的彩色按钮,
也将弹出如图4-5所示的simulink库。
3、放置SignalCompilder。点击simulink库管理器左侧的库内树形列表中的 Altera DSP Builder条,使之展开DSP Builder
库,这时会出现一长串树形列表,对 DSP builder库的子模块(Block)进行了分组,再次点击其中的 AltLab项,展开
AltLab,选中库管理器右侧的SignalCompilder组件,按住鼠标右键拖动SignalCompilder到新模型窗口中(图4-7)。
注意:当在simulink库管理器中选中模块(Block)后,在库管理器的提示栏中会显示对应模块的说明。
4、放置Increment Decrement。参照图4-2,将Increment Decrement模块放置到新模型中。 Increment Decrement模块
(图 4-8)是 DSP Builder库中 Arithmetic模块。选中库中的 Arithmetic条,则在库管理器的右侧,可以看到 Increment
Decrement模块。按照放置SignalCompilder的方法,把Increment Decrement拖到新建窗口中。
Simulink
模型仿真
综合
(Quartus II,
LeonardoSpectrum,
Synplify)
ATOM Netlist产生
Quartus IIHDL仿真
(ModelSim)
综合
(Quartus II,
LeonardoSpectrum,
Synplify)
生成编程文件
(.pof,.sof)
下载至硬件
自动流程手动流程
mdl转成
vhdl
Matlab
Simulink
建立模型
Quartus II
图4-1 DSP Builder设计流程
5. 设置IncCount。用鼠标点击在新建模型窗口中的 Increment Decrement模块下面的文字“Increment Decrement”,就
可以修改文字内容,也就是可以修改模块名字。在这里不妨将其修改为“ IncCount”(图4-8)。然后按照图 4-2中描述的
含义,把 IncCount模块做成一个线性递增的地址发生器,这就需要对 IncCount模块的参数进行相应的设置:双击新建模
型中的IncCount模块,打开 IncCount的模块参数设置对话框: “Block Parameters:IncCount”(图4-9)。在参数设置对话
框的上半部分是该模块的功能描述和使用说明;对话框的下半部分是参数设置部分,对于Increment Decrement模块设置:
-
这里选择“signed Integer”,即有符号整数;输出位宽可选为
6;IncCount,Direction设为
Increment(增量方式)。Use Control
Inputs项可以不选。因为如果选中此项,此模块会出现两个输入端,分别是复位端和时钟端。通常在
simulink图中的元
件的复位和时钟端(如果存在的话)是分别默认接于低电平和与全局时钟相连的。Clock Phase Selection可设置为
1(二
进制),其他设置采用
Increment Decrement模块的默认设置。设置完的对话框如图
3-10。然后点击“OK”按钮确认。
注意,若对
DSP Builder库中模块设置参数值不了解,可以在相应模块的参数设置对话框中点击“Help”按钮。
6、放置正弦查找表(SinLUT)。在
Altera DSP Builder库的
Gate库中找到查找表模块:LUT(图
4-10),拖到新建
模型窗口,名字修改成“SinLUT”。双击
SinLUT模块,打开参数设置对话框:“Block Parameters SinLUT”,如图
4-11所
示。把输出位宽(Output[number of bits])改为
8,查找表地址线位宽(LUT Address Width)设为
6。在“MATLAB Array”
编辑框中输入计算查找表内容的计算式。在此可以直接使用
sin(正弦)函数,在这里
sin函数的调用格式为:
sin([起始值:步进值:结束值])。SinLUT是一个输入地址为
6位、输出值位宽为
8的正弦查找表模块,且输入地
址总线为有符号数,可以设置起始值为
0、结束值为
2π、步进值为
22π6
。计算式可写成:
127*sin([0:2*pi/(2^6):2*pi])
图
4-2 正弦波发生模块原理图
图
4-5 simulink库管理器图
4-7 放置
SignalCompiler
其中
pi即为常数π。上式的数值变化范围是-127 - +127 ,总值是
256,恰好是
8位二进制数最大值。但应注意,如
果改变地址线宽,如
8,以上的
2的
6次方要改成
2的
8次方。另外,在“Use LPM”处选择打勾,表示允许
QuartusII
利用目标器件中的嵌入式
RAM(在
EAB、ESB或
M4K模块中)来构成
SinLUT,即将生成的正弦波数据放在嵌入式
RAM构成的
ROM中,这样可以节省大量逻辑资源。否则只能用芯片中的
LCs来构成。SinLUT参数如图
4-11所示。
7、放置
Delay模块。在
simulink库管理器的
Altera DSP Builder库中,选中
Storage库下的
Delay,放置到新建模型
窗口。Delay(图
4-12)是一个延时环节。在这里可以不修改其默认参数设置。其具体的默认参数设置见图
4-12。
Clock Phase Selection参数主要是控制采样的,设置为
1时表示每一主频脉冲后,数据都能通过。按照图
4-2把他们
连接起来。把鼠标移动到模块的输入输出端口,鼠标指针就会变成十字形,这时按住鼠标左键,拖动鼠标就可以连线了。
8、放置端口
SinCtrl。在
simulink库管理器的
Altera DSP Builder库中,选中
Bus Manipulation库,找到
AltBus模块,
-
放置在新建模型窗口中。修改
AltBus模块的名字为
SinCtrl。SinCtrl是一个
1位输入端口,双击
SinCtrl模块,打开模块
参数设置对话框,设置
SinCtrl的
Bus Type参数为“Single Bit”,Node Type参数为“Input Port”,如图
4-13所示。
9、放置
Product(乘法)模块。在
Altera DSP Builder库中,选中
Arithmentic库,找到
Product模块(图
4-14),用鼠
标拖放到模型窗中。在这里
Product有两个输入,一个是经过一个
Delay的
SinLUT查表输出,另一个是外部一位端口
SinCtrl。按算法逻辑来看,实现了
SinCtrl对
SinLUT查找表输出的控制。双击
Product模块,打开参数设置对话框,设
置
Product的参数如图
4-14。“Use Dedicated Circuitry”选项用于对
FPGA中的专用模块的选择。
10、放置输出端口
SinOut。在
Altera DSP Builder库中,选中
Bus Manipulation库,找到
AltBus模块(图
4-15),放
置在新建模型窗口中。修改
AltBus模块的名字为
SinOut。SinOut是一个
8位输出端口,接向
FPGA的输出端口,与外
面的
8位
D/A转换器相接。双击
SinOut模块,打开模块参数设置对话框,设置
SinOut的
Bus Type参数为“Signed Integer”,
Node Type参数为“Output Port”,然后点击“Apply”按钮,修改“number of bits”参数为
8(图
4-15)。
11.文件存盘。放置完
SinOut模块后,按照图
4-2,把新建模型窗口中的
DSP Builder模块连接起来。这样就完成了
一个正弦波发生器的
DSP Builder模型设计。在进行仿真验证和
SignalCompiler编译之前,先对设计进行存盘操作:点击
新建模型窗口的“File”菜单,在下拉菜单中选择“
Save”项,取名并保存(注意,必须保存在自己建立的文件夹中)。
在这个例子中,对新建模型取名为
Sinout,模型文件为
sinout.mdl。保存完毕后,新建模型窗口的标题栏就会显示模型名
称。注意:对模型文件取名,尽量用英文字母打头,不使用空格,不用中文,文件名不要过长。在对模型取名后,就可
以使用
SignalCompiler进行编译,不过现在模型的正确性还是未知的,需要进行仿真验证。
图
4-6 建立新模型图
4-9 设置递增递减模块
图
4-8 递增递减模块改名为
IncCount 图
4-10 LUT模块
图
4-11设置
SinLUT图
4-12 Delay模块及其参数设置窗
2 Simulink模型仿真
用
DSP Builder模块设计好一个新的模型后,可以直接在
simulink中进行算法级、系统级仿真验证。对一个模型进行
仿真,需要施加合适的激励、一定的仿真步进和仿真周期,添加合适的观察点和观察方式。
1、加入仿真步进模块。首先加入一个
Step模块,以模拟
SinCtrl的按键使能操作。在
Simulink库管理器中,展开
simulink库,选中
Sources库,把
Sources库中的
Step模块拖放到
sinout模型窗口中(如图
4-16)。参照图
4-2,把
step模
块与
SinCtrl输入端口相接。注意,凡是来自
Altera DSP Builder库以外的模块,SignalCompiler都不能将其变成硬件电路,
-
即不会影响生成的
VHDL程序,但在启动
Simulink仿真后能影响后面产生的仿真激励文件。
Step模块的情况正是如此。
2、添加波形观察模块。在
simulink的库管理器中,展开
simulink库,选中其中的
Sinks库,把
Scope(示波器,图
3-17)模块拖放到
sinout模型窗口中。双击该模块,打开的是一个
Scope窗口(图
4-18)。
3、Scope参数设置。用鼠标点击
Scope模块窗口上侧工具栏的第二个工具按钮:
“Parameters”参数设置。打开
Scope
参数设置对话框(图
3-19),在
Scope对话框中有两个选项页:
“Gerneral”和“Data History”。在“
Gerneral”选项页中,
改变“Number of axes”参数为
2。点击“
OK”后可以看到
Scope窗口增加了两个波形观察窗。每个观察窗都可以分别
观察信号波形,而且相对独立。然后将
SinCtrl的信号接向
Scope的另一端(图
4-21),以作信号比较。需要注意的是,
此路信号在生成的
VHDL文件中不会有相应语句,因为没有接上输出端口模块:AltBus模块。
图
4-13 设置
SinCtrl图
3-18 Product模块图
4-14 设置乘法单元
图
4-15 设置
SinOut图
4-16 Step模块图
4-17 Scope模型图
4-18 Scope初始显示图
4-19 设置
Scope参数
4、设置仿真激励。按图
4-2连接
sinout模型的全图,准备开始仿真。在仿真前还需要设置一下与仿真相关的参数。
先设置模型的仿真激励。在
sinout模型图中只有一个输入端口
SinCtrl,需要设置与此相连的
Step模块:双击放置在
sinout
模型窗口中的
Step模块,设置对输入端口
SinCtrl施加的激励。在打开的
Step模块参数设置对话框中,可以看到下列参
数(详见图
4-29),图
4-20中各参数值的含义是:步进间隔(
step time);初始值(Initial value);终值(Final value);采
样时间(
Sample time)。在此设置“
step time”为
50;“Initial value”为
0,即初始时,不输出正弦波;
“Final Value”为
1;
“Sample time”为
1。把最后两项选择:
“Interpret vector parameters as 1-D”和“Enable zerocrossing dectection”都设为打
勾。在
sinout模型编辑窗中(图
4-21),点击“Simulation”菜单,在下拉菜单中选择“
Simulation parameters”菜单项,
如图
4-22所示。随后,将弹出
sinout模型的仿真参数设置对话框:
“Simulation Parameters : sinout”。
图
4-20 设置
Step图
4-21 sinout全图
仿真参数设置对话框中共有
5个选项页:Solver、Workspace I/O、Diagnostics、Advanced、Real-Time Workshop。其
中“Solver”选项页中完成仿真时,基本的时间设置、步进间隔和方式、输出选项。在
sinout模型中,可设置“
Start time”
为
0.0,“Stop time”为
500。其他设置按照默认。选项页的设置也按照默认设置。然后,点击“OK”按钮确认。
注意:为了能更好的在波形观察窗中区分不同信号,可以在
sinout模型中对连接线进行命名:双击对应的连接线,就会
出现一个可以输入文本的小框,在框中输入信号的名称。
5、启动仿真。
sinout模型编辑窗中,选择“
Simulation”菜单,选“
Start”项,开始仿真(图
4-31)。等待仿真结束,
-
双击
Scope模块,打开
scope观察窗。图
4-24显示了仿真结果,SinOut信号是
sinout模型的输出(scope观察窗中模拟了
D/A的输出波形),SinCtrl信号是
sinout模型的输入,可以看出
SinOut受到了
SinCtrl的控制。当
SinCtrl为
1时,SinOut
波形是正弦波;当
SinCtrl为
0时,输出为
0。在
Scope观察窗中,可以使用工具栏中的按钮来放大缩小波形,也可以在
波形上单击右键使用“Autoscale”,使波形自动适配波形观察窗,用鼠标左键,可以放大波形。
6、设计成无符号数据输出。一般的
D/A器件的输入数据都是无符号的正数。因此,为了能在硬件系统上
D/A的输
出也能观察到此波形,必须对此输出作一些改进,以便输出无符号数。简单的方法是将图
4-24中的波形向上平移
127,
即对输出的数据加上
127即可。另一种方法是改变所有模块的数据类型为无符号,再改变
LUT中的公式为:
(127*sin[0:2*pi/2^6]:2*pi)
))+ 128 即可。图
4-26是改进后的电路,其功能即在原输出的有符号数据上加上
了
127。原理是将乘法器输出的
8位有符号数的最高位取反并以无符号数输出。图
4-25是图
4-26的电路产生的仿真波形,
可以看出整个波形在
0以上。以下将对图中出现的新模块的用法作一说明。
在simulation 的config para里在设置下
3 SignalCompiler使用方法
在
Simulink中完成仿真验证后,就需要把设计转到硬件上加以实现。这是整个
DSP Builder设计流程中最为关键的
一步,在这一步,可以获得针对特定
FPGA芯片的
VHDL代码。
1、双击
sinout模型中的
signalCompiler模块,将出现如图
4-33所示的对话框,点击“Analyze”(分析)按钮后,
SignalCompiler就会对
sinout模型进行分析,检查模型有无错误,并在
Matlab主窗口弹出对话框,并给出相关信息。
2、设置
Signal Compiler。在图
4-34中显示了
Signal Compiler窗口,大致上可以分为三个功能部分:
左侧的项目设置选项“Project Setting Options”;右侧的硬件编译流程“Hardware Compilation”;下方的信息框
“Messages”。SignalCompiler的设置都集中在项目设置选项部分。在“Device”下拉选择框中选择需要的器件系列,默
认为
Stratix系列器件,对此可以修改。在此选为
Cyclone系列。注意,在“Device”中只能选择器件系列,不能制定具
体的器件型号,这需由
QuartusII自动决定使用该器件系列中的某一个具体型号的器件,或在手动流程中由用户指定。
图
4-33 双击
SignalCompiler图
4-34 打开
SignalCompiler窗口图
4-36 出现
MDL to VHDL信息
3、把模型文件
MDL转换成
VHDL。当设置好“Device”和“Synthesis”后,右侧的硬件编译“Hardware Compilation”
部分就会列出一个操作流程,见图
4-34。分别为:
“Convert MDL to VHDL”:转换
MDL文件为
VHDL文件;“Synthesis”:综合;“QuartusII”Quartus编译适配,
生成编程文件。先点击步骤
1的图标,完成
simulink文件(*.mdl)到
VHDL文件的转换。转换完成后,在“Messages”
信息提示框中,会显示“Generated top level “sinout.vhd” files”,即顶层文件
sinout.vhd完成转换(图
4-34)。sinout模型生
成的
VHDL文件“sinout.vhd”可以在文件夹
e:/myprj/sinwave中找到。
-
4、综合(Synthesis)。点击步骤 2的图标,完成综合过程(图 4-35)。在这个例子中是调用 QuartusII来完成综合过
程的,在综合后生成原子网表供适配器使用,并自动生成QuartusII可直接调用的工程。
5、QuartusII适配。点击步骤 3的图标,调用 QuartusII完成编译适配过程,生成编程文件: pof文件和sof文件(图
4-36)。编程文件可以直接用于 FPGA的编程配置。点击图 4-36的“Report File”按纽,将获得详细的报告文件。 sinout
模型对应的报告文件为sinout_DspBuilder_Report.html。
4 使用QuartusII实现时序仿真
进行门级的时序仿真仍然是十分重要的, SignalCompiler已将 MATLAB上的仿真信息转变成了可用于 QuartusII进
行时序仿真的激励信息及相关仿真文件:sinout_quartus.tcl,因此能容易地完成此项任务。步骤如下:
1、打开 QuartusII环境,选择菜单“ File”→“Open Project …”,定位到 sinout模型所在路径目录,打开 DSP Builder
建立的QuartusII工程文件:sinout.quartus(图4-47)。
2、上文中提到,在 SignalCompiler中的 QuartusII编译,具体的器件由 QuartusII自动决定,可实际使用中,器件往
往不是 QuartusII自动选定的那个型号,管脚也不是 QuartusII自动分配的管脚。这些都需要在 QuartusII中进行修改。所
以这里须按照第 3章中叙述的方法选择具体器件型号,如 EP1C6Q240C8,然后启动全程编译,即执行 Start Compilation。
3、启动仿真编译。即执行菜单“ Processing”→“Start Simulation”。结束后能看到图 4-45所示的界面。然后打开仿
真波形报告窗(如图 4-45所示,此窗已自动打开):执行菜单“ Processing”→“Simulation Report”。图4-46即为时序仿
真波形,所不同的是,正弦信号是用数据的方式显示的。注意,如果这时看不到输出的波形数据,应该回到 MATLAB
设计文件检查,仿真、变换(注意这时只按SignalCompiler中的第一按钮!),或检查机器是否P4或以上。
图4-46 sinout工程的QuartusII仿真波形(门级时序仿真)
5 使用QuartusII硬件测试与硬件实现
在此按照第3章中介绍的方法锁定管脚( Pin)。首先打开 sinout工程文件 sinout.vhd,了解端口情况,由于目标器件
已确定为EP1C6Q240C8,对D/A输出的 8位oSinOuts(7 downto 0)可分别接 PIO31-PIO24,对应引脚号是: 136、135、
134、133、132、128、41、21;系统时钟 clock接实验板的“ clock0”,对应第 179脚;清 0信号sclrp接键7,对应第 239
脚;输出控制 iSinCtrls接键 8,对应第 240脚。接着进行编译,完成适配过程。最后是进行硬件的下载,连接好 FPGA
开发板。选择模式 5,clock0可接65536Hz;打开 +/-12V电压,用示波器检测 D/A的输出,把键控 SinCtrl设置为有效(将
键8设成高电平,键 7设为低电平),就可以在示波器上看到产生的正弦波了。然后将实测结果与在计算机上进行的时序
仿真结果进行比较。最后可以按照第 3章的方法利用 SignalTapII测定芯片内的实时波形,从而完成更深入的系统测试。
注意,若再想改动 Simulink中的sinout.mdl图,应该注意两点: 1、内部电路结构和设置可以改,但端口信号名不要
改,如输入的 SinCtrl,SinOut,因为此信号的引脚已被锁定,不便改变; 2、改动 sinout.mdl图后只宜作系统仿真和 VHDL
文件转换,不宜作综合,即最多只能对图 4-34所示的界面执行第 1个按纽,否则将可能把原来设定好的引脚全部冲掉。
为了保存引脚信息,综合与适配两项操作必须在进入QuartusII后进行。
3-2 32位软核嵌入式处理器系统Nios开发实验
1 Nios软硬件开发流程
设计流程的第一步,是设计规划。需要根据系统设计要求,划分好各个软硬件模块。完整的基于 Nios的 SOPC系
统是一个软硬件复合的系统,在开发时可以分为硬件、软件两个部分。对于通常的嵌入式系统开发,往往 CPU是不可更
改的,因而外围设备的变动也受到 CPU的限制,因而通常的嵌入式开发更多的是 PCB设计及软件开发。但 Nios是一个
可灵活定制的CPU,它的外设是可选的 IP核或自定制逻辑,可以根据系统设计要求,通过 SOPC Builder向导式的界面
定制裁剪得当的SOPC系统。Nios的开发流程分为两个大部分:硬件开发与软件开发。
Nios的硬件设计流程就是为了定制合适的 CPU和外设,在 SOPC Builder和QuartusII中完成。在这里可以灵活定制
Nios CPU的各个特性甚至指令,可以使用 Altera提供的大量的IP Core来加快开发者开发Nios外设的速度,提高外设的
性能,也可以使用第三方的 IP Core,或者使用 VHDL、Verilog来自己定制外设。完成 Nios的硬件开发后,SOPC Builder
可以帮助开发者生成相应的 SDK(软件开发包)。这是由于在硬件开发中的 Nios CPU及其外设构成的系统是自定制的,
存储器、外设地址的映射等都各不相同,需要的 SDK也应是专有的,不过不用开发者操心,SOPC Builder自动生成SDK。
-
NIOS嵌入式系统是自己定制的、裁剪过的,可能受到硬件的局限会小一些。开发者可以使用汇编或 C语言,甚至
C++,来进行嵌入式程序设计。当软硬件开发都完成了,接下就需要在 Nios开发板上实现一个要求设计的系统的原型。
在这个软硬件原型上,运行整个系统,测试是否达到要求。
2 Nios软硬件开发流程
在这一节,将以一个简单的基于Nios的SOPC系统的开发过程来详细讲述Nios硬件开发的具体流程。
设计规划
硬件开发
定义Nios系统模块
(SOPC Builder)
锁定引脚、硬件编译
(QuartusII)
定制SDK(SOPC Builder)
硬件原型设计
(Nios开发板)
软件原型设计
(Nios开发板)
软件开发
编译、连接、调试
(SOPC Builder)
自定义外设、指令
(SOP C Builder&QuartusII etc.)
生成Nios系统模块
(SOPC Builder)
编写应用程序
(SOPC Builder)
开发自定制硬件模块
的驱动或子程序
(SOPC Builder)
OS移植
(SOPC Builder)
基于Nios的
SOPC系统实现
图5-1 Nios软硬件开发流程
文章评论(0条评论)
登录后参与讨论