Cordic数控振荡器_第1页
Cordic数控振荡器_第2页
Cordic数控振荡器_第3页
Cordic数控振荡器_第4页
Cordic数控振荡器_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于Cordic算法的数控振荡器的设计这是我的毕业设计,愿与所有人分享,因为很多都是来自于网络,我也愿意最后分享于网络。同时在看下面的文章的时间之前,我需要做一些说明。完成一个Cordic的数控振荡器,在下面的文章中,可以说是从零说起,所以已经有了解的朋友可以根据自己需要跳着看。做一个数控振荡器,最重要的三个地方是,了解一下DDS原理,Cordic算法,最后是它们如何用VHDL语言实现。这三点在正文中有,同时也在我的附件里,大家也可以在网络上搜索。最后要说明的说,我的设计,存在尖峰失真。在仿真结果中,大家可以看出,希望一起寻找解决方案。附件在rayfile网盘中,大家自己下载 目录1 引言11

2、.1 背景及意义11.2 基于DDS的数控振荡器NCO22 数控振荡器的原理42.1 NCO的基本原理42.2 NCO的性能指标53 Cordic算法介绍64算法实现124.1系统总体设计124.2 NCO模块124.3串口与显示模块1818275 仿真结果306 结果验证376.1 fpga选型以及管脚分配376.2 AD转换电路376.3 示波器验证结果391 引言1.1 背景及意义随着现代电子技术的不断发展,很多应用领域对信号的频率的准确度和稳定性要求越来越高,不仅需要单一的固定频率,还需要多点频率,如短波通信接收机要求在23OMH之的范围内提供以100HZ 为间隔的28000个通信频道

3、。一般的振荡器己不能满足要求,于是出现了高稳定和高准确的晶体振荡器。但晶体振荡器产生的只是单一频率的信号或只能在很小范围内微调。然而,在通信、雷达、仪表、宇航等领域往往需要在一定频率范围内提供一系列稳定和准确的频率,为了解决既要频率稳定准确,又要频率能在很大范围内变化的问题,于是产生了频率合成技术。频率合成技术广泛应用于通信、航空航天、仪器仪表等领域。目前,常用的频率合成技术有直接式频率合成、锁相频率合成和直接数字频率合成(DDS)。DDS系统可以很方地获得频率分辨率很精细且相位连续的信号,也可以通过改变相位字改变信号的相位,因此也广泛用于数字通信领域。频率合成技术的发展经过以下几个阶段:1)

4、直接频率合成直接频率合成理论大约在20世纪30年代中期开始形成,当时是利用单个或多个不同频率的晶体振荡器作为基准信号源,经过倍频、分频、混频等途径直接产生许多离散频率的输出信号,这就是最早应用的频率合成器,称之为直接式频率合成器。采用单一或多个不同频率的晶体振荡器作为基准信号源,经过具有加减乘除四则运算功能的混频器、倍频器、分频器和具有选频功能的滤波器的不同组合来实现频率合成。2) 锁相频率合成相位反馈理论和锁相技术应用于频率合成领域,产生了间接式频率合成器。所谓间接式是指合成器的输出信号不是直接从参考源经过变换而得,而是由锁相环的压控振荡器间接产生所需要的频率输出,所以,间接式频率合成器又称

5、为锁相频率合成器。它是基于锁相环路的同步原理,从一个高准确度、高稳定度的参考晶体振荡器综合出大量离散频率的一种技术。3) 直接数字频率合成数字技术的飞速发展,使频率合成技术也跃上了一个新的台阶。1917年,美国学者JTienrey,CM Rader和B.Godl提出了以全数字技术从相位概念出发,直接合成所需波形的一种新的频率合成原理,形成了第三代频率合成方案DDS。DDS是用数字控制方法从一个标准参考频率源产生多种频率的技术,它是把一系列数字量形式的信号通过D/A转换形成模拟量形式的信号的合成技术。利用高速存储器作查寻表,然后通过高速DA转换器产生已经用数字形式存入的正弦波(或其他任意波形)。

6、DDS系统可以很方地获得频率分辨率很精细且相位连续的信号,也可以通过改变相位字改变信号的相位,因此也广泛用于数字通信领域。1.2 基于DDS的数控振荡器NCO数字控制振荡器(NCO,numerical controlled oscillator)是软件无线电、快速傅立叶变换(FFT,Fast Fourier Transform) 等的重要组成部分,同时也是决定其性能的主要因素之一,用于产生可控的正弦波或余弦波。随着芯片集成度的提高、在信号处理、数字通信领域、调制解调、变频调速、制导控制、电力电子等方面得到越来越广泛的应用。它具有频率精度高、响应速度快、频谱纯度高及相位易编程等优点,其主要作用是

7、生成正交的正余弦信号,主要的实现方式是查找表法、多项式展开法和基于CORDIC 算法的实现方法。不论以何种方式实现NCO,NCO 的结构都是由相位累加器、相位加法器和波形发生器成,不同的是波形发生器的实现方式。NCO的系统结构图如图1.1。相位控制字寄存器频率控制字寄存器相位累加器相位加法器波形发生器相位控制字频率控制字波形输出 图1.1 NCO的系统结构图目前有三种发生波形的方式:1)查表法:采用查表法(LUT),即事先根据各个正余弦波相位计算好相位的正余弦值,并按相位角度作为地址存储该相位的正余弦值,构成一个幅度P相位转换电路(即波形存储器)。2)多项式展开法:将三角函数展开成泰勒级数形式

8、,忽略高次相,该方式需要乘法单元。3)CORDIC算法实现:CORDIC 算法是一种基于向量旋转的数值计算方法。该算法仅仅通过迭代操作来逼近三角函数及其他一些函数,用该算法来代替上述的查找表产生正余弦函数样值将会大大的节省硬件资源。传统的查表法(LUT),它是事先根据各个正余弦波相位计算好相位的正余弦值,并按相位角度作为地址存储该相位的正余弦值,构成一个幅度P相位转换电路(即波形存储器)。在系统时钟的控制下,由相位累加器对输入频率字不断累加,得到以该频率字为步进的数字相位,再通过相位相加模块进行初始相位偏移,得到要输出的当前相位,将该值作为取样地址值送入幅度P相位转换电路,查表获得正余弦信号样

9、本。对于一个相位位数为n ,输出信号幅度位数为M的数控振荡器,所需查找表大小为M。为了提高数控振荡器的频率分辨率,往往需要扩大波形存储器的容量,造成存储资源的大量消耗。而且,当需要外挂RAM 来存储波形时,由于受到RAM读取速度的影响,数控振荡器的输出速率必然受到制约。因此,当需要设计高速、高精度的数控振荡器时,不宜采用查表法。为了避免使用大容量存储器,可以考虑利用算法来产生正余弦样本。基于矢量旋转的CORDIC算法正好满足了这一需求,该算法主要用于计算三角函数、双曲函数及其它一些基本函数运算。它有线性的收敛域和序列的特性,只要迭代次数足够,即可保证结果有足够的精度。2 数控振荡器的原理2.1

10、 NCO的基本原理在通过相位累加产生地址信息时,通常需要输出当前时刻的相位值所对应的正弦值,即以参考频率源对相位进行等可控间隔采样。理想的正弦波信号S (t) 可以表示成:(2-1)式(2-1) 说明,信号S (t) 在振幅A和初相准确定之后,其频率可以由相位来唯一确定。即:(2-2)NCO就是利用式(2-2) 中 与时间t成线性关系的原理来进行频率合成的.也就是说,在时间t=t间隔内,正弦信号的相位增量准与正弦信号的频率f可构成一一对应关系,也就是说,对式(2-2) 两端进行微分后有:(2-3)由上面的讨论可知:(2-4)其中,为一个采样间隔t之间的相位增量,采样周期,故式(2-4) 可改写

11、为:(2-5)由式(2-5) 可知,如果可以控制,就可以控制不同的频率输出。由于受频率控制字FCW的控制,即:,所以改变FCW就可以得到不同的输出频率f0,然后经代换处理可得如下方程:(2-6)当=1时,(2-7)式(2-6) 和式(2-7)中的L为相位累加器的位数。根据Nyquist准则,允许输出的频率最高为,即。但在实际工程中,由于受到低通滤波器的限制,一般输出的频率为foutmax40%FCLK。2.2 NCO的性能指标 NCO的性能指标包括信号频率分辨率、信噪比(SNR)、无杂散动态范围(SFDR) 和输出的信号正交性。这些性能指标取决于NCO的数据位数。NCO的数据位数包括用于表示相

12、位数据的位数n和表示相位的正弦值数据的位数nb,二者之间存在nb取决于n的关系,且前者必须能够表示相位变化时其相位正弦值变化的最小值。相位最小变化值的正弦值最小变化发生在(/2-)/2,/2(/2+), (3/2-)3/2, 3/2(3/2+),同时其相位的取值是在02间且等间隔地分为2n个取值点,因此,由正弦波的特性可知:只需要讨论相位在/2-准与/2取值点的正弦值之差:(2-8)对式(2-7) 经过三角变换并求对数可得:(2-9)而将准带入式(2-8) 可得:(2-10)3 Cordic算法介绍目前的 FPGA 具有许多乘法器和加法器。然而各种各样的通信技术和矩阵算法则需要三角函数、平方根

13、等的运算。可以使用查找表,或是迭代法。CORDIC算法;这是一个“移位相加”算法,允许计算不同的三角函数,例如:sqr(x2+y2)cos,tan,sin 包括除法和对数函数在内的其它函数。CORIDC技术并不是什么新鲜的东西。事实上它可以追溯到1957年由J.Volder发表的一篇文章。在上个世纪五十年代,在大型实际的计算机中的实行移位相加受到了当时技术上的限制,所以使用CORDIC变得非常必要。到了七十年代,Hewlett Packard和其他公司出产了手持计算器,许多计算器使用一个内部CORDIC单元来计算所有的三角函数(了解这件事的人们一定还记得,那时求一个角度的正切值需要延迟大约1秒

14、中)。二十世纪八十年代,随着高速度乘法器与带有大存储量的通用处理器的出现, CORDIC算法变得无关紧要了。然而在二十一世纪的今天,对于FPGA来说,CORDIC一定是在DSP应用中(诸如多输入多输出(MIMO),波束形成以及其他自适应系统)计算三角函数的备选技术。笛卡尔坐标平面旋转,如图3.1所示:(3-1)(3-2)图3.1 向量的旋转这被称为是平面旋转、向量旋转或者线性(矩阵)代数中的Givens旋转。式(3-1)与式(3-2)方程组同样可写成矩阵向量形式:(3-3)通过提出因数cos,方程可写成下面的形式:(3-4)并不能通过适当的数学方法去除cos项,然而随后发现去除cos项可以简化

15、坐标平面旋转的计算操作。伪旋转示意图如图3.2所示:图3.2 在平面坐标系内伪旋转 因此经过伪旋转之后,向量 R 的模值将增加1/cos 倍。向量旋转了正确的角度, 但模值出现错误。CORDIC 方法的核心是(伪)旋转角度,其中tan=2-i。故方程为:(3-5)表3.1指出用于CORDIC 算法中每个迭代(i)的旋转角度(精确到9位小数):表3.1cordic旋转角度将各种可能的旋转角度加以限制,使得对任意角度的旋转能够通过一系列连续小角度的旋转迭代i来完成。旋转角度遵循法则:,遵循这样的法则,乘以正切项变成了移位操作。前几次迭代的形式为:第1次迭代:旋转45;第2次迭代;旋转26.6,第3

16、次迭代:旋转14等。每次旋转的方向都影响到最终要旋转的累积角度。在99.799.7的范围内的任意角度都可以旋转。满足法则的所有角度的总和tani= 2-i为99.7。对于该范围之外的角度,可使用三角恒等式转化成该范围内的角度。角分辨率的数据位数与最终的精度有关。表3.2列数了13级流水线需要的旋转角度值。表3.2 13级为旋转角度值因此,在13次旋转以后,为了标定伪旋转的幅度,要求乘以一个系数1.64676024187。角分辨率的数据位数对最终的旋转精度非常关键。前面所示的伪旋转现在可以表示为式(3-6):(3-6)在这里引入第三个方程,被称为角度累加器,用来在每次迭代过程中追踪累加的旋转角度

17、:z(i+1) = z(i) di(i) (Angle Accumulator)where di = +/- 1(3-7)符号di是一个判决算子,用于确定旋转的方向。其中判决算子di决定旋转的方向是顺时针还是逆时针。di的值取决于下面将要讨论的操作模式。这里引入了名为角度累加器的第三个等式,用于追踪每次迭代中旋转的角度的叠加:(3-8)上述三个方程式为圆周坐标系中用于角度旋转的CORDIC算法的表达式。因此,原始的算法现在已经被减化为使用向量的伪旋转来表示的迭代移位-相加算法:(3-9)因此每个迭代需要:2次移位1次查找表(i)值)3次加法伸缩因子伸缩因子是伪旋转的副产物。当简化算法以允许伪旋

18、转时,cos项被忽略。这样,输出x(n),y(n)被伸缩Kn倍,其中:(3-10)然而如果迭代次数可知,则可以预先计算伸缩因子Kn。同样,1/Kn也可被预先计算以得到x(n)和y(n)的真值。旋转模式CORDIC方法有两种操作模式;工作模式决定了控制算子di的条件;在旋转模式中选择: di=sign(z(i)z(i)0;n次迭代后得到:(3-11)通过设置x(0)=1/Kn和y(0)=0可以计算cosz(0)和sinz(0)。旋转模式中,判决算子di满足下面条件:di=(signz(i)(3-12)因此,输入x(0)和z(0)(y(0)=0),然后通过迭代使z(0)取值趋近于0。例如:当z(0

19、)=30时,计算sinz(0),cosz(0) 。计算过程如表3.3所示。表3.3 当z=30时的cordic迭代过程圆坐标系 目前仅涉及了圆坐标系中的伪旋转。 因此, 下面的函数可被计算,如图3.6所示: 图3.6 cordic算法计算cos与sin4算法实现4.1系统总体设计根据自顶向下的设计原则,考虑到最后的程序要满足条件为:可以接受来自上位机串口传来的控制字,根据次控制字输出正弦波。因此程序分为三部分:串行接受模块,基于cordic的NCO模块;还有一个方便调试控制字显示模块。它们彼此之间是相互独立的,可以进行单独的时序仿真。最后只需要简单的级联使整个系统工作。本次设计最重要的模块是N

20、CO模块,其次是串行接受模块与控制字显示模块。NCO的整体结构如图4.13所示。串行接受模块NCO控制字显示图4.13 NCO的整体结构在vhdl语言中显示模块与串行模块可合并为一个模块。NCO模块接受来自serialporttest的18位频率控制字。如图4.14所示。图4.14 NCO在Quartus2中的原理图设计过程是首先完成NCO部分,在Quartus2中进行时序仿真,再通过matlab软件仿真出时域和频域的结果,验证数据的正确性,从而完成串行接受模块。通过显示模块,观察是否能够等到准确的数据,最后将整个系统级联,进行时序仿真,最后下载到fpga板子上,接上后续DA转换模块,在示波器

21、上观察波形。4.2 NCO模块NCO模块是核心模块,其结构图如图4.15所示:图4.15 NCO系统结构图这里假设初始相位为0,那么相位控制字可以省略,每来一个时钟信号,累加器完成一次累加,而频率控制字就是步长,最后通过函数发生器产生波形。有三种函数发生器,第一种是利用泰勒级数展开计算需要的正弦值,此方法需要乘法单元;第二种是基于rom的查表方式,此方式在相位位数增加时,对rom的大小成指数增长;第三种即是cordic算法,只需要移位加减就能计算出需要的正余弦值。Cordic流水线结构如下图所示,x0和y0根据第二章的结论,量化为二进制,值保存为第二章所述的角度值,也量化为二进制。z0为输入的

22、角度值。在设计cordic流水线时首先要确定相位位数,然后根据相位位数用第一章的公式计算出合理的数据位数。当18位相位位数时,应该配以20位的数据位。然而为了最后fpga实现AD转换时能够配上AD,所以设计采用12位的数据位。本次设计采用13级流水单元,因为12位的数据位配合13级的流水线能够产生最佳的效果,因为流水线级数越高,cordic算法的精度就越过,但是高于数据位位数加一的级数没有意义,因为此时的移位已经将数据全部计算为0。图4.16 cordic流水线结构如图4.17所示,每一级流水线基本都是相同的,所以用参数化的vhdl设计,两个参数需要事先设置,一个是移位位数,还有一个是角度增减

23、量;需要说明的是t_in与t_out是用来判断此次角度所在的象限的。一个360度的范围内,所有角度都折算到0度到45度计算,最后利用三角恒等式输出。 图4.17 cordic流水线结构如上所述,NCO需要一个18位累加器,输出的角度判断象限,传递给流水线单元,最后输出的三角函数值,需要利用三角恒等式调整。所以整体的电路原理图结构如图4.18所示:图4.18 cordic流水线电路原理图第一个单元是累加器,每当有时钟信号,不断的将频率控制字,即步长,加到累加器中,象限判断的单元将所有角度折算到45度范围内,并且将角度信息保留到三位二进制t变量中,继续传递给后续的cordic单元。累加器可以利用软

24、件自带的导向生成一个累加器,而象限判断利用vhdl写出其功能。如下:LIBRARY IEEE ;ENTITY xiangxianpanduan ISPORT ( CLK: IN STD_LOGIC ;D : IN STD_LOGIC_VECTOR(17 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);t: OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ;END ;ARCHITECTURE bhv OF xiangxianpanduan ISBEGINPROCESS (CLK) VARIABLE temp : STD_LOGIC

25、_VECTOR(17 DOWNTO 0) ;VARIABLE temp_t : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINtemp:=D(17 downto 0);temp_t:=temp(17 downto 15);IF CLKEVENT AND CLK = 1 THENcase temp_t iswhen 000 =temp:=temp;when 001 =when 010 =when 011 =when 100 =when 101 =when 110 =when 111 =end case;Q = temp;t=000000000000000000 thenx_

26、out=x_in-temp_y;y_out=y_in+temp_x;angle_out=angle_in-compare_angle;elsex_out=x_in+temp_y;y_out=y_in-temp_x;angle_out=angle_in+compare_angle;end if;t_out=t_in;end if;end process;end behavior;至此,整个NCO基本完成,编译完成没有出现错误,可以进行时序仿真。NCO生成的电路符号如图4.18所示。4.18 NCO单元生成的电路符号4.3串口与显示模块串口和显示模块是为了能让下载到fpga中的程序,能够接受实时的

27、上位机频率控制字,改变输出正弦波的频率。作为标准设备,大多数的计算机都有1到2个RS-232串口。RS-232有下列特性: 使用9针的DB-9插头(旧式计算机使用25针的DB-25插头). 允许全双工的双向通讯(说计算机可以在接收数据的同时发送数据). 最大可支持的传输速率为10KBytes/s. 图4.19 DB-9插头一共有9个引脚,最重要的3个引脚是: 引脚2: RxD (接收数据). 引脚3: TxD (发送数据). 引脚5: GND (地). 仅使用3跟电缆,就可以发送和接收数据。串行通讯数据以每次一位的方式传输;每条线用来传输一个方向的数据。由于计算机通常至少需要若干位数据,因此数

28、据在发送之前先“串行化”。通常是以8位数据为1组的。 。先发送最低有效位,最后发送最高有效位。异步通讯RS-232使用异步通讯协议。数据的传输没有时钟信号。接收端必须有某种方式,使之与接收数据同步。对于RS-232来说,是这样处理的:a) 串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等) b) 当没有数据传输的时候,发送端向数据线上发送1 c) 每传输一个字节之前,发送端先发送一个0来表示传输已经开始。这样接收端便可以知道有数据到来了。 d) 开始传输后,数据以约定的速度和格式传输,所以接收端可以与之同步 e) 每次传输完成一个字节之后,都在其后发送一个停止位(1) 数据的传输速

29、度是用波特来描述的,亦即每秒钟传输的数据位,例如1000波特表示每秒钟传输100比特的数据, 或者说每个数据位持续1毫秒。波特率不是随意的,必须服从一定的标准,如果希望设计123456波特的RS-232接口,常用的串行传输速率值包括以下几种: 1200 波特. 9600 波特. 38400 波特. 115200 波特 (通常情况下是可以使用的最高速度)本次设计时采用9600波特率。根据串口通信协议,并且利用现有流行的串行通信模块,改变成方便本设计的串行模块。可以知道串行通信是8位一组,然而频率控制字是18位,那么需要传输三次,才能读取到频率控制字。串口电路原理图如图4.22所示。图4.22 串

30、行接受模块整体电路图下面是实现的模块:。1. 当serial线上有数据时,接收模块负责识别RxD线上的数据2.当收到一个字节的数据时,锁存接收到的数据到“rbuf”总线,并使“rbuf”有效一个周期。 3.receive模块将负责接受三个8为数据,作为控制字。只有当“r_ready”有效时,“rbuf”总线的数据才有效,其他的时间里不要使用“rbuf”总线上的数据,因为新的数据可能已经改变了其中的部分数据。 异步接收机必须通过一定的机制与接收到的输入信号同步(接收端没有办法得到发送断的时钟)。这里采用如下办法。 1.为了确定新数据的到来,即检测开始位,使用几倍于波特率的采样时钟对接收到的信号进

31、行采样。 2.一旦检测到开始位,再将采样时钟频率降为已知的发送端的波特率。典型的过采样时钟频率为接收到的信号的波特率的16倍。图4.22中,将系统系统始终分频给波特率的16倍,在vhdl语言中,接受时,可以利用一个计数器,保持16个过采样频率周期后对总线进行读取。library ieee;entity uart_r isgeneric(framlen:integer:=8);-数据为framlen-1port(bclkr,resetr,rxdr:in std_logic;-rxdr数据输入脚r_ready :out std_logic;rbuf:out std_logic_vector(7 d

32、ownto 0);rxdd:out std_logic);end uart_r;architecture behave of uart_r istype states is (r_idle,r_sample_start_bit,r_sample_data_bit,r_stop);signal state:states:=r_idle;signal rxd_syn:std_logic;signal sim_rxdr:std_logic;beginpro1:process(rxdr)-用DFF把数据输入脚整形下,防止干扰beginif rxdr=0 then rxd_syn=0;else rxd_

33、syn=1;end if;rxdd=rxd_syn;end process;pro2:process(bclkr,resetr,rxd_syn)variable count :std_logic_vector(3 downto 0);variable rcnt:integer range 0 to framlen :=0;variable rbufs:std_logic_vector(7 downto 0);beginif resetr=0 thenstate=r_idle;count:=0000;rcnt:=0;r_readyif rxd_syn=0 thenstate=r_sample_s

34、tart_bit;r_ready=0;-检测到起始位后才复位r_readyrcnt:=0;count:=0000;-在这儿起始位为0已经有一个时钟时间了elsestate -检测起始位是否够时间if rxd_syn=0 thenif count0111 then-8个时钟后,再采样count:=count+1;state=r_sample_start_bit;else -起始位正确,开始采样数据位state=r_sample_data_bit;count:=0000;rcnt:=0;-开始接收数据位end if;elsestateif count=1110 then-16个时钟后再采样coun

35、t:=count+1;state=r_sample_data_bit;elseif rcnt=framlen thenstate=r_stop;count:=0000;rcnt:=0;elsestate -省略了对停止位的检测r_ready=1;-接受数据可读了rbuf=rbufs;-更新输出数据statestate statestatestatestatestatestatestate state statestate=stop;end case;end if;end if;end process;process(state)variable temp: std_logic_vector(1

36、7 downto 0);variable temp0: std_logic_vector(1 downto 0);variable temp1: std_logic_vector(7 downto 0);variable temp2: std_logic_vector(7 downto 0);begintemp(17 downto 16):=temp0;temp(15 downto 8):=temp1;temp (7 downto 0):=temp2;if state=stop thendata_out=temp;elsif state=start thendata_out=000000000

37、000000000;elsif state=one thentemp0:=data_in(1 downto 0);data_out=000000000011111001;elsif state=two thentemp1:=data_in;data_out=000000000000100100;elsif state=three thentemp2:=data_in;data_out=000000000000110000;end if;end process;end behave;程序也是利用了状态图,完成对频率控制字的接收。由于状态转换的关系为:初始时,状态为stop,只有接收到第一个FF数

38、据后,开始认为接收频率控制字,状态改为start,此时再接收一个数据,状态改为one,此时正式开始接收数据,此后接收的三组8位数据的低18位储存位频率控制字,状态改为stop。4.4.2 显示模块设计显示模块是单独为了能够调试串口接收模块而设计的。它是一个简单的动态扫描驱动LED灯程序。通过三个LED灯,能够观察出输入的相位控制字是否正确。程序如下: -数码管动态显示控制模块library ieee;entity led_sm isport(clkin,resetin:in std_logic;-时钟,复位信号输入controldata:in std_logic_vector(17 downt

39、o 0);data:out std_logic_vector(7 downto 0);-数码管段码输出com:out std_logic_vector(3 downto 0)-位码输出);end led_sm;architecture behave of led_sm iscomponent gen_div is-分频元件调用声明generic(div_param:integer:=2);-默认是4分频port(clk:in std_logic;bclk:out std_logic;resetb:in std_logic);end component;signal data_1_tmp: st

40、d_logic_vector(7 downto 0);-段码个位signal data_10_tmp: std_logic_vector(7 downto 0);-段码十位signal data_100_tmp: std_logic_vector(7 downto 0);-段码百位signal clk_sm:std_logic;-50k时钟,T=20ussignal cnt_50k:std_logic_vector(1 downto 0);-对clk_sm计数,产生4种状态begindata_100_tmp(1 downto 0)=controldata(17 downto 16);data_

41、10_tmp=controldata(15 downto 8);data_1_tmpclkin,resetb=resetin,bclk=clk_sm);gen_cnt_50k:-cnt_50k循环计数,四个状态的循环周期是20us*4=80us,即为扫描周期process(clk_sm,resetin)beginif resetin=0 thencnt_50k=00;elseif rising_edge(clk_sm) thencnt_50k com=1011;data com=1101;data com=1110;data com 0 01000 = 000 000 10.0 1 01000

42、 = 000 000 17.225 1 01000 = 800 000 19.357 1 01000 = 800 800 20.0 0 01000 = 800 800 30.0 1 01000 = 800 800 40.0 0 01000 = 800 800 50.0 1 01000 = 800 800 60.0 0 01000 = 800 800 70.0 1 01000 = 800 800 80.0 0 01000 = 800 800 90.0 1 01000 = 800 800 100.0 0 01000 = 800 800 110.0 1 01000 = 800 800 120.0 0

43、 01000 = 800 800 130.0 1 01000 = 800 800 140.0 0 01000 = 800 800 150.0 1 01000 = 800 800 160.0 0 01000 = 800 800 170.0 1 01000 = 800 800 180.0 0 01000 = 800 800 190.0 1 01000 = 800 800 200.0 0 01000 = 800 800 210.0 1 01000 = 800 800 220.0 0 01000 = 800 800 230.0 1 01000 = 800 800 240.0 0 01000 = 800 800 250.0 1 01000 = 800 800 257.25 1 01000 = A00 80

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论