基于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个失踪时被禁止通过等等。