基于Matlab_DSP Builder的正弦信号发生器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Matlab/DSP Builder的正弦信号发生器设计
引言
近年来随着通信技术的不断发展,信号的正确传输显得日益重要,也就是说要有一个可靠的能产生稳定确信号的发生器,基于Matlab/DSP Builder的正弦信号发生器是利用Matlab/DSP Builder的模块进行的模快化设计,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了、易懂、易学。
使硬件在软件的控制下协调运作。
DSP Builder可以帮助设计者完成基于FPGA的DSP系统设计设计,除了图形化的系统建模外,还可以完成及大部分的设计过程和仿真,直至将设计文件下载到DSP开发板上。
此次实验的目的就是将两者的优势有机的结合在一起,利用DSP的优势开发正弦信号发生器。
在设计中主要采用DSP Builder库中的模块进行系统的模型设计,然后再进行Simulink仿真。
1.设计思想
1.1 DSP Builder特点
DSP Builder系统级(或算法级)设计工具,它架构在多个软件工具之上,并把系统级(算法仿真建模)和RTL(硬件实现)两个领域的设计工具连接起来,最大程度的发挥了两种工具的优势。
DSP Builder依赖于MathWorks公司的数学分析工具Matlab/Simulink,可以在Simulink中进行图形化设计和仿真,同时又通过Signal Compilder把Matlab/Simulink的设计文件(.mdl)转换成相应的硬件描述语言VHDL设计文件(.vhd),以及用于控制和编译的tcl脚本。
而对后者的处理可以用Quartus II来实现。
1.2 QuartusII特点
QuartusII提供了完整的多平台设计环境,能满足各种特定设计的需要,是单芯片可编程系统(SOPC)设计的综合性环境和SOPC开发的基本设计工具,并且为Altera DSP开发包进行系统模型设计提供了集成综合环境。
QuartusII完全支持VHDL的设计流程,其内部嵌有VHDL逻辑综合器。
QuartusII也可以利用第三方的综合工具,如:Leonardo Spectrum、Synplify Pro、FPGA Compiler,并能直接调用这些工具。
同样QuartusII具备仿真功能,同时也支持第三方的仿真工具,如:ModelSim 。
此外,QuartusII与Matlab和DSP Builder结合,可以进行基于FPGA的DSP系统开发,是DSP硬件系统实现的关键EDA工具。
1.3 DSP的一般设计流程
图1—1所示的是DSP Builder的一般设计流程的框图,它针对不同情况提供了两套设计流程,即自动流程和手动流程。
它们的在设计输入、图形化仿真、分析功能等步骤是几乎一样的,只是设计模型采用DSP Builder的Simulink库。
再往后若采用自动流程,则几乎可以忽略硬件的具体实现过程,直至在Matlab 中完成FPGA的配置下载过程;但若想采用第三方综合器和仿真器,就需要采用手动流程,有设计者制定综合、适配条件,最后用QuartusII产生相应的编程文件用于FPGA的配置。
图1—1DSP Builder设计流程框图
1.4 系统的工作原理
正弦信号发生器的结构由4个部分组成:数据计数器或地址发生器(6位);正弦信号数据ROM(6位地址线,8位数据线),含有一个周期共64个8位数据;VHDL语言顶层设计;8位D/A转换。
如图1-2所示,顶层文件Singt.vhd在FPGA中实现,包含两个部分:ROM的地址信号发生器,由6位计数器担任;一个正弦数据ROM,由LPM__ROM模块构成。
LPM__ROM底层是FPGA中的EAB、ESB或M4K等模块。
地址发生器的时钟CLK的输入频率f
与每周期的波形数据点数(在此选择64点),以及D/A 输出的频率
f的关系是:
f= f
/64
图1—2 正弦信号发生器结构图
本系统是一正弦波发生器。
它通过IncCount产生一个按时钟线性递增的地址信号,送往SinLUT。
SinLUT由递增的地址获得正弦波的量化值输出。
由SinLUT 输出的8位正弦波数据经过一个延时模块后送往乘法模由SinLUT输出的8位正弦波数据经过一个延时模块后送往乘法模块Product与SinCtrl相乘。
由于SinCtr是一位(bit)输入,SinCtr通过Product就完成了对正弦波输出有无的控制。
SinOut是整个正弦波发生器模块的输出,送往D/A即可获得正弦波的输出(模拟信号)。
设计完成以后,将其转化成VHDL语言,再通过QuartusII对将模块进行编译。
这个过程包括分析/综合、适配、装配、时序分析等等.最后在实验箱上模拟。
图1—3 正弦波发生器模块原理图:
2.技术实现
2.1总体设计
本正弦信号发生器由6位的地址信号发生器IncCount产生一个按时钟线性递增的地址信号,送到含有64个8位数据的正弦信号数据ROMSinLUT,由SinLUT 输出的8位正弦波数据经过一个延时模块后送往乘法模由SinLUT输出的8位正弦波数据经过一个延时模块Delay后送往乘法模块与一位控制信号相乘,再输出即可。
然后用QuartusII直接完成适配和时序仿真,最后下载至实验箱模拟。
2.2设计及实现部分
2.2.1 建模准备
在Matlab界面里建立一个新的文件夹(mkdir /zhangkui/yezi),作为工作目录,并把Matlab当前的Work目录切换到新建文件夹下。
Simulink是基本模型库。
在以下的DSP Builder应用中,主要是使用该库中的组件、子模块来完成各种设计,再使用“simulink”库来完成模型的仿真验证。
新建一个simulink的模型文
件(后缀为.mdl)就会出现是新模型窗口。
2.2.2 建立模型文件
⑴把AltLab库管理器中的Signal Compilder组件拖到Signal Compilder到新模型窗口中。
当在simulink库管理器中选中模块(Block)后,在库管理器的提示栏中会显示对应模块的说明,有简单的功能介绍。
⑵Increment Decrement模块是DSP Builder库中Arithmetic(算术)模块。
把Arithmetic条中的Increment Decrement模块拖到新建模型窗口中。
将Increment Decrement的名字修改为“IncCount”。
然后把IncCount模块做成一个线性递增的地址发生器,然后对IncCount的参数进行相应的设置。
在IncCount模块的参数设置对话框“Block Parametres:IncCount”中,在“参数设置”对话框的上半部分是该模块的功能描述和使用说明:对话框的下半部分的参数设置部分,对于Increment Decrement模块共有下面几种参数可以设置:
①总线类型(Bus Type);
②输出位宽(Number of bits);
③增减方向(Direction);
④开始值(Starting Value);
⑤是否使用控制输入(Use control Inputs);
⑥时钟相位选择(Clock Phase Selection);
对于总线类型(Bus Type),在下列列表框中共有3种选择:
A、有符号整数(Signed Integer);
B、有符号小数(Signed Fractional);
C、无符号整数(Unsiged Integer);
在这里选择“Signed Integer”,即有符号整数。
对于输出位宽,由于正弦查找表(SinLUT)地址为6位,所以设置位宽设置为6。
IncCount是一个按时钟增1是计数器,Direction设置为Increment(增量方式)。
Use Control Input项不选。
因为如果选中此项,此模块会出现两个输入端分别是复位端和时钟端。
通常在simulink图中的元件的复位和时钟端(如果存在的话)是分别默认接于低电平和与全局时钟相连的。
Clock Phase Selection可设置为1(二进制)其它的设置采用Increment Decrement模块的默认设置。
图2—1 递增递减模块改为IncCount
⑶把Gate库中LUT拖到新建模型窗口名字修改为“Sin LUT”。
设置参数,把输出(Output[number of bits])改为8,查找表地址线宽(LUT Address Width)设为6。
总线数据类型选择为有符号整数(Signed Integer);在MATLAB Array 编辑框中输入计算查找表内容的计算式。
在此直接使用sin(正弦)函数,在这里sin函数的格式调用为:
Sin[起始值:步进值:结束值]
SinLUT是一个输入地址为6位,输入值位宽为8的正弦查找表模块,且输入
地址总线为有符号数,可以设置起始值为0、结束值为2∏、结束值为2∏/2^6。
计算式可写成:
127*sin([0:2*pi/2^6]:2*pi) 其中pi就是常数∏。
上式的数值变化范围是-127~+127,总值为256,恰好的8位二进制数是最大值。
但应注意,如果带边地址线宽,如8,以上的2的6次方要改为2的8次方,即:
127*sin([0:2*pi/2^6]:2*pi)
如果将SinLUT模块的总线数据类型设置为无符号整数(Unsiged Integer),且输出位宽(Number of bits)改为10,若想得到完整满度的波形输出,则上式应该为:
511*sin([0:2*pi/2^6]:2*pi)+512 在“Use LPM”(LPM:library of Pparameterrized Modules参数化模块库)处若选中,表示允许Quartus II 利用目标库中的嵌入式RAM(在EAB、ESB或M4K 模块中)来构成SinLUT,即将生成的正弦波数据放在嵌入式RAM构成的ROM中,这样可以节省大量的逻辑资源,否则SinLUT只能用芯片中的LCs来构成。
图2—2 LUT模块改为Sin LUT
⑷Storage库下的Delay模块Delay模块是一个延时环节,在这里可以不修改其默认参数设置。
Delay模块的“参数设置”对设置如下,参数Depthd是描述信号延时深度的参数。
但Depth为1时,信号传输函数为1/z,表示为通过Delay 模块的信号延时一个时钟周期;当Depth为整数n,其传输函数为1/z^n,表现为通过Delay模块的信号延时n 个周期。
Delay模块在硬件上可以采用寄存器(锁存器)来实现。
图2—3 Delay模块及其参数设置窗口
Clook Phase Selection参数主要是控制采样的。
当设置为1时就表示每一个主频脉冲后数据都能通过;如果设置为01则表示每隔一个脉冲通过一个数据;若设置为0011每隔两个脉冲通过两个数据;0100则表示Delay在每隔2个时钟被使能通过,而在第1、3、4个失踪时被禁止通过等等。
⑸修改Manipulation库中的AltBus模块名字为SinCtrl。
放置在新建模型框中作为端口。
图2—4 SinCtrl 模块及其参数设置窗口
在参数对话框中将其参数Bus Type设置为“Single Bit”,Node Type参数设置为“Node Port”这样以此端口就将在产生的VHDL文件中变成端口模式为“IN”,数据类型为STD__LOGIC的端口信号。
⑹Arithmentic库中Product(乘法)模块在这里有两个输入,一个是经过Delay的SinLUT查找表输出,另一个是外部一位端口SinCtrl。
从逻辑算法来看实现了SinCtrl对SinLUT查找表输出的控制。
其中Pipeline(流水线)参数指定该乘法器模块使用几级流水线,几乘积延时几个时钟周期后出现,Use LPM不选中,Use Dedicated Circuitry选项用于FPGA 中的专用模块的选择。
图2—5 Product模块及其参数设置窗口
⑺修改Manipulation库中AltBus模块的名字为SinOut作为个8位输出端口,与外面的8为D/A转换器相接,通过D/A把8位数据转换成一路模拟信号。
图2—6 SinOut模块
将SinOut的Bus Type设置为“Signed Integer”,Node Type参数设置为”Out Port”,修改number of bits参数为8即可。
这样以来AltBus模块在VHDL中将变成OUT端口模式的标准位矢量:STD__LOGIC__VECTOR(7 DOWN 0)。
Saturate选中,则当输出待表达式的最大的正值或负值时,此输出就扩位到此最大的正值或负值。
若没选中,那么最高位就会被截去。
此项对输入端口或常数节点类型是无效的。
Round项若选择“On”时,则输出就会忽略所以高位的0
位;选择“Off”,则最低位LSB被截去,这一项不适用于输入和常数类型。
Bypass Bus Format 项如选为“On”时,表示在Simulink中使用浮点数进行仿真。
2.2.3连接与编译
把所有模块在新建模型窗口中放置好,用箭头把所有的模块都连接起来。
这样就完成了对正弦波发生器的DSP Builder设计。
然后将模型保存为SinOut.mdl。
然后使用SingnalCompiler进行编辑,把mdl文件转换为VHDL文件。
3. 设计仿真
3.1 Simulink 仿真
3.1.1 加入仿真步进模块
首先加入一个Step模块以模块SinCtrl的按键使能操作。
在Simulink库中,选中Sources库把Step模块拖放到Sinout模块窗口中,如图3-1所示。
图3—1 Step模块
把Step模块与SinCtrl输入端口相连。
凡是来自Altera DSP Builder库以外的模块,Signal Compilder都不能将其变成硬件电路,即不会影响产生的VHDL程序,但是在启动Simulink仿真后能影响后面产生的仿真激励文件。
Step模块的情况正的如此。
3.1.2添加波形观察模块
图3—2 Scope模块图3—3 Scope初始显示
在库管理器中,把Sinks库中的Scope(示波器)拖放到Sinout窗口中,图中只有一个信号的波形观察窗口,若想多观察几路信号,可以通过调用多个Scope 模块的方法来实现,这里介绍通过修改Scope参数来增加同一Scope中的观察窗。
3.1.3Scope参数设置
在“Scope参数设置”对话框中有选项页General(通用)和Data history(数据历史)。
在General选项页中,改变“Number of axes”参数为2,就能看到Scope
窗口增加了两个波形观察窗。
每个观察窗都可以分别观察信号波形,且相对独立,将SinCtrl的信号接向Scope的另一端,以作信号比较。
要注意,此路信号在生成VHDL文件中不会有相应的语句,因而没有接上输出端口模块AltBus模块。
图3—4 设置Step的参数
3.1.4设置仿真激励
连接SinOut模型的全图,开始仿真。
仿真前设置一下与仿真相关的参数。
图3—5 SinOut全图
在SinOut模型图中只有一个输入端口SinCtrl,需要设置在SinOut模型图中只有一个输入端口SinCtrl,需要设置与此相连的Step模块:设置对输入端口SinCtrl施加的激励。
在的Step模块参数设置对话框中,可以看到下列参数,参数值的含义如下:
①步进间隔(Step time);
②初始值(Initial value);
③终值(Final value);
④采样时间(Sample time);
在此设置Step time为50;Initial value为0,即初始时,不输出正弦波;Final value为1,Sample time为1。
把最后两项选择:“Interpret vector parametres as 1-D”和“Enable zerocrossing dectection”都设为打勾。
Simulation仿真设置对话框中共有5个选项:Solver、Workspace I/O、Diagnostics、Advanced、Real-Time Workshop。
其中“Solver”选项页中完成仿真时的基本时间设置、步进间隔和选项方式及输出选项等设置。
在SinOut模型中,可设置Start Time为0.0,Stop Time为500。
其它设置按照默认。
3.1.5 启动仿真
SinOut模型编辑窗中,选Simulation / Start进行仿真。
仿真结束在Scope中观察窗它的仿真结果,SinOut信号是SinOut模型的输出(Scope观察窗中模拟了D/A的输出波形),SinCtrl信号的SinOut模型的输入,可以看出SinOut受到了SinCtrl的控制。
当SinCtrl为1时,SinOut波形是正弦波;当SinCtrl为0 时,输出也为0。
图3—6 有符号输出波形(系统级仿真)
3.2 QuartusII时序仿真
在Simulik中完成仿真以后,就是把设计转到硬件上加以实现,这是整个DSP Builder设计流程最为关键的一步,由此我们就可以得到针对特定FPGA芯片的VHDL代码。
先分析当前模型,再设置SignalCompiler,把模型文件MDL转换为VHDL,最后再进行综合、适配,最后再使用Quartus II实现时序仿真。
Files generated by SignalCompiler
图3—8 SinOut 工程编译后生成的文件说明
图3—9 SinOut 工程的时序仿真波形
4. 硬件测试与硬件实现
锁定管脚(Pin):目标器件确定为EP1K30TC144-3,对D/A输出的8位SinOuts (7 downto 0)可分别接PIO24-PIO31,对应引脚号是:41、42、65、67、6869、70、72;系统时钟clock接实验板的“clock0”,对应第126脚;清0信号sclrp 接键7,对应第19脚;输出控制iSinCtrls接键8,对应第18脚。
接着进行编译,完成适配过程。
最后是进行硬件的下载,连接好FPGA开发板。
选择模式5,clock0可接65536Hz;打开+/-12V电压,用示波器检测D/A的输出,把键控SinCtrl设置为有效(将键8设成高电平,键7设为低电平),就可在示波器上看到正弦波。
再将实测结果与计算机上进行的时序仿真结果比较。
图4-1示波器显示的波形照片(未滤波)图4-1示波器显示的波形照片(已滤波)
4.小结
到此毕业设计的全部工作就做完了,通过这次毕业设计使我对正弦信号发生器和DSP Builder和Quartus II等软件有了更进一步的了解。
DSP Builder是基于参数设置的模新设计,在设计过程中,参数设置非常重要。
另外,还有就是硬件实现的时,要注意管脚的锁定,操作要熟练。
本设计还可继续拓展,比如在芯片上来实现它。
不过通过这次毕业设计增强了我的动手能力,同时学会了一个人去独立的完成一项任务,本正弦信号发生器的原理简单易懂,可以实现正弦信号的正确输出,实现了预定的设计目标。
10。