基于VHDL的泰勒级数法求正弦函数值
- 格式:docx
- 大小:13.02 KB
- 文档页数:6
实验五泰勒级数展开法设计正弦信号发生器一、实验目的掌握用泰勒级数展开法求解sin(x)、cos(x)的原理及设计方法二、实验设备计算机、ZY130DSP12BD试验箱三、实验原理参加教材第六章第四节正弦波信号发生器四、实验内容1.用泰勒级数展开法计算sin(x)的值2.用泰勒级数展开法计算cos(x)的值3.用泰勒级数展开法产生正弦波五、实验步骤1.建立一个项目:点击Project->New ,将项目名称为shiyan4,并将项目保存的d:\文件夹下.2.建立一个源文件:点击File->New->Source File 可以打开一个文本编辑器窗口,点击保存按钮,保存在和项目相同的一个文件夹下面,保存类型*.asm ,将文件命名为shiyan4.asm.3 .在项目中添加源文件,在新建了一个源文件后,要想使用CSS 编译器对该源文件进行编译还需要将源文件添加到项目中去。
添加方法是在工程管理器中右键点击shiyan4.pjt,在弹出菜单中选择Add Files,然后将刚才建立的shiyan4.asm文件添加到该项目中去。
4.编写源程序:在工程管理器中双击shiyan4.asm,将出现的文本编辑窗口,在该文本编辑窗口中输入程序源代码。
(自己完成)5.编写中断向量表文件点击File->New->Source File 可以打开一个文本编辑器窗口,点击保存按钮,保存在和项目相同的一个文件夹下面,保存类型*.asm ,将文件命名为vectors.asm, 在工程管理器中右键点击shiyan4.pjt,在弹出菜单中选择Add Files,然后将刚才建立的vectors.asm文件添加到该项目中去。
然后,在工程管理器中双击vectors.asm,将出现的文本编辑窗口,在该文本编辑窗口中输入下面源代码:.title "vectors.asm".ref start.sect ".vectors"B start.end6.编写链接配置文件链接配置文件有很多功能,这里介绍最常见的也是必须的两条:1.存储器的分配 2.标明程序入口.由于每个程序都需要一个链接文件,每个程序的配置文件根据实际情况的需要都略有不同,下面为本实验的编写的一个配置文件。
1 正余弦的泰勒级数展开式正弦函数和余弦函数可以展开的泰勒级数如下:-+-+-=!x !x !x !x x x 9753)sin(9753 (1)-+-+-=!x !x !x !x x 86421)cos(8642 (2)若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前五项进行计算。
!x !x !x !x x x 9753)sin(9753+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=9*817*615*413*212222x x x x x (3) !x !x !x !x x 86421)cos(8642+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=8*716*514*31212222x x x x (4) 由式(3)和(4)可得导出递推公式,即])2sin[(])1sin[()cos(2)sin(x n x n x nx ---= ])2cos[(])1sin[()cos(2)cos(x n x n x nx ---=由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且需要x n )1sin[(-、x n )2sin[(-和x n )2cos[(-。
2 存储空间分配在正弦函数的计算程序所需要的存储空间有四个已初始化的数据段table_s 与若干个程序段组成的已初始化段和九个存储空间未初始化段,分别为:d_xs 、d_squr_xs 、d_temp_s 、d_sinx 、c_1_s 、d_coef_s(4个存储空间)。
其存储空间分布如下:计算正弦值存储单元分配3流程图4.程序.title "sin.asm".mmregs.def start.ref sin_start,d_xs,d_sinxSTACK: .usect "STACK",10HS tart: STM #STACK+10,SPLD #d_xs,DPST #6487H,d_xsCALL sin_startend: B endsin_start:.def sin_startD_coef_s .usect "coef_s",4.dataTable_s: .word 01C7H.word 030bH.word 0666H.word 1556Hd_xs .usect "sin_vars",1 ;定义未初始化段d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1_s .usect "sin_vars",1.textSSBX FRCT ;设置小数乘法STM #d_coff_s,AR4RPT #3MVPD #table_s,*AR4+ ;c1=1/72,c2=1/42,c3=1/20STM #d_coef_s,AR2STM #d_xs,AR3STM #c_1_s,AR5ST #7FFFH,c_1_sSQUR *AR3+,A ;求x的平方值ST A,*AR3||DL *AR5,B ;B=1MASR *AR3+,*AR2+,B,A ;A=(1-x^2)/72;T = x^2 MPYA A ;A=x^2(1-x^2)/72STH A,*AR3 ; AR3=d_temp_s= x^2(1-x^2)/72MASR *AR3-,*AR2+,B,A ; A = 1-x^2/42(1-x^2/72); T =x^2(1-x^2/72)MPYA *AR3+ ; B = X^2(1-x^2/42(1-x^2/72))ST B,*AR3 ; AR3=d_temp_s=B||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/20(1-x^2/42(1-x^2/7 2)MPYA*AR3+ ;B=(1-x^2/20(1-x^2/42(1-x^2/72))*x^2ST B,*AR3; d_temp_s= B = (1-x^2/20(1-x^2/42(1-x^2/72))*x^2||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))*x^2STM #d_xs,AR3MPYA AR3;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72 ))*x^2)STH B, d_sinx ; d_sinx=b 的出结果RET.end。
第8章应用VHDL语言方法设计简易正弦波信号发生器【要求】掌握运用VHDL语言设计正弦波形发生器的基本方法【知识点】•理解函数发生器的含义•理解VHDL设计正弦波形发生器•理解FPGA对D/A的接口和控制技术【重点和难点】• VHDL设计正弦波形发生器• FPGA对D/A的接口和控制技术§8.1 工作任务的陈述与背景一、工作任务用VHDL语言方法设计一个正弦波形发生器。
基本要求:①学习VHDL设计正弦波形发生器;②掌握FPGA对D/A的接口和控制技术。
完成波形发生器的设计、仿真测试及实验系统上的硬件测试。
二、任务背景自20世纪60年代以来信号发生器有了迅速的发展,出现了函数发生器。
作为电子系统的重要组成部分,它广泛地应用在电子技术实验、自动控制系统和其他科研领域。
早期的信号发生器多采用模拟电子技术,电路形式有采用运放及分离元件构成,也有采用单片集成函数发生器专用芯片。
但采用模拟电路组成的函数信号发生器,一般可靠性较差,频率输出精度、稳定度低,调节不够精确,设计过程复杂、困难,功能不易扩展,尤其对任意波信号产生较为困难,难以满足科研和高精度实验的需要。
现代高精度函数发生器设计采用了EDA 技术,不但大大缩短了开发研制周期,提高了设计效率,输出信号频率精度和稳定度有很大提升,而目使系统具有结构紧读、设计灵活、实现简单、性能稳定的特点。
本章着重介绍采用EDA技术,应用VHDL语言,在ALTERA公司的QuartusⅡ软件环境下,完成频率可调的正弦波发生器的程序设计过程,并进行逻辑综合、仿真和硬件下载,产生正弦波信号。
§8.2 完成工作任务的引导一、资讯要完成本任务,需要了解以下方面的知识。
1.函数(波形)信号发生器的定义和作用函数(波形)信号发生器能产生某些特定的周期性时间函数波形(C n1,弦波、方波、二角波、锯齿波和脉冲波等)信号,频率范围可从几个微赫到几十兆赫。
函数信号发生器在电路实验、设备检测、通信、宙达、导航、宇航等领域中具有十分广泛的用途。
基于泰勒级数展开法的DSP正弦信号发生器设计作者:姜志鹏程嫚嫚来源:《数字技术与应用》2013年第07期摘要:泰勒级数是使用多项式逼近已知函数的常用方法,本文分析了正弦信号的泰勒级数展开算法,基于TI公司C54xx系列DSP芯片的汇编语言编程实现该算法,并使用了存储单元复用的方法解决了为提高精度而增加展开项数导致的计数速度变慢的问题,同时也节省了硬件资源。
实验结果表明,基于该算法在DSP芯片中实现正弦信号发生器所需的存储资源以及计算精度均优于其他方法。
关键词:泰勒级数展开 DSP 正弦信号存储单元复用中图分类号:TP274 文献标识码:A 文章编号:1007-9416(2013)07-0163-021 引言正弦信号作为一种基本信号,具有非常有用的性质,如同频正弦信号相加,结果保持频率不变;整数倍频正弦信号之间的合成信号是频率与基波相同的的非正弦信号;正弦信号对时间的微分、积分后仍为同频的正弦信号等[1]。
由于这些原因,正弦信号作为典型信号或测试信号大量应用于通信、仪器和控制等领域。
正弦信号发生器的常用设计方法有查找表、递推公式法以及泰勒级数[2]。
其中,查找表要求事先将正弦信号各点数据存入存储器,当精度要求较高时需要占用较多的存储器空间;递推公式法要求用前值算出后值,当数据点数较大时,容易产生积累误差。
相比之下,泰勒级数是一种更适合于实际使用的算法。
2 硬件原理以DSP为核心的硬件电路通常包括DSP芯片、CPLD芯片、ADC/DAC电路、显示电路以及外围电路等[3]。
本文基于这种思路,设计的正弦信号发生器硬件框图如图1所示。
限于篇幅,(图1)中未列出如电源模块、电平转换模块等常规模块。
DSP采用了TI公司的16位定点DSP芯片TMS320C5416,CPLD芯片既要实现与键盘的交互,又是整个硬件系统的核心逻辑控制电路。
键盘用于对输出波形的幅度、频率等作出调整。
CPLD根据键盘的译码结果将不同的参数送往存储器,DSP在执行程序时从存储器中获得不同的参数从而产生不同的波形效果。
EDA实训报告学生姓名: XXX 学号: XXXXXXXXXXXX学院:理工学院专业:电子科学与技术题目:基于FPGA的正弦波发生器指导教师:安国臣2013年1月课程设计成绩评定表基于FPGA的正弦波发生器摘要:本设计结合了EDA技术和直接数字频率合成(DDS)技术。
EDA技术是现代电子设计技术的核心,是以电子系统设计为应用方向的电子产品自动化的设计技术。
DDS技术则是最为先进的频率合成技术,具有频率分辨率高、频率切换速度快、相位连续、输出相位噪声低等诸多优点。
本文在对现有DDS技术的大量文献调研的基础上,提出了符合FPGA结构的正弦信号发生器设计方案并利用MAXPLUSⅡ软件进行了设计实现。
文中介绍了EDA技术相关知识,同时阐述了DDS技术的工作原理、电路结构,及设计的思路和实现方法。
经过仿真测试,设计达到了技术要求。
关键词:现场可编程门阵列(FPGA);直接数字频率合成(DDS);正弦波信号发生器一、DDS的基本原理正弦波信号发生器是由地址发生器和正弦波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制。
1.地址发生器的原理地址发生器实质上就是计数器,ROM的地址是6位数据,相当于64位循环计数器。
2.只读存储器ROM的设计(1)、VHDL编程的实现①基本原理:为每一个存储单元编写一个地址,只有地址指定的存储单元才能与公共的I/O相连,然后进行存储数据的读写操作。
②逻辑功能:地址信号的选择下,从指定存储单元中读取相应数据。
直接数字频率合成器(DDFS)的基本原理:DDS是利用采样定理,根据相位间隔对正弦信号进行取样、量化、编码,然后储存在EPROM中构成一个正弦查询表,通过查表法产生波形。
它是由参考时钟、相位累加器、正弦查询表和D/A转换器组成,如图1所示。
图1 直接数字频率合成器原理框图相位累加器由N位加法器与N位累加寄存器级联构成,其原理框图如图2所示。
每来一个时钟脉冲Fc,N位加法器将频率控制数据K与累加寄存器输出的累加相位数据相加,把相加后的结果Y送至累加寄存器的输入端。
太原理工大学 DSP课程设计设计题目:正弦信号发生器的设计班级:电信0801班姓名:凌天一、设计目的1、通过实验掌握DSP的软件开发过程2、学会运用汇编语言进行程序设计3、学会用CCS仿真模拟DSP芯片,通过CCS软件平台上应用C54X汇编语言来实现正弦信号发生装置。
二、设计原理本实验产生正弦波的方法是泰勒级数展开法。
泰勒级数展开法需要的存储单元少,具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。
求一个角度的正弦值取泰勒级数的前5项,得近似计算式:x3x5x7x9sin(x)=x-+-+3!5!7!9!2222xxxx =x1-1-1-1-(三、总体方案设计 2⨯3(4⨯5(6⨯7(8⨯9))))本实验是基于CCS开发环境的。
CCS是TI公司推出的为开发TMS320系列DSP 软件的集成开发环境,是目前使用最为广泛的DSP开发软件之一。
它提供了环境配置、源文件编译、编译连接、程序调试、跟踪分析等环节,并把软、硬件开发工具集成在一起,使程序的编写、汇编、程序的软硬件仿真和调试等开发工作在统一的环境中进行,从而加速软件开发进程。
通过CCS软件平台上应用C54X汇编语言来实现正弦信号发生装置。
总体思想是:正弦波的波形可以看作由无数点组成,这些点与x轴的每一个角度值相对应,可以利用DSP处理器处理大量重复计算的优势来计算x轴每一点对应的y的值(在x轴取N个点进行逼近)。
整个系统软件由主程序和基于泰勒展开法的SIN子程序组成,相应的软件流程图如图。
四、设计内容1、设置在Family下选择C55xx,将看到所有C55xx的仿真驱动,包括软件仿真和硬件仿真;在Platform下选择Simulator,在Available Factory Boards中只显示软件仿真驱动,选中相应的驱动;双击C55xx Rev4.0 CPU Functional Simulator,可以在My System下看到所加入的驱动;点击Save & Quit,将保存设置退出Setup CCStudio v3.1并启动运行CCStudio。
正弦波信号发生器一、实验目的1.了解用泰勒级数展开法计算角度正弦值和余弦值;2.了解产生正弦信号的方法;3.熟悉使用汇编语言编写较复杂的程序;4.熟悉在CCS 环境下计算角度正弦值和余弦值及产生正弦波的方法;二、实验原理泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
正弦函数和余弦函数可以展开成泰勒级数,其表达式:递推公式: sin()2cos()sin[(1)]sin[(2)]cos()2cos()sin[(1)]cos[(2)]nx x n x n x nx x n x n x =---=--- 由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x )、sin(n -1)x 、sin(n -2)x 和cos(n -2)x 。
用这种方法求少数点还可以,如产生连续正弦波、余弦波,则积累误差太大,不可取。
下面主要用泰勒级数展开法求正弦和余弦值,以及产生正弦波的方法。
三、实验内容与步骤1.用泰勒级数展开法计算sin(x)的值;(1)在 CCS 中新建项目:sinx.pjt ,建立文件sinx.asm 、vectors.asm 和sinx.cmd 。
并将此三个文件加入到项目中。
******************************************************* 用泰勒级数开展开式计算一个角度的正弦值 **sin(x)=x(1-x*x/2*3(1-x*x/4*5(1-x*x/6*7(1-x*x/8*9))))*******************************************************.title "sinx.asm".mmregs .def startSTACK: .usect "STACK",10start: STM #STACK+10,SPLD #d_x,DPST #6487H,d_x ;x-->d_x CALLsin_start end:B end sin_start:35792222sin()3!5!7!9! 111123456789(((())))x x x x x x x x x x x =-+-+=----⨯⨯⨯⨯24682222cos()12!4!6!8! 11112345678((()))x x x x x x x x x =-+-+=----⨯⨯⨯.def sin_startd_coeff .usect "coeff",4.datatable: .word 01C7H ;c1=1/(8*9).word 030BH ;c2=1/(6*7).word 0666H ;c3=1/(4*5).word 1556H ;c4=1/(2*3)d_x .usect "sin_vars",1d_squr_x .usect "sin_vars",1d_temp .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1 .usect "sin_vars",1.textSSBX FRCTSTM #d_coeff,AR5RPT #3MVPD #table,*AR5+STM #d_coeff,AR3STM #d_x,AR2STM #c_1,AR4ST #7FFFH,c_1SQUR *AR2+,A ;A=x^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2MPYA A ;A=T*A=x^2(1-x^2/72)STH A,*AR2 ;(d_temp)=x^2(1-x^2/72)MASR *AR2-,*AR3+,B,A ;A=1-x^2/42(1-x^2/72),T=x^2(1-x^2/72)MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))ST B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))MPYA *AR2+ ;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))ST B,*AR2 ;(d_temp)=B||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))MPYA d_x ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))))STH B,d_sinx ;sin(theta)RET.end*******************************************************中断向量文件vectors.asm******************************************************.title "vectors.asm".ref start.sect ".vectors"B start.end*******************************************************链接命令文件******************************************************vectors.objsinx.obj-O sinx.out-m sinx.map-estartMEMORY{PAGE 0:EPROM: org=0090H,len=0F70HVECS: org=0080H,len=0010HPAGE 1:SPRAM: org=1000H,len=1000HDARAM: org=2000H,len=2000H}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0STACK :>SPRAM PAGE 1sin_vars :>DARAM PAGE 1coeff :>DARAM PAGE 1.vectors :>VECS PAGE 0}(2)编译、链接项目文件sinx.pjt。
sin x泰勒级数展开的python编程-概述说明以及解释1.引言1.1 概述概述:sin x是一种基本的三角函数,常用于描述周期性现象或波动振动问题。
在数学中,sin x可以通过泰勒级数来近似表示。
泰勒级数展开是将一个函数在某个点的附近进行多项式逼近的方法,可以将复杂的函数转化为简单的多项式来进行计算和分析。
本文旨在通过使用Python编程语言实现sin x的泰勒级数展开,来探讨其原理和应用。
文章将从sin x的定义与特性入手,介绍泰勒级数展开的原理,并详细解释如何使用Python编写程序来实现这一展开过程。
通过编程实例,读者将能够理解泰勒级数展开的计算方法和在Python中的具体实现步骤,同时也能加深对sin x函数的理解。
文章将以以下内容逐步展开:首先,在引言部分给出了本文的目的和整体结构;接下来,就sin x的定义和特性进行介绍,包括正弦函数的图像特点和基本性质;然后,将详细解释泰勒级数展开的原理,包括级数的推导和收敛条件;最后,通过使用Python编程语言来实现sin x的泰勒级数展开,并给出具体的代码实例和运行结果。
文章的结论部分将对实现结果进行总结和分析,探讨编程应用展望,并对整篇文章进行总结,并展望未来可能的扩展方向。
通过阅读本文,读者将能够深入了解sin x的泰勒级数展开,掌握使用Python编程来实现该展开的方法,同时也能够在实际应用中运用所学知识解决相关问题。
1.2文章结构文章结构部分的内容通常包括对整篇文章的组织和内容安排的介绍。
在这个部分,你可以描述每个章节的主要内容和目的,以及这些章节之间的逻辑关系。
下面是一个可能的编写方式:1.2 文章结构本文将主要围绕sin x的泰勒级数展开展开,通过Python编程实现该展开式的计算。
文章分为引言、正文和结论三个主要部分。
在引言部分,我们将给出这篇文章的概述,简要介绍sin x的定义和特性,以及本文的目的。
正文部分将具体讨论sin x的定义与特性(2.1小节),以及泰勒级数展开的原理(2.2小节)。
1.引言 (1)2. EDA及系统硬件概述 (2)2.1 VHDL语言 (2)2.2 Quartus II软件 (4)2.3 DAC0832的简要介绍: (4)3.总体设计思想及流程 (5)4. 主要功能的实现模块如下: (7)4.1倍频器模块 (7)4.2主程序模块 (7)4.3 波形显示模块 (8)4.4频率显示模块 (8)5. 软件仿真 (8)6.硬件测试 (10)6.1编译 (10)6.2 引脚的锁定 (10)6.3编程下载 (11)6.4 硬件验证 (11)6.5 波形显示 (12)7. 总结与体会 (13)参考文献 (14)附录 (15)1.引言信号发生器是一种能够产生多种波形,如三角波、方波、锯齿波、正弦波的仪器。
信号发生器在电路实验和设备检测以及通信、雷达、导航、宇航等领域有广泛的应用。
正因为其在生活中应用的重要性,人们它做了大量的研究,总结出了许多实现方式。
可以基于FPGA 、VHDL、单片机、DOS技能、数字电路等多种方法实现。
正弦波信号发生器是信号发生器的一种。
可以实现信号发生器的一些基本功能。
在本次EDA课程设计中所要求的是采用VHDL来实现正弦波信号发生器。
设计的正弦波信号发生器所具有的功能如下:(1)电路的外部频率为40MHz,自己所设计的正弦信号发生器可产生0-1KHz、1KHz~10KHz、10KHz~1MHz三档频率的信号;(2)具有频率段选择的功能;(3)在同一频率档内,可实现频率的加减;(4)在显示波形的同时能够进行频率的调节;(5)能够显示正弦波(6)能够显示频率值;(7)可用示波器进行波形的观测。
2. EDA及系统硬件概述EDA技术是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关开发软件,自动完成用软件的方式设计的电子系统到硬件系统实现,最终形成集成电子系统或专用集成芯片的一门新技术。
1 正余弦的泰勒级数展开式高等数学中,正弦函数和余弦函数可以展开的泰勒级数,其表达试如下:-+-+-=!x !x !x !x x x 9753)sin(9753 (1)-+-+-=!x !x !x !x x 86421)cos(8642 (2)若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前五项进行计算。
!x !x !x !x x x 9753)sin(9753+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=9*817*615*413*212222x x x x x (3) !x !x !x !x x 86421)cos(8642+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=8*716*514*31212222x x x x (4) 由式(3)和(4)可得导出递推公式,即])2sin[(])1sin[()cos(2)sin(x n x n x nx ---= ])2cos[(])1sin[()cos(2)cos(x n x n x nx ---=由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且需要x n )1sin[(-、x n )2sin[(-和x n )2cos[(-。
2 存储空间的分配在正弦函数的计算程序所需要的存储空间有四个已初始化的数据段table_s 与若干个程序段组成的已初始化段和九个存储空间未初始化段,分别为:d_xs 、d_squr_xs 、d_temp_s 、d_sinx 、c_1_s 、d_coef_s(4个存储空间)。
其存储空间分布如下:图2.1 计算正弦值存储单元分配3 迭代法计算正弦值3.1 迭代法正弦值的计算流程图其中n a 随迭代次数的变化而变化1a =9*81、2a =6*71、3a =4*51、4a =2*31(1) 执行第一次迭代:DL *AR5,B图3.1.1 迭代法正弦值的计算流程图MASR *AR3+,*AR2+,B,AMPYA ASTH A,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫⎝⎛-8*7122x x(2) 执行第二次迭代:MASR *AR3-,*AR2+,B,AMPYA *AR3+ST B,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫⎝⎛⎪⎪⎭⎫ ⎝⎛--8*717*61222x x x 执行第三次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,A MPYA *AR3+ ST B,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛---8*717*614*512222x x x x 执行第四次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,ASTM #d_xs,AR3 执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----8*717*614*512*312222x x x x x 即可粗略的求的sinx 的值为d_temp_s 中的值3.2 正弦函数计算程序.title "sin.asm".mmregs.def start.ref sin_start,d_xs,d_sinxSTACK: .usect "STACK",10H ;定义堆栈空间S tart: STM #STACK+10,SP ;给堆栈指针赋值栈顶LD #d_xs,DPST #6487H,d_xsCALL sin_startend: B endsin_start:.def sin_startD_coef_s .usect "coef_s",4.dataTable_s: .word 01C7H ;C1=01C7H.word 030bH ;C2=030bH.word 0666H ;C3=0666H.word 1556H ;C4=1556Hd_xs .usect "sin_vars",1 ;定义未初始化段d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1_s .usect "sin_vars",1.textSSBX FRCT ;设置小数乘法STM #d_coff_s,AR4RPT #3MVPD #table_s,*AR4+ ;c1=1/72,c2=1/42,c3=1/20;c4=1/6STM #d_coef_s,AR2STM #d_xs,AR3STM #c_1_s,AR5 ;AR5指向C_1_SST #7FFFH,c_1_sSQUR *AR3+,A ;求x的平方值ST A,*AR3 ;把x平方值放入(AR3)||DL *AR5,B ;B=1MASR *AR3+,*AR2+,B,A ;A=(1-x^2)/72;T = x^2 MPYA A ;A=x^2(1-x^2)/72STH A,*AR3 ; AR3=d_temp_s= x^2(1-x^2)/72MASR *AR3-,*AR2+,B,A ; A = 1-x^2/42(1-x^2/72); T =x^2(1-x^2/72)MPYA *AR3+ ; B = X^2(1-x^2/42(1-x^2/72))ST B,*AR3 ; AR3=d_temp_s=B||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/20(1-x^2/42(1-x^2/7 2)MPYA*AR3+ ;B=(1-x^2/20(1-x^2/42(1-x^2/72))*x^2ST B,*AR3; d_temp_s= B = (1-x^2/20(1-x^2/42(1-x^2/72))*x^2||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))*x^2STM #d_xs,AR3MPYA AR3;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72 ))*x^2)STH B, d_sinx ; d_sinx=b 的出结果RET.end4 复位向量文件和链接文件4.1 复位向量文件程序中所用的复位向量文件如下:.sect ".vectors".ref start ; C entry point.align 0x80 ; must be aligned on page boundaryRESET: ; reset vectorBD start ; branch to C entry point .end4.2 链接文件链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。
基于VHDL的泰勒级数法求正弦函数值
-- mysin.vhd write by jiaolonglan
-- use taylor's series method to calc 0 to pi sin(theta) the theta is type zero
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity mysin is
generic( data_width :integer :=16 ;
pi:integer := 25736 --Q13 type
);
port(
clk : IN std_logic; --convert 0 to 180 other deg ought to convert to this range
datain: IN std_logic_vector(data_width-1 downto 0 );--data input port deg -180 to 180
reset: IN std_logic; -- reset
updatein:IN std_logic; -- when risedge indicated new data in
updateout: OUT std_logic; -- when risedge indicated calc end and data had output
dout: OUT std_logic_vector(data_width-1 downto 0) --data output port q15 type
);
end entity mysin;
architecture bhv of mysin is
signal data0 : integer range -2**(data_width-1) to 2**(data_width-1):=0; -- signal calc_flag: std_logic := '0';
signal dly:std_logic_vector(1 downto 0):="00";
signal outtemp:std_logic;
signal negative:std_logic;
begin
risedge:process(clk,updatein)
begin
if(clk'event and clk='1')then
dly<=dly(0)&updatein;
end if;
end process risedge;
din: process(clk,reset,dly) -- data input
variable xxx:integer range -2**30 to 2**30 :=0; -- Q26 type for test
variable datatemp : integer range -2**(data_width-1) to 2**(data_width-1):=0; --
variable negativetemp: std_logic;
begin
if( reset = '1')then
data0 <=0;
calc_flag <='0';
elsif(clk'event and clk='1')then
if( dly = "01" )then -- new data in
datatemp := conv_integer(datain);
if datatemp < 0 then
datatemp := -1*datatemp;
negativetemp :='1'; -- negative deg
else
negativetemp :='0';-- negative deg
end if;
if datatemp >360 then
datatemp := datatemp rem 360;
end if;
if datatemp > 180 then -- convert to 0 to 180 range
datatemp := 360-datatemp;
negativetemp := not( negativetemp);
end if;
--data0<= conv_integer(datain)*pi/180; --deg convert to RAD -- q13 type datatemp := datatemp*pi/180;
negative <= negativetemp;
data0 <= datatemp;
calc_flag <='1';
--xxx:= conv_integer(datain); for test
else -- haven't new data
calc_flag <='0';
end if;
end if;
end process din;
calc:process(clk,calc_flag,data0,datain)
-- variable total:integer range -2**data_width to 2**data_width := 0; -- temp
variable total:integer range -2**30 to 2**30 := 0; -- temp
variable xx: integer range -2**30 to 2**30 :=0; -- Q26 type
constant coef0 : integer range -2**(data_width-1) to 2**(data_width-1):= 32767; -- 1 Q15 type
constant coef1 : integer range -2**(data_width-1) to 2**(data_width-1):= 5461; -- 1/6
constant coef2 : integer range -2**(data_width-1) to 2**(data_w
idth-1):= 1638; -- 1/20
constant coef3 : integer range -2**(data_width-1) to 2**(data_width-1):= 780; -- 1/42
constant coef4 : integer range -2**(data_width-1) to 2**(data_width-1):= 455; -- 1/72
begin
if(clk'event and clk ='1') then
if( calc_flag ='1' ) then
total :=0;
xx := (data0*data0)/2048; --x^2 q26-11 =Q15 type
total := (coef0*32768-xx*coef4)/32768; -- Q15 right calc
total := (coef0*32768-(xx*coef3/32768)*total)/32768; -- Q15
total := (coef0*32768-(xx*coef2/32768)*total)/32768; -- Q15
total := ( coef0*32768-(xx*coef1/32768)*total)/32768; -- Q15 total := data0*4*( total)/32768; -- Q15
if negative ='1' then
total := -1*total;
end if;
dout <= conv_std_logic_vector(total,16);-- filtered data out outtemp<='1'; -- data out indicated
else
outtemp<='0';
end if;
updateout<=outtemp;
end if;
end process;
end bhv;。