第1节 基于 MATLAB/DSP Builder的DSP模块设计流程
DSP Builder是一个系统级(算法级)设计工具,但同时它把系统级(算法仿真建模)和RTL级(硬件实现)的设计工具连接起来,使算法开发到硬件的实现可 以无缝地过渡。使用Matlab/DSP Builder进行DSP系统的开发必须要安装Matlab和DSP Builder软件。
DSP Builder设计包括两套流程:自动流程和手动流程:
设计流程的第一步
在Matlab/Simulink中进行设计输入,在Matlab/Simulink中建立一个模型文件(mdl文件),用图形方式调用DSP Builder和其它Simulink库中的模块,构成系统级或算法级设计框图。利用Simulink的图形化仿真、分析功能,分析此设计模型的正确性, 完成模型仿真。第一步设计同一般的
Matlab/Simulink建模过程几乎没什么区别,所不同的是,设计采用了DSP Builder库。 设计流程第二步
通过SignalCompiler把Simulink的模型文件转化为硬件描述语言文件,以供其它的EDA(Quartus II、ModelSim 等)软件处理,这些软件不能直接处理Matlab/Simulink产生的模型文件,那么DSP Builder中的
SignalCompiler模块用于完成模型文件到硬件描述语言文件的转换,转换之后的HDL文件是RTL级(寄存器传输级,即可综 合的格式)。 设计流程的第三步
执行RTL级的仿真,DSP Builder 支持自动流程的ModelSim仿真。用户也可以利用第二步产生的VHDL文件使用其它的仿真工具软件手动地进行仿真。 设计流程的第四步
使用第二步SignalCompiler产生的VHDL文件进行RTL级的综合,网表产生和适配等处理,DSP Builder支持自动流程和手动流程两种方式:自动流程中可以选择让DSP Builder自动调用Quartus II等EDA软件来完成相应的工作;手动模式允许用户选择相应的软件来完成相应的工作,手动模式需要更多的干预,同时提供了更大的灵活性,用户可以指定综 合、适配等过程的条件。 第三步和第四步可以不分先后。 设计流程的第五步
在Quartus II中编译用户的设计,最后将设计下载,进行测试验证。
经过测试、验证的设计可以单独执行相应的DSP功能。如果DSP Builder产生的DSP模型只是整个设计中的一个子模块,那么可以在设计中调用DSP Builder产生的VHDL文件,以构成完成的设计。
第2节 正弦发生器模块的设计
通过本例的学习可以掌握DSP Builder的使用方法。这个简单的正弦波发生器,主要由4部分构成:IncCount是阶梯信号发生模块,产生一个按时钟线性递增的地址信号,送往 SinLUT。SinLUT是一个正弦函数值的查找表模块,由递增的地址获得正弦波的离散值输出。由SinLUT输出的8位正弦波数据经过一个延时模块 Delay后,送往Product乘法模块,与SinCtrl相乘,SinCtrl是一位输入,SinCtrl通过Product完成对正弦波输出有无的 控制。SinOut是整个正弦波发生器模块的输出,送往D/A即可获得正弦波模拟输出信号。 5.2.1 建立设计模型
(1)运行Matlab,Matlab的主窗口被分成3部分:Command Window、Workspace/Current Directory、Command History。
(2)建立工作目录。在建立一个新的设计模型前,先要建立一个文件夹,作为工作目录,来保存相应的设计文件,在进行设计之前要先切换到该文件夹下。新建和切换到工作目录可以在命令窗口中使用Matlab 命令,也可以在Current Directory窗口中实现。
(3) 启动Simulink,建立模型。 在命令窗口中,键入Simulink,按回车键,启动Matlab图形化仿真工具Simulink,出现了Simulink Library Browser窗口,在窗口的左侧为Simulink Library 列表,右侧窗口显示的则是,被选中的库中的组件、子模块列表。安装完DSP Builder之后,在Simulink 库列表中可以看到Altera DSP Builder的库出现在列表中。在下面设计中,主要使用该库中的组件、模块来完成各项设计,再使用Simulink库来完成模型的仿真和验证。
选择File菜单,然后单击new,在弹出的子菜单中选择Model,出现了一个未命名的模型窗口。
(4) 放置 SignalCompiler。单击Simulink库列表中的Altera DSP ,单击Altlab项,使之展开。选中右侧窗口中的SignalCompiler组件,按住鼠标左键拖放到新模型窗口中。也可以单击右键,选择Add to ‘untitled’,这里’untitled’是指我们新建的未命名的模型文件。 在选中SignalCompiler模块后,在Simulink窗口中的提示栏里会显示对应模块的说明,简单的功能介绍。可以看到 SignalCompiler的介绍为 “Converts Model Files to VHDL files.” 即为进行模型文件mdl到VHDL文件的转换,所
以SignalCompiler是进行任何DSP系统设计必须要添加的模块。选中
SignalCompiler选中Help for the ‘SignalCompiler’ block。可以了解怎样使用SignalCompiler的具体信息。也可以按照此方法获得其它的模块相应的帮助信息。 (5)添加Increment Decrement模块。Increment Decrement模块是DSP Builder库中Arithmetic子库中的模块。选中Altera DSP Builder中的Arithmetic子库,然后在其中选择Increment Decrement模块。然后按照添加SignalCompiler的方法将Increment Decrement添加到模型文件中。
(7)添加正弦查找表。在Altera DSP Builder库的Gate &Control子库中找到查找表模块LUT,把LUT拖放到新建模型窗口,将LUT模块的名字修改为“SinLUT”。
双击SInLUT模块,打开模块参数设置对话框“Block Parameters: SinLUT”。把输出位宽设为8;查找表地址设为6;总线数据类型Bus Type选择为有符号整数 Signed Integer;在Matlab Array编辑框中输入计算查找表内容的计算式。
在这里使用sin函数,sin函数的调用格式为: sin([起始值:步进值:结束值])
,步进值为,计算式可写成:SinLUT是一个输入地址为6位,输出值位宽为8位的正弦查找表模块,且输入地址总线为有符号数,所以设置起始值为0,结束值为2
127*sin([0:2*pi/2^6:2*pi])
,这是Matlab中的语法。上式的数值变化范围是-127~+127,恰好是8位二进制数可以表示的最大值,所以8位的输出值位宽可以表示上式所描述的正弦波形。其中pi就是常数
如果将SinLUT模块的总线数据类型设置为无符号整数Unsigned Integer,且输出位宽改为10,若想得到完成满度的波形输出,应将表达式改为: 511*sin([0:2*pi/2^6:2*pi])+512
选中”Use LPM”(LPM: Library of Parameterized Modules 参数化模块),如果选中”Use LPM”的话,Quartus II 将利用目标器件中的嵌入式RAM来构成SinLUT,即将生成的正弦波数据放在嵌入式RAM构成的ROM中,这样可以节省大量的逻辑资源,否则 SinLUT只能用芯片中的LCs来构成。 选中”Register Address”,选中此选项会生成输入地址总线,如果目标器件是Straitix或者Cyclone,并且选中了LPM选项,用户必须选中”Register Address”选项。
(8)添加Delay模块。在Altera DSP Builder库中,选中Storage子库下的
Delay模块,拖放到新建模型窗口。Delay模块可以实现延时的功能,在这里可以使用其默认参数设置。
在Delay模块的参数设置的对话框中,参数Depth是描述信号延时深度的参数。当Depth为1,模块传输函数为 1/Z,通过Delay模块的信号被延时一个时钟周期;当Depth为整数n时,其传输函数为1/Zn,通过Delay模块的信号将被延时n个时钟周期。 Delay模块在硬件上采用寄存器来实现,所以Delay模块被放在Storage子库中。 Clock Phase Selection 参数主要是控制采样的。当设置为1表示Delay模块总处于使能状态,所用的数据都通过Delay模块。如果设置为10则每隔一个脉冲处于使能状态,那么 每隔一个的数据才能通过Delay模块。如设置为0100,表示Delay模块在每4个时钟中第二个时钟是处于使能,那么每4个数据只有第二个数据可以通 过。
(9)添加断口SinCtrl。在Altera DSP Builder库中选择IO & BUS子库,找到AltBus模块,拖放到新建模型窗口中。修改AltBus模块的名字为SinCtrl。SinCtrl是一个1位输入端口。双击 SinCtrl模块,打开模块参数设置对话窗口。设置SInCtrl的Bus Type为”Single Bit”,Node Type参数为”Input Port”。
(10)添加Product(乘法)模块。在Altera DSP Builder库中选择Arithmetic子库,找到Product模块。
将之拖放到新建模型窗口中去,这里Product有两个输入一个是经过Delay的SinLUT输出,另一个是一位端口 SinCtrl,Product实现了SinCtrl对SinLUT查找表输出的控制。双击Product模块,打开Product模块参数设置对话框。 其中Pipeline(流水线)参数指定该乘法器模块使用几级流水线,即乘积延时几个时钟周期后输出,选中”Use LPM”,表示使用参数化的模块库来实现,选择”Use Dedicated Circuitry”表示可以使用FPGA中的专用模块来实现. (11) 添加输出端口Out。在Altera DSP Builder库中,选择IO & BUS子库,找到AltBus模块,拖放到信件模型窗口中,修改AltBus模块的名字为Out。
Out是一个8位输出端口,接到FPGA的输出引脚,与片外的8位D/A转换器相接,D/A转换模块将数字信号转化成模 拟信号。双击Out模块,打开参数设置对话框,设置Out的Bus Type为”Signed Integer”, Node Type参数为”Output Port”,然后单击Apply,然后修改”Number of bits”为8。。
Saturate选项如果被选中,则当输出大于要表达的值的最大正值或负值,则输出被强制为最大的正值或负值。若此选项未被选中,则最高位MSB被截断。此选项对输入端口和常数节点类型是无效的。
(12)保存设计文件。放置完Out模块,把新建模型中的DSP Builder模块连接起来,这样就完成了一个正弦波发生器的DSP Builder模型设计。在进行仿真验证和SignalCompiler编译之前,先把设计保存起来。单击File菜单,选择Save操作,取名并保存。 本例中,新建模型取名Sinout,生成模型文件Sinout.mdl。 模型保存之后,先要对模型进行仿真验证,如通过验证,则使用SignalCompiler进行编译将mdl文件转换为VHDL文件。 5.2.2 Simulink模型仿真
Matlab的Simulink环境具有强大的图形化仿真验证的功能。用DSP Builder模块设计好的模型,可以在simulink中进行算法级、系统级仿真验证。对一个模型进行仿真需要施加合适的激励,在特定的观察点添加必须的观察模块。 1. 加入Step模块
本例中,先加入一个step(阶跃模块),来实现模拟SinCtrl的按键使能操作。在simulink的simulink基本库中,选择Source子库,把其中的Step模块拖放到Sinout模型窗口中去,并将其与SinCtrl的输入端口相连。
注意:凡是来自Altera DSP Builder库以外的模块,SignalCompiler都不能将
其转换成硬件描述语言的模块。 2. 添加波形观察模块
在Simulink中选择Simulink库,展开Simulink库,选中其中的Sinks子库,把Scope(示波器)模块拖放到SinOut模型窗 口中去。双击该模块,打开的是一个Scope窗口。如图5-11所示,图中只有一个信号的波形观察窗口,若希望可以多观察记录信号,可以通过添加多个 Scope模块的方法来实现,也可以通过修改Scope的参数来实现Scope模块中的观察窗口数。 3. Scope模块参数设置
用鼠标单击Scope模块窗口上侧工具栏的第二个按钮:Parameters,弹出参数设置对话框,以进行参数设置。
在Scope参数设置对话框中有两个设置页:General和Data History。在General页中,改变Number of axes为2。在单击OK按钮后,可以看到Scope窗口出现了两个波形观察窗。每个观察窗可以独立地观察信号波形。同时Scope模块也多了一个输入 端,将SinCtrl的信号接到这一新增的输入端,作为参考信号。 4. 设置仿真激励
先设置模型的仿真激励。在SinOut模型中,只有一个输入端口SinCtrl,需要设置与之相连的Step模块。双击Step模块,在弹出的Step模块参数设置对话框中设置对其输入端口SinCtrl施加的激励。
各参数值的含义如下:
阶跃时刻(Step time):Step模块的输出在该时刻发生阶跃,默认值为1,单位为秒。
初始值(Initial value):在阶跃时刻的之前的Step模块的输出值,默认值为0。
终值(Final value):在阶跃时刻之后Step模块的输出值,默认值为1。 采样时刻(Sample time):Step模块输出的采样频率。 设置Step time为30,则在30秒时该模块会发生输出值的阶跃。初始值设为0,那么在30秒时刻之前,不输出正弦波;终值设为1。Sample time设为0,设为0的话,在大的和小的时间间隔都进行采样,设成0的模块被称作连续采样;设成1的话,则只在大的时间间隔上采样。选中底部的两项选 择:“Interpret vector parameters as 1-D” 和 “Enable zerocrossing detection”
在SInOut模型窗口中,单击Simulation菜单,在下拉菜单中选择Simulation parameters。将弹出SinOut模型的仿真参数设置对话框:”Configuration Parameters: SinOut/configuration”。
仿真参数设置对话框共有7个选项页:Solver、Data Import/Export、Optimization、Diagnostics、Hardware Implementation、Model Referencing、Real-Time Workshop。其中”Solver” 页中完成仿真时的基本时间设置、计算器和解算器(solver)的步进方式及输出选项等设置。 5. 启动仿真
在SinOut模型窗口中,选恶Simulation菜单下的Start项,开始仿真。仿真结束后,双击Scope模块,打开Scope观察窗。出现如图5-15所示的仿真结果。可以看到SinOut受到了SinCtrl的控制。 6. 设计成无符号数据输出
127间变化,但一般的D/A器件的输入数据都是无符号的正数。因此为了能在硬件系统上D/A由示波器的波形可以看到,输出的正弦波是有符号的数据,在 的输出也能观察到此波形,必须对此输出做一些改进,以便输出无符号数。最简单的方法就是将输出波形向上平移127即可,SinLut的Bus Type设置为 ”Unsigned Integer”,SinLut的波形数据公式改为:
127*sin([0:2*pi/(2^6):2*pi])+128。然后将输出端口Out的Bus Type改为”Unsigned integer”类型。修改完成之后,进行仿真,可以看到输出的波形都在0以上。
5.2.3 使用SignalCompiler进行从算法到硬件实现
在Matlab中完成仿真验证后,就要把设计转换到硬件上加以实现。通过DSP Builder可以获得针对特定FPGA芯片的HDL代码。 1. 分析模型
双击SinOut模型中的”SignalCompiler”图标启动DSP Builder,出现如下的窗口:
单击”Analyze”按钮,SignalCompiler将会对模型进行分析,检查模型有无错误。如果设计存在错误,将会停止分析过程,并在 Matlab软件的命令窗口中给出相关信息。如果设计不存在错误,则在分析结束后打开”SignalCompiler”窗口。Simulink具有强大的 错误定位能力,对许多错误可以在simulink模型中直接定位,用不同的颜色来标示有错误的模块。如果SignalCompiler分析当前的DSP模 型有错误时,必须修改正确才能继续下面的设计流程。
2. 设置SignalCompiler
在SignalCompiler窗口中,要进行一些必要的设置。SignalCompiler窗口大致上可以分为3个功能部分:
左上为项目设置选项——Project Setting Options; 右上为硬件的编译流程——Hardware Compilation; 下方为信息框——Messages。
SingalCompiler的设置集中在项目设置选项部分。
在Device下拉选择框中选择目标器件的系列。这里只能选择器件的系列,不能指定具体的器件型号,这需要由Quartus II自动决定使用该器件系列中的某一个具体型号的器件,或在手动流程中由用户指定。
在Synthesis(综合)下拉选择框中,可以选择综合器,共有3个选项: Mentor的LeonardoSpectrum综合器; Synplicity的Synplify综合器;
Altera的Quartus II,Quartus II是FPGA/CPLD的集成开发环境,其内含综合功能。
在Optimization(优化)下拉选择框,指明在综合、适配过程中的优化策略,是优先对面积(Area)优化还是速度优化(Speed)的选择,即资源占用优先还是性能优先。
项目设置选项部分的下部是一些选项页,包括下面的内容: Main Clock:系统主时钟的周期的设置; Reset:系统复位信号的设置;
Signal Tap II:嵌入式逻辑分析仪的设置; Testbench:仿真测试文件生成的选择; SOPC info: SOPC相关设置。
Main Clock的缺省值为20ns,即对应50MHz的频率。如果要使用第三方的仿真软件(如ModelSim)则在Testbench页中,选 中”Generate Stimuli for VHDL Testbench.”,生成第三方VHDL仿真软件的激励测试文件。如若不然不要选择此选项,选择此选项的话,simulink运行会比没选中此选项的 情况下慢很多。
3. 把模型文件Mdl转化成VHDL文件
完成上面的设置之后,信息窗口会提示用户进行Mdl文件到VHDL文件的转换操作。
点击 1. Convert MDL to VHDL的图标,执行mdl模型文件到VHDL文件的转换。转换完成后,Message框中会出现如下的提示 > Generated top level file ‘Sinout.vhd’ > Completed MDL to VHDL conversion
> See ‘Sinout_DspBuilder_Report.html’ report file for additional information 以上提示说明了:产生了Sinout.vhd的顶层文件,完成了mdl文件到VHDL文件的转换,更多的信息,参看Sinout_DspBuilder_Report.htm文件,点击Report File按钮即可。 4. 综合
单击步骤2的图标,执行综合过程,这里选择的综合工具是Quartus II,综合后生成Atom Netlist(网表)文件,以供第三步适配过程使用。综合过程完成之后,信息框中会给出此项目的一些信息:如器件的系列,使用的逻辑宏单元的数目、触发 器的数目、引脚数、RAM容量等。详细的信息也是参照上面提到的项目报告文件。 5. Quartus II适配
单击步骤3的图标,调用Quartus II完成编译适配过程,生成编程文件:pof文件和sof文件。
单击Report按钮,查看详细的报告信息。以上的三个步骤可以分开单步执行,也可以点击’execute steps 1,2 and 3”,一步执行。 6. 编程
完成了以上三步操作之后,program device的图标由不可用编程可用(由灰变亮),连接好硬件便可以进行下载了。但在下在之前,还要做一些必要的仿真和测试:使用ModelSim进行RTL级仿真,使用Quartus II 进行时序仿真,进行硬件测试等。
5.2.4 使用ModelSim进行RTL级仿真
在Simulink中已经对模型进行过仿真验证,但是是属于系统级的验证,并没有对生成的VHDL代码进行过仿真。事实 上,由Mdl文件转化而来的VHDL描述是RTL级的,而在simulink中的模型仿真是算法级的,转换后的代码实现可能与mdl模型描述的情况不完全 相符。这就需要针对生成的RTL级VHDL代码进行功能仿真。
当在SignalCompiler设置窗口中的Testbench页中选中”Generate Stimuli for VHDL Testbench”,DSPBuilder在mdl转换到VHDL的过程中会生成对HDL仿真器ModelSim的测试文件。
ModelSim是Mentor Graphics的子公司Model Technology的产品,ModelSim是业界最优秀的HDL语言仿真器,具有快速的仿真性能和最先进的调试能力,支持众多的ASIC和FPGA厂 家库,是作FPGA、ASIC设计的RTL级和门级电路仿真的首选。是唯一的单内核支持VHDL和Verilog混合仿真的仿真器,全面支持VHDL和 Verilog语言的IEEE 标准,以及IEEE VITAL 1076.4-95 标准,支持C语言功能调用,支持 C模型、基于SWIFT的SmartModel逻辑模型和硬件模型的仿
真。它具有丰富而又易用的图形用户界面,提供最友好的调试环境,为加快调试提供强有 力的手段。 仿真方法:
启动ModelSim软件,选择Tools菜单下的Execute Macro…,在打开的文件选择对话框中切换到SinOut模型SinOut.mdl文件所在的目录,选择tb_SinOut.tcl,ModelSim 执行tb_SinOut.tcl,开启仿真,随后会自动打开wave窗口,显示仿真结果。
但是显示的结果是以数字形式显示的,与simulink中的仿真结果没有可比性。为了能够进行对比,要改变输出波形的显 示方式。选中”tb_sinout/outu”,单击右键,在弹出菜单中选择properties…,出现wave properties窗口,缺省显示的View页面。
在对话框中将Radix项的内容设为”Unsigned”。然后点击Format页,在Format页中将Format设成 Analog,Height设成100,Scale设成0.4,然后点击OK。
5.2.5 使用Quartus II 进行时序仿真
ModelSim软件只能实现对设计电路的功能仿真,其仿真结果没有反映电路的硬件的真实情况。为了使我们的设计与真实 的电路更加接近,进行设计的时序仿真是非常必要的。SignalCompiler已经生成了用于quartus II进行时序仿真的激励文件sinout.vec和相关仿真文件,如sinout_quartus.tcl,可以很容易地在quartus II中实现时序仿真,在quartus II进行时序仿真的步骤如下: 启动quartus II集成开发环境,执行File菜单的Open Project…的操作,在弹出的Open Project的对话框中,选择Sinout模型所在的目录,打开该目录,打开DSP Builder为Quartus II建立的设计项目——Sinout,并在项目中打开VHDL顶层设计文件sinout.vhd。 在SignalCompiler中的编译过程中,我们已经指定了器件为Cyclone II系列了,但是在Quartus II中进行时序仿真时,需要指定器件的具体型号。执行
Assignments菜单的Device…命令,为本设计选择目标芯片EP2C35F672C8。 然后执行Processing菜单的Start Compilation命令对sinout.vhd顶层文件进行编译。
编译结束后,执行Processing菜单的Start Simulation命令,启动时序仿真。在仿真过程结束之后,出现quartus II 仿真波形界面,显示仿真结果。
通过观察仿真波形来检查设计的工程是否满足时序要求。也可以运行TimeQuest Timing Analyzer,生成时序分析报告,来获取时序仿真的数据。
5.2.6 硬件实现与测试
经过RTL级和时序仿真之后,还要将设计下载到芯片中进行实现和测试。 进行硬件测试时,需要使用开发平台上的DAC器件将正弦波信号发生器所输出的数字信号转换为模拟信号,然后将模拟信号接到示波器上。要使用DAC器件,需 要将平台上的拨码开关的MODUL_SEL1设置成“ON”状态,将MODUL_SEL2和MODUL_SEL3设置成“OFF”状态。
开发平台上的DAC模块由一个并行8位DAC器件和一个并行DAC电压基准源组成,并行8位DAC器件采用Analog Device 公司的AD7302芯片,工作电压为2.7伏到5.5伏,功耗小适合于电池驱动应用,具有高速寄存器和双缓冲接口逻辑以及可与并行微处理器和DSP兼容的 接口,
将产生的8位数据连接到并行ADC的输入管脚,再给三个功能选择管脚相应的输入信号,使得DAC能够正常工作。
三个功能管脚为Ā/B、WR和CS。Ā/B——通道选择信号,低电平选择A通道,高电平选择B通道;——写信号,低电平有效;——片选信号,低电平有效。 根据AD7302芯片的工作原理,需要在sinout.vhd文件中加入三个输出引脚,并且进行赋值。
在端口说明中加入如下的语句: dac_ab : out std_logic; dac_wr : out std_logic; dac_cs : out_std_logic; 在结构体中加入如下的语句: dac_ab <=’0’; 选择A通道 dac_wr <=’0’; dac_cs <=’0’;
接下来进行引脚所定,如下表所示:
引脚锁定之后进行工程的编译,编译成功可以将设计下载到目标器件中去。此时在D/A输出通道可以用示波器观察到数字信号转换成的模拟信号波形。 5.2.7 使用嵌入式逻辑分析仪SignalTap II进行测试
只进行工程的软件仿真远远不够,必须还要进行硬件仿真,使用传统的硬件方法进行测试会有如下的一些缺点:
缺少空余I/O引脚。设计中器件的选择依据设计规模而定,通常所选器件的I/O引脚数目和设计的需求是恰好匹配的。
I/O引脚难以引出。设计者为减小电路板的面积,大都采用细间距工艺技术,在不改变PCB板布线的情况下引出I/O引脚非常困难。
接逻辑分析仪有改变FPGA设计中信号原来状态的可能,因此难以保证信号的正确性。
传统的逻辑分析仪价格昂贵,将会加重设计方的经济负担。
针对传统硬件测试的局限,Altera公司和Xilinx公司分别推出了基于JTAG的内部逻辑分析仪,Altera公司的嵌入式逻辑分析仪为 SignalTap。嵌入式逻辑分析仪可以随设计文件一起下载到目标芯片中,通过JTAG引脚捕捉目标芯片内部设计者感兴趣的信号节点处的信息,而又不影 响系统的正常工作。嵌入式逻
辑分析仪将测得的信号样本暂存与目标器件中的嵌入式RAM中,然后通过器件的JTAG端口或ByteBlaster下载线将采 得的信息传给计算机进行分析。
嵌入式逻辑分析仪SignalTap II允许对设计中的所有层次的模块的信号节点进行测试,可以使用多时钟驱动。SignalTap II具有可以灵活配置的特点,下面会介绍到。嵌入式逻辑分析仪的三项主要优点:
它们的使用不增加引脚。可通过FPGA 上已有的专门JTAG引脚访问,即使没有其它可用引脚,这种调试方法也能得到内部可视能力。 简单的探测。探测包括把结点路由到内部逻辑分析仪的输入,不需要担心为得到有效信息,应如何连接到电路板上,也不存在信号完整性问题。
内核是便宜的。FPGA厂商把他们的业务模型建立于用芯片所获取价值的基础上,所以所用的调试IP 通常能以低于$1,000美元的价格获得。 但是,从嵌入式的逻辑分析仪的工作原理可以看出,嵌入式逻辑分析仪也有一些缺点:
内核的尺寸限制了FPGA中逻辑资源的利用。此外由于波形数据占用FPGA内部存储器,使信号采样的数据量有限。
设计工程师必须放弃把内部存储器用于调试,存储器的利用取决于系统的设计。 内部逻辑分析仪只工作于状态模式。它们捕获的数据与规定的时钟同步,而不能提供信号定时关系。
这里应用嵌入式逻辑分析仪对正弦波发生器进行测试,同时也可以掌握
SignalTap II的基本使用方。在使用SignalTap II进行测试之前应该现对工程sinout进行引脚分配,引脚少了硬件测试用的DAC模块的引脚。
引脚分配使用的方法见第二章,引脚分配完毕后,进行工程的编译,编译结束后就可以进行SignalTap II的设置了。
使用SignalTap II嵌入式逻辑分析仪进行测试的步骤如下:
(1)打开SignalCompiler转换成的sinout.qpf,选择file菜单,点击new,出现new窗口,在其中选择other files页,选择SignalTap II file,出现SignalTap II编辑窗口。
(2)调入待测信号。首先右键单击Instance Manager栏下的Instance下面的auto_signaltap_0,在弹出菜单中选择rename,将其更名为sinoutsignal。 sinoutsignal代表一组待测信号,现在将待测信号加入到其中。在sinoutsignal栏下的空白处双击,会弹出Node Finder窗口,单击list按钮,会出现和该工程相关的所有信号,包括内部信号。选择输出总线信号sinout。单击OK按钮即将选择的信号加入到 SignalTap II信号观察窗。
Node Finder窗口
添加了观察信号的SignalTap II编辑窗口
(3) 设置SignalTap II
在SignalTap II的Setup页中,单击全屏按钮,右上角图标。出现全屏编辑窗口。首先设置逻辑分析仪的工作时钟Clock,单击Clock栏左侧的”…”按钮,出现 Node Finder窗口,选中工程的主时钟clock作为逻辑分析仪的采样时钟;然后在Data栏中的Sample Depth下拉框中选择1K。这个采样深度适用于一个Instance所有的信号,所以必须根据测试要求、信号数量、以及工程占用ESB/M4K存储模块 的数量,综合来确定采样深度,以免发生ESB/M4K不够的情况。
SignalTap II的全屏编辑窗口
然后根据测试的要求,指定缓冲获的模式(Buffer Acquisition mode),在Buffer Acquisition mode 栏中有两种缓冲:一种为环形缓冲(Circular);另一种为分段缓冲(Segmented)。
对于环形缓冲有四种触发位置: Pre trigger position——前触发位置,在达到触发条件前,保存所发生采样的12%,达到触发条件后,再保存采样的88%。
Center trigger position——中触发位置,在达到触发条件前,保存所发生采样的50%,达到触发条件后,再保存采样的50%。
Post trigger position——后触发位置,在达到触发条件前,保存所发生采样的88%,达到触发条件后,再保存采样的12%。
Continuous trigger position——连续触发位置,以环形缓冲的方式进行连续
采样保存,直到用户中断为止。
SignalTap II是基于JTAG的逻辑分析仪,所以还必须进行JTAG链的设置。打开实验开发系统的电源,连接好USB下载线。在右上角的JTAG Chain
Configuration栏中,点击Hardware的Setup按钮,出现硬件安装窗口,在Currently selected hardware下拉框中选择Nios II Evaluation Board [USB-0]。JTAG Chain Configuration栏中Hardware栏将显示Nios II Evaluation Board字样,同时Device栏将显示@1:EP2C35(0x020B40DD)字样,此为自动识别到的FPGA芯片。
(4)SignalTap II文件存盘
选择文件菜单点击Save,将SignalTap II存盘,缺省的文件名为stp1.stp,用户也可以自己命名。单击保存会出现”Do you want to enable stp1.stp for the current project”的对话框,选择“是“,表示同意,下次再次编译时,将该SignalTap II文件和工程文件一起综合、适配,然后一起下载到目标芯片中去。 如果点击“否“,则需要自己设置,方法是选择菜单Assignments,点击
Settings,出现Settings窗口,在Category栏中选择 SignalTap II Logic Analyzer。选中Enable SignalTap II Logic Analyzer,在SignalTap II File name处选择已经存盘的SignalTap II 文件。
将SignalTap II 文件与工程捆绑
SignalTap II 逻辑分析仪是为了测试而加入工程中的,当测试结束后,在生成最终的设计时,应该将SignalTap II 逻辑分析仪从工程中去掉,方法就是在图中关闭Enable SignalTap II Logic Analyzer选项,重新编译、下载即可。 (5)编译下载
首先选择Processing菜单,点击Start Compilation,启动全程编译。编译结束后,SignalTap II 的观察窗通常会自动打开,如果没有打开,或新启动SignalTap II 逻辑分析仪,可选择Tools菜单中的 SignalTap II logic Analyzer,启动SignalTap II 逻辑分析仪。
综合编译完成以后,将sinout.sof的工程文件下载到FPGA芯片。 (6)测试分析。下载完成后,点击烧写完成后,点击工具栏按钮 的Auto Analysis按钮运行逻辑分析仪。为了便于观察,在sinout栏点击右键,在弹出的对话框中选择Bus Display Format栏的 Unsigned Line Chart选项。否则,显示的数
据是二进制的波形,看不出正弦波的形状。
本项目由于存在SinCtril控制信号,而且在步骤(3)中将其作为触发,只有当SinCtrl为1时,才进行数据的采集,显示到DATA窗口。本例中,SinCtrl分配的引脚对应着实验箱上的F1按钮,按下F1按钮则窗口中出现正弦波,否则没有数据。
SignalTap II的Data窗口中的正弦波形
第3 节 FIR 数字滤波器设计
应用 Matlab/DSP Builder可以对多种类型的电子线路模块和系统进行建模、仿真和硬件 实现。使用Matlab/DSP Builder进行 DSP 开发可以快速、高效地完成从算法模型的验证到硬 件实现的完整的流程。最终在 FPGA 中的硬件实现可以独立地成为一个功能模块,也可以成为 SOPC 系统的一个组成部分, 成为 Nios II嵌入式系统的自定制指令或者硬件加速模块。FIR(Finite Impulse Response,有限冲激响应)滤波器在数字通信系统中有广泛的应用,如低通滤波、通带选择、抗混叠、抽取和内插等。DSP Builder 中 FIR 滤波器可以使用 FIR的 Megacore,即 FIR 的 IP 来设计,也可以使用模块来自己构建,重点介绍基于 FIR 的 IP来设计 FIR 滤波器的方法。 5.4.1 FIR 滤波器原理
在这个滤波器中,存在 3 个延时单元,4 个乘法器,一个 4 输入的加法器。如果采用数字信号处理器,如 TI或 AD公司的 DSP Processor来实现,只能用串行的方式顺序地执行延时、乘加操作,要用多个指令周期才能完成。采用 FPGA 来实现,则是并行的运算,在一个时钟周期就能得到 FIR 滤波器的输出。
5.4.2 16阶 FIR 滤波器的设计
对于直接 I 型的 16 阶或更高阶的 FIR 滤波器通常低阶的滤波器节进行级联而构成。这里设计一个 4 阶 FIR 滤波器节,然后通过将其级联来构成 16 阶的 FIR 滤波器。直接 I 型 4 阶 FIR 滤波器节的结构如图 5-43 所示,可以看到,其结构相对于上图的 3 阶 FIR 滤波器是在输入信号插入了一个延时单元,从而将 3 阶滤波器编程 4 阶的,但 h(0)的值为 0。将 h(0) 的值设成零,目的是为了在组成高阶的 FIR 滤波器时,进行滤波器节的级联。
由于浮点小数在 FPGA 中实现比较困难,需要很多的资源。这里采用定点计算,为了省去小数点定标,使用整数运算来实现,如同 5.2 节正弦波发生器的情况一样,正弦查找表存储的是整数值。 为了使滤波器参数可变,将 FIR 滤波器系数 h(1)、h(2)、h(3)和 h(4)也作为输入端口。图 5-44 为直接 I 型4 阶FIR 滤波器在 Simulink中的模型。
图 5-44 中的各模块的参数设置如下: xn、h1、h2、h3、h4 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库
Bus Type:Signed Integer Node Type:Input Port Number of bits:9
yn 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer Node Type:Output Port Number of bits:20
xn4 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer Node Type:Output Port Number of bits:9
Parallel Adder Subtractor模块:Parallel Adder Subtractor 库:Altera DSP Builder中的 Arithmetic 子库 Add(+)Sub(-):++++ Pipeline:选中
Clock Phase Selection:1
Delay、Delay1、Delay2 和 Delay3 模块:Delay 库:Altera DSP Builder中的 Storage 子库 Depth:1
Clock Phase Selection:1
Product、Product1、Product2和 Product3 模块:Product 库:Altera DSP Builder中的 Storage 子库
Pipeline:0
Clock Phase Selection:1 Use LPM:不选中
利用直接I型4阶的FIR滤波器节可以方便地构成4×n阶的直接I型FIR滤波器 (h (0)=0) 。这里利用 4 个4 阶直接 I型的 FIR 滤波器来构建一个 16阶的直接 I型 FIR 滤波器。为了设计的方便,将上面设计的 4 阶 FIR 滤波器生成一个子系统,双击即可打开生成的子系统,生成的子系统相对于上面的模型文件只是多了 5个输入端口和两个输出端口,如图 5-45 所示,对端口名进行修改,把子系统更名为 fir4tap,如图 5-46所示。
在 Simulink中新建一个模型,设计一个 16 阶的 FIR 滤波器需要级联 4 个4 阶 FIR 滤波器,为此复制 4 个 fir4tap 子系统,并将它们级联起来,前一级的输出端口 x4 接后一级的 x输入端口,添加 16 个常数端口,作为 FIR 滤波器系数的输入。把 4 个子系统的输出端口 y接入一个 4输入端口的加法器,加法器的输出为 16 阶 FIR滤波器的输出 yout。
图 5-47 16 阶直接 I型 FIR 滤波器模型中,新增加的模块的参数如下: xn 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer Node Type:Input Port Number of bits:9
yout 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer Node Type:Output Port Number of bits:20
x16 模块:Altbus
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer
Node Type:Output Port Number of bits:9
Parallel Adder Subtractor模块:Parallel Adder Subtractor 库:Altera DSP Builder中的 Arithmetic 子库 Add(+)Sub(-):++++ Pipeline:选中
Clock Phase Selection:1
h1~h16 模块:constant
库:Altera DSP Builder中的 IO & Bus子库 Bus Type:Signed Integer Number of bits:9
在图 5-47 中对 h1~h16 的值都设成了 0,滤波器的系数应该是根据具体的应用的要求来计算和确定的。
5.4.3 使用 Matlab 的滤波器设计工具进行滤波器系数的计算
滤波器的系数计算可以使用 Matlab 的滤波器设计工具 FDATool 来计算。
FDATool 即为Filter Design & Analysis Tool,可以完成多种滤波器的设计、分析和性能评估。假设要设计一个截止频率为 10.8KHz 的低通滤波器,采样频率为 48KHz。使用 FDATOOL 进行滤波器设计的步骤如下:
(1)启动 Matlab 的 FDATOOL。单击 Matlab 窗口下方的 Start 按钮,然后 →Toolboxes→Filter Design→Filter Design & Analysis Tool,即可启动 FDATool。也可以在 Matlab 的命令窗口中执行 fdatool 来启动 FDATool。FDATool启动后出现如图 5-48 所示的窗口。
(2) 滤波器我设计。启动 FDATool 后的界面就是滤波器的设计界面,如图 5-48,要从其它的界面进入滤波器的设计界面可以单击 FDATool 窗口左下侧的一列工具按钮中的最下一个图标 filter design,即可进入滤波器设计界面。在该界面中进行滤波器的设计,首先选择 Response Type(响应类型)为 Lowpass(低通) ,然后选择 Design Method(设计方法)为 FIR(有限冲激相应) ,在 FIR 的下拉窗口中选择 window(窗口法) ,Filter Order(滤波器阶数)指定为 15,window 选为 Keiser,Beta值为 0.5,Fs(采样频率)为 46KHz,Fc(截止频率)为 10.8KHz。 这里要注意的是,滤波器的阶数是 15 而非 16,是因为设计的 16 阶 FIR 滤波器的滤波器系数 h(0)等于 0,从结构上,可以看成一个 15 阶的 FIR 滤波器前面加了一个延时单元。从系统函数来看,系统函数可以写成
可看成是,输入延时了一个单元进入了 15 阶的滤波器或是滤波器的输出再经过一个延时单元。
(3)滤波器设计和性能分析。进行完上面的设置后,点击 Design Filter按钮(图 5-48底部正中) ,FDATool 根据用户的设置进行滤波器的设计,得到滤波器的系数。在设计完成之后可以对滤波器进行性能的分析,考察是否满足设计要求。 FDATool 可以进行多种性能分析,这里介绍几种主要的分析。 1.幅频响应(Magnitude Response)
选择 Analysis 菜单→Magnitude Response,即启动了幅频响应分析。图 5-49显示的是滤波器的幅频响应曲线,横轴为频率,单位为 KHz,纵轴为幅度,单位为 dB。
2. 相频响应(Phase Response) 选择 Analysis 菜单→Phase Response,即启动了相频响应分析。图 5-50 显示的即为滤波器的相频响应曲线。可以看到在通带内,相位的响应是线性的,即该滤波器是是一个线性相位滤波器。
3. 相幅联合分析(Magnitude & Phase Responses) 通常要对幅度和相位进行同时的考察,采用相幅联合分析,选择 Analysis 菜单 →Magnitude & Phase Response,即可启动相幅联合分析。图 5-51 显示的即为滤波器的相幅 联合响应曲线。
4. 冲激响应(Impulse Response)
选择 Analysis 菜单→Impulse Response,即启动了阶跃响应分析。图 5-52即为滤波器的冲激响应曲线。
因篇幅问题不能全部显示,请点此查看更多更全内容