1、第第5章章 基于基于FPGA的的DSP开发技术开发技术第1页,共48页。DSP Builder可以帮助用户完成基于可以帮助用户完成基于FPGA的的DSP系统设计,除了可以进行图形化的系统系统设计,除了可以进行图形化的系统建模外,建模外,DSP Builder还可以自动完成大部还可以自动完成大部分的设计过程和仿真,直至把设计文件下载分的设计过程和仿真,直至把设计文件下载到到FPGA芯片中。芯片中。第2页,共48页。一方面,经由一方面,经由Matlab/DSP Builder和和 Quartus II软件工具软件工具开发的开发的DSP模块或其它功能模块可以成为单片模块或其它功能模块可以成为单片FP
2、GA电路电路系统的一个组成部分,可以承担一定的功能;系统的一个组成部分,可以承担一定的功能;另一方面可以通过另一方面可以通过Matlab/DSP Builder,为,为Nios嵌入式处嵌入式处理器设计各类加速器,并以指令的形式加入到理器设计各类加速器,并以指令的形式加入到NIOS II的指的指令系统,从而成为令系统,从而成为Nios II系统的一个接口设备,与整个片内系统的一个接口设备,与整个片内嵌入式系统融为一体,即利用嵌入式系统融为一体,即利用DSP Builder和和Nios II CPU,用户可以根据项目的具体要求,随心所欲地构建自己的用户可以根据项目的具体要求,随心所欲地构建自己的D
3、SP处理器系统。处理器系统。第3页,共48页。5.1 基于基于 MATLABDSP Builder的的DSP模块设计流模块设计流程程DSP Builder是一个系统级(算法级)设计是一个系统级(算法级)设计工具,但同时它把系统级(算法仿真建模)工具,但同时它把系统级(算法仿真建模)和和RTL级(硬件实现)的设计工具连接起来,级(硬件实现)的设计工具连接起来,使算法开发到硬件的实现可以无缝地过渡。使算法开发到硬件的实现可以无缝地过渡。使用使用Matlab/DSP Builder进行进行DSP系统的开系统的开发必须要安装发必须要安装Matlab和和DSP Builder软件。软件。第4页,共48页
4、。DSP Builder设计包括两套流程:自动流程和手动流程:第5页,共48页。设计流程的第一步设计流程的第一步在在Matlab/Simulink中进行设计输入,在中进行设计输入,在Matlab/Simulink中建立一个模型文件(中建立一个模型文件(mdl文件),用图形方式调用文件),用图形方式调用DSP Builder和其和其它它Simulink库中的模块,构成系统级或算法库中的模块,构成系统级或算法级设计框图。利用级设计框图。利用Simulink的图形化仿真、的图形化仿真、分析功能,分析此设计模型的正确性,完成分析功能,分析此设计模型的正确性,完成模型仿真。第一步设计同一般的模型仿真。第
5、一步设计同一般的Matlab/Simulink建模过程几乎没什么区别,建模过程几乎没什么区别,所不同的是,设计采用了所不同的是,设计采用了DSP Builder库。库。第6页,共48页。设计流程设计流程第二步通过通过SignalCompiler把把Simulink的模型文件的模型文件转化为硬件描述语言文件,以供其它的转化为硬件描述语言文件,以供其它的EDA(Quartus II、ModelSim 等)软件处理,这等)软件处理,这些软件不能直接处理些软件不能直接处理Matlab/Simulink产生的产生的模型文件,那么模型文件,那么DSP Builder中的中的SignalCompiler模块
6、用于完成模型文件到硬模块用于完成模型文件到硬件描述语言文件的转换,转换之后的件描述语言文件的转换,转换之后的HDL文文件是件是RTL级(寄存器传输级,即可综合的格级(寄存器传输级,即可综合的格式)。式)。第7页,共48页。设计流程的第三步执行执行RTL级的仿真,级的仿真,DSP Builder 支持自动支持自动流程的流程的ModelSim仿真。用户也可以利用第仿真。用户也可以利用第二步产生的二步产生的VHDL文件使用其它的仿真工具文件使用其它的仿真工具软件手动地进行仿真。软件手动地进行仿真。第8页,共48页。设计流程的第四步使用第二步使用第二步SignalCompiler产生的产生的VHDL文
7、件进行文件进行RTL级的综合,网表产生和适配等处理,级的综合,网表产生和适配等处理,DSP Builder支持自动流程和手动流程两种方式:自动流支持自动流程和手动流程两种方式:自动流程中可以选择让程中可以选择让DSP Builder自动调用自动调用Quartus II等等EDA软件来完成相应的工作;手动模式允许用户选择软件来完成相应的工作;手动模式允许用户选择相应的软件来完成相应的工作,手动模式需要更多的相应的软件来完成相应的工作,手动模式需要更多的干预,同时提供了更大的灵活性,用户可以指定综合、干预,同时提供了更大的灵活性,用户可以指定综合、适配等过程的条件。适配等过程的条件。第三步和第四步
8、可以不分先后。第三步和第四步可以不分先后。第9页,共48页。设计流程的第五步在在Quartus II中编译用户的设计,最后将设中编译用户的设计,最后将设计下载,进行测试验证。计下载,进行测试验证。第10页,共48页。经过测试、验证的设计可以单独执行相应的经过测试、验证的设计可以单独执行相应的DSP功能。如果功能。如果DSP Builder产生的产生的DSP模模型只是整个设计中的一个子模块,那么可以型只是整个设计中的一个子模块,那么可以在设计中调用在设计中调用DSP Builder产生的产生的VHDL文件,文件,以构成完成的设计。以构成完成的设计。第11页,共48页。5.2 正弦发生器模块的设计
9、正弦发生器模块的设计第12页,共48页。通过本例的学习可以掌握通过本例的学习可以掌握DSP Builder的使用方法。这个的使用方法。这个简单的正弦波发生器,主要由简单的正弦波发生器,主要由4部分构成:部分构成:IncCount是阶是阶梯信号发生模块,产生一个按时钟线性递增的地址信号,梯信号发生模块,产生一个按时钟线性递增的地址信号,送往送往SinLUT。SinLUT是一个正弦函数值的查找表模块,是一个正弦函数值的查找表模块,由递增的地址获得正弦波的离散值输出。由由递增的地址获得正弦波的离散值输出。由SinLUT输出输出的的8位正弦波数据经过一个延时模块位正弦波数据经过一个延时模块Delay后
10、,送往后,送往Product乘法模块,与乘法模块,与SinCtrl相乘,相乘,SinCtrl是一位输入,是一位输入,SinCtrl通过通过Product完成对正弦波输出有无的控制。完成对正弦波输出有无的控制。SinOut是整个正弦波发生器模块的输出,送往是整个正弦波发生器模块的输出,送往D/A即可获即可获得正弦波模拟输出信号。得正弦波模拟输出信号。第13页,共48页。5.2.1 建立设计模型(1)运行)运行Matlab,Matlab的主窗口被分成的主窗口被分成3部分:部分:Command Window、Workspace/Current Directory、Command History。(2
11、)建立工作目录。在建立一个新的设计模型前,先要建)建立工作目录。在建立一个新的设计模型前,先要建立一个文件夹,作为工作目录,来保存相应的设计文件,在立一个文件夹,作为工作目录,来保存相应的设计文件,在进行设计之前要先切换到该文件夹下。新建和切换到工作目进行设计之前要先切换到该文件夹下。新建和切换到工作目录可以在命令窗口中使用录可以在命令窗口中使用Matlab 命令,也可以在命令,也可以在Current Directory窗口中实现。窗口中实现。第14页,共48页。(3)启动启动Simulink,建立模型。,建立模型。在命令窗口中,键入在命令窗口中,键入Simulink,按回车键,启动,按回车键
12、,启动Matlab图形化仿真图形化仿真工具工具Simulink,出现了,出现了Simulink Library Browser窗口,在窗口的窗口,在窗口的左侧为左侧为Simulink Library 列表,右侧窗口显示的则是,被选中的库列表,右侧窗口显示的则是,被选中的库中的组件、子模块列表。安装完中的组件、子模块列表。安装完DSP Builder之后,在之后,在Simulink 库库列表中可以看到列表中可以看到Altera DSP Builder的库出现在列表中。在下面设计的库出现在列表中。在下面设计中,主要使用该库中的组件、模块来完成各项设计,再使用中,主要使用该库中的组件、模块来完成各项
13、设计,再使用Simulink库来完成模型的仿真和验证。库来完成模型的仿真和验证。选择选择File菜单,然后单击菜单,然后单击new,在弹出的子菜单中选择,在弹出的子菜单中选择Model,出现了一个未命名的模型窗口。出现了一个未命名的模型窗口。第15页,共48页。(4)放置放置 SignalCompiler。单击。单击Simulink库列表中的库列表中的Altera DSP,单击,单击Altlab项,使之展开。选中右侧窗口中的项,使之展开。选中右侧窗口中的SignalCompiler组件,按住鼠标左键拖放到新模型窗口中。也可组件,按住鼠标左键拖放到新模型窗口中。也可以单击右键,选择以单击右键,选
14、择Add to untitled,这里,这里untitled是指我们新是指我们新建的未命名的模型文件。建的未命名的模型文件。在选中在选中SignalCompiler模块后,在模块后,在Simulink窗口中的提示栏窗口中的提示栏里会显示对应模块的说明,简单的功能介绍。可以看到里会显示对应模块的说明,简单的功能介绍。可以看到SignalCompiler的介绍为的介绍为“Converts Model Files to VHDL files.”即为进行模型文件即为进行模型文件mdl到到VHDL文件的转换,所以文件的转换,所以SignalCompiler是进行任何是进行任何DSP系统设计必须要添加的模
15、块。系统设计必须要添加的模块。选中选中SignalCompiler选中选中Help for the SignalCompiler block。可以了解怎样使用。可以了解怎样使用SignalCompiler的具体信息。也可的具体信息。也可以按照此方法获得其它的模块相应的帮助信息。以按照此方法获得其它的模块相应的帮助信息。第16页,共48页。(5)添加)添加Increment Decrement模块。模块。Increment Decrement模块是模块是DSP Builder库中库中Arithmetic子库中的模块。选中子库中的模块。选中Altera DSP Builder中的中的Arithme
16、tic子库,然后在子库,然后在其中选择其中选择Increment Decrement模块。然后模块。然后按照添加按照添加SignalCompiler的方法将的方法将Increment Decrement添加到模型文件中。添加到模型文件中。第17页,共48页。第18页,共48页。(7)添加正弦查找表。在Altera DSP Builder库的Gate&Control子库中找到查找表模块LUT,把LUT拖放到新建模型窗口,将LUT模块的名字修改为“SinLUT”。第19页,共48页。双击SInLUT模块,打开模块参数设置对话框“Block Parameters:SinLUT”。把输出位宽设为8;查
17、找表地址设为6;总线数据类型Bus Type选择为有符号整数 Signed Integer;在Matlab Array编辑框中输入计算查找表内容的计算式。在这里使用sin函数,sin函数的调用格式为:sin(起始值:步进值:结束值)第20页,共48页。第21页,共48页。SinLUT是一个输入地址为6位,输出值位宽为8位的正弦查找表模块,且输入地址总线为有符号数,所以设置起始值为0,结束值为2,步进值为,计算式可写成:127*sin(0:2*pi/26:2*pi)其中pi就是常数,这是Matlab中的语法。上式的数值变化范围是-127+127,恰好是8位二进制数可以表示的最大值,所以8位的输出
18、值位宽可以表示上式所描述的正弦波形。如果将SinLUT模块的总线数据类型设置为无符号整数Unsigned Integer,且输出位宽改为10,若想得到完成满度的波形输出,应将表达式改为:511*sin(0:2*pi/26:2*pi)+512选中”Use LPM”(LPM:Library of Parameterized Modules 参数化模块),如果选中”Use LPM”的话,Quartus II 将利用目标器件中的嵌入式RAM来构成SinLUT,即将生成的正弦波数据放在嵌入式RAM构成的ROM中,这样可以节省大量的逻辑资源,否则SinLUT只能用芯片中的LCs来构成。选中”Registe
19、r Address”,选中此选项会生成输入地址总线,如果目标器件是Straitix或者Cyclone,并且选中了LPM选项,用户必须选中”Register Address”选项。第22页,共48页。(8)添加Delay模块。在Altera DSP Builder库中,选中Storage子库下的Delay模块,拖放到新建模型窗口。Delay模块可以实现延时的功能,在这里可以使用其默认参数设置。第23页,共48页。第24页,共48页。在在Delay模块的参数设置的对话框中,参数模块的参数设置的对话框中,参数Depth是描述信号是描述信号延时深度的参数。当延时深度的参数。当Depth为为1,模块传输
20、函数为,模块传输函数为1/Z,通过,通过Delay模块的信号被延时一个时钟周期;当模块的信号被延时一个时钟周期;当Depth为整数为整数n时,时,其传输函数为其传输函数为1Zn,通过,通过Delay模块的信号将被延时模块的信号将被延时n个时钟个时钟周期。周期。Delay模块在硬件上采用寄存器来实现,所以模块在硬件上采用寄存器来实现,所以Delay模块模块被放在被放在Storage子库中。子库中。Clock Phase Selection 参数主要是控制采样的。当设置为参数主要是控制采样的。当设置为1表示表示Delay模块总处于使能状态,所用的数据都通过模块总处于使能状态,所用的数据都通过Del
21、ay模块。如果设模块。如果设置为置为10则每隔一个脉冲处于使能状态,那么每隔一个的数据才能通则每隔一个脉冲处于使能状态,那么每隔一个的数据才能通过过Delay模块。如设置为模块。如设置为0100,表示,表示Delay模块在每模块在每4个时钟中第二个时钟中第二个时钟是处于使能,那么每个时钟是处于使能,那么每4个数据只有第二个数据可以通过。个数据只有第二个数据可以通过。第25页,共48页。(9)添加端口)添加端口SinCtrl。在。在Altera DSP Builder库中选择库中选择IO&BUS子库,找到子库,找到AltBus模块,拖放到新建模型窗口中。修改模块,拖放到新建模型窗口中。修改Alt
22、Bus模块的名字为模块的名字为SinCtrl。SinCtrl是一是一个个1位输入端口。双击位输入端口。双击SinCtrl模块,打开模模块,打开模块参数设置对话窗口。设置块参数设置对话窗口。设置SInCtrl的的Bus Type为为”Single Bit”,Node Type参数参数为为”Input Port”。第26页,共48页。第27页,共48页。(10)添加)添加Product(乘法)模块。在(乘法)模块。在Altera DSP Builder库中选择库中选择Arithmetic子子库,找到库,找到Product模块。模块。第28页,共48页。第29页,共48页。将之拖放到新建模型窗口中去
23、,这里将之拖放到新建模型窗口中去,这里Product有两个输入一有两个输入一个是经过个是经过Delay的的SinLUT输出,另一个是一位端口输出,另一个是一位端口SinCtrl,Product实现了实现了SinCtrl对对SinLUT查找表输出的控制。双击查找表输出的控制。双击Product模块,打开模块,打开Product模块参数设置对话框。其中模块参数设置对话框。其中Pipeline(流水线)参数指定该乘法器模块使用几级流水线,(流水线)参数指定该乘法器模块使用几级流水线,即乘积延时几个时钟周期后输出,选中即乘积延时几个时钟周期后输出,选中”Use LPM”,表示,表示使用参数化的模块库来
24、实现,选择使用参数化的模块库来实现,选择”Use Dedicated Circuitry”表示可以使用表示可以使用FPGA中的专用模块来实现中的专用模块来实现.第30页,共48页。(11)添加输出端口Out。在Altera DSP Builder库中,选择IO&BUS子库,找到AltBus模块,拖放到信件模型窗口中,修改AltBus模块的名字为Out。第31页,共48页。第32页,共48页。Out是一个是一个8位输出端口,接到位输出端口,接到FPGA的输出引脚,与片外的输出引脚,与片外的的8位位D/A转换器相接,转换器相接,D/A转换模块将数字信号转化成模转换模块将数字信号转化成模拟信号。双击
25、拟信号。双击Out模块,打开参数设置对话框,设置模块,打开参数设置对话框,设置Out的的Bus Type为为”Signed Integer”,Node Type参数参数为为”Output Port”,然后单击,然后单击Apply,然后修,然后修改改”Number of bits”为为8。Saturate选项如果被选中,则当输出大于要表达的值的选项如果被选中,则当输出大于要表达的值的最大正值或负值,则输出被强制为最大的正值或负值。最大正值或负值,则输出被强制为最大的正值或负值。若此选项未被选中,则最高位若此选项未被选中,则最高位MSB被截断。此选项对被截断。此选项对输入端口和常数节点类型是无效的
26、。输入端口和常数节点类型是无效的。第33页,共48页。(12)保存设计文件。放置完)保存设计文件。放置完Out模块,把新建模型中的模块,把新建模型中的DSP Builder模块连接起来,这样就完成了一个正弦波发生模块连接起来,这样就完成了一个正弦波发生器的器的DSP Builder模型设计。在进行仿真验证和模型设计。在进行仿真验证和SignalCompiler编译之前,先把设计保存起来。单击编译之前,先把设计保存起来。单击File菜菜单,选择单,选择Save操作,取名并保存。本例中,新建模型取名操作,取名并保存。本例中,新建模型取名Sinout,生成模型文件,生成模型文件Sinout.mdl。
27、模型保存之后,先要对模型进行仿真验证,如通过验证,模型保存之后,先要对模型进行仿真验证,如通过验证,则使用则使用SignalCompiler进行编译将进行编译将mdl文件转换为文件转换为VHDL文件。文件。第34页,共48页。5.2.2 Simulink模型仿真模型仿真Matlab的的Simulink环境具有强大的图形化仿环境具有强大的图形化仿真验证的功能。用真验证的功能。用DSP Builder模块设计好模块设计好的模型,可以在的模型,可以在simulink中进行算法级、系中进行算法级、系统级仿真验证。对一个模型进行仿真需要施统级仿真验证。对一个模型进行仿真需要施加合适的激励,在特定的观察点
28、添加必须的加合适的激励,在特定的观察点添加必须的观察模块。观察模块。第35页,共48页。1.加入加入Step模块模块本例中,先加入一个本例中,先加入一个step(阶跃模块),来实现模拟(阶跃模块),来实现模拟SinCtrl的按键使能操作。在的按键使能操作。在simulink的的simulink基本基本库中,选择库中,选择Source子库,把其中的子库,把其中的Step模块拖放到模块拖放到Sinout模型窗口中去,并将其与模型窗口中去,并将其与SinCtrl的输入端口相的输入端口相连。连。注意:凡是来自注意:凡是来自Altera DSP Builder库以外的模块,库以外的模块,SignalCo
29、mpiler都不能将其转换成硬件描述语言的模块。都不能将其转换成硬件描述语言的模块。第36页,共48页。2.添加波形观察模块添加波形观察模块在在Simulink中选择中选择Simulink库,展开库,展开Simulink库,选中其库,选中其中的中的Sinks子库,把子库,把Scope(示波器)模块拖放到(示波器)模块拖放到SinOut模模型窗口中去。双击该模块,打开的是一个型窗口中去。双击该模块,打开的是一个Scope窗口。如图窗口。如图5-11所示,图中只有一个信号的波形观察窗口,若希望可以所示,图中只有一个信号的波形观察窗口,若希望可以多观察记录信号,可以通过添加多个多观察记录信号,可以通
30、过添加多个Scope模块的方法来实模块的方法来实现,也可以通过修改现,也可以通过修改Scope的参数来实现的参数来实现Scope模块中的观模块中的观察窗口数。察窗口数。第37页,共48页。3.Scope模块参数设置模块参数设置用鼠标单击用鼠标单击Scope模块窗口上侧工具栏的第模块窗口上侧工具栏的第二个按钮:二个按钮:Parameters,弹出参数设置对话,弹出参数设置对话框,以进行参数设置。框,以进行参数设置。第38页,共48页。第39页,共48页。在在Scope参数设置对话框中有两个设置页:参数设置对话框中有两个设置页:General和和Data History。在。在General页中,
31、页中,改变改变Number of axes为为2。在单击。在单击OK按钮后,按钮后,可以看到可以看到Scope窗口出现了两个波形观察窗。窗口出现了两个波形观察窗。每个观察窗可以独立地观察信号波形。同时每个观察窗可以独立地观察信号波形。同时Scope模块也多了一个输入端,将模块也多了一个输入端,将SinCtrl的的信号接到这一新增的输入端,作为参考信号。信号接到这一新增的输入端,作为参考信号。第40页,共48页。4.设置仿真激励设置仿真激励先设置模型的仿真激励。在先设置模型的仿真激励。在SinOut模型中,模型中,只有一个输入端口只有一个输入端口SinCtrl,需要设置与之相,需要设置与之相连的
32、连的Step模块。双击模块。双击Step模块,在弹出的模块,在弹出的Step模块参数设置对话框中设置对其输入端模块参数设置对话框中设置对其输入端口口SinCtrl施加的激励。施加的激励。第41页,共48页。第42页,共48页。各参数值的含义如下:各参数值的含义如下:阶跃时刻(阶跃时刻(Step time):):Step模块的输出在该时刻发生阶跃,默认值为模块的输出在该时刻发生阶跃,默认值为1,单,单位为秒。位为秒。初始值(初始值(Initial value):在阶跃时刻的之前的):在阶跃时刻的之前的Step模块的输出值,默认值为模块的输出值,默认值为0。终值(终值(Final value):在
33、阶跃时刻之后):在阶跃时刻之后Step模块的输出值,默认值为模块的输出值,默认值为1。采样时刻(采样时刻(Sample time):):Step模块输出的采样频率。模块输出的采样频率。设置设置Step time为为30,则在,则在30秒时该模块会发生输出值的阶跃。初始值设为秒时该模块会发生输出值的阶跃。初始值设为0,那么在,那么在30秒时刻之前,不输出正弦波;终值设为秒时刻之前,不输出正弦波;终值设为1。Sample time设为设为0,设为,设为0的话,在大的和小的话,在大的和小的时间间隔都进行采样,设成的时间间隔都进行采样,设成0的模块被称作连续采样;设成的模块被称作连续采样;设成1的话,
34、则只在大的时间间隔的话,则只在大的时间间隔上采样。选中底部的两项选择:上采样。选中底部的两项选择:“Interpret vector parameters as 1-D”和和“Enable zerocrossing detection”第43页,共48页。在在SInOut模型窗口中,单击模型窗口中,单击Simulation菜单,菜单,在下拉菜单中选择在下拉菜单中选择Simulation parameters。将弹出将弹出SinOut模型的仿真参数设置对话模型的仿真参数设置对话框:框:”Configuration Parameters:SinOut/configuration”。第44页,共48
35、页。第45页,共48页。仿真参数设置对话框共有7个选项页:Solver、Data Import/Export、Optimization、Diagnostics、Hardware Implementation、Model Referencing、Real-Time Workshop。其中”Solver”页中完成仿真时的基本时间设置、计算器和解算器(solver)的步进方式及输出选项等设置。第46页,共48页。5.启动仿真启动仿真在在SinOut模型窗口中,选恶模型窗口中,选恶Simulation菜单菜单下的下的Start项,开始仿真。仿真结束后,双击项,开始仿真。仿真结束后,双击Scope模块,
36、打开模块,打开Scope观察窗。出现如图观察窗。出现如图5-15所示的仿真结果。可以看到所示的仿真结果。可以看到SinOut受到受到了了SinCtrl的控制。的控制。第47页,共48页。6.设计成无符号数据输出由示波器的波形可以看到,输出的正弦波是有符号的数据,在由示波器的波形可以看到,输出的正弦波是有符号的数据,在 127间变间变化,但一般的化,但一般的D/A器件的输入数据都是无符号的正数。因此为了能在硬器件的输入数据都是无符号的正数。因此为了能在硬件系统上件系统上D/A的输出也能观察到此波形,必须对此输出做一些改进,以的输出也能观察到此波形,必须对此输出做一些改进,以便输出无符号数。最简单的方法就是将输出波形向上平移便输出无符号数。最简单的方法就是将输出波形向上平移127即可,即可,SinLut的的Bus Type设置为设置为”Unsigned Integer”,SinLut的波形数据的波形数据公式改为:公式改为:127*sin(0:2*pi/(26):2*pi)+128。然后将输出端口。然后将输出端口Out的的Bus Type改为改为”Unsigned integer”类型。修改完成之后,进行仿真,类型。修改完成之后,进行仿真,可以看到输出的波形都在可以看到输出的波形都在0以上。以上。第48页,共48页。