NCO

摘自百度百科

(数字振荡器)

锁定

数字控制振荡器(NCO,numerically controlled oscillator)是软件无线电、直接数据频率合成器(DDS,Direct digital synthesizer)、快速傅立叶变换(FFT,Fast Fourier Transform) 等的重要组成部分,同时也是决定其性能的主要因素之一,用于产生可控的正弦波或余弦波。随着芯片集成度的提高、在信号处理、数字通信领域、调制解调、变频调速、制导控制、电力电子等方面得到越来越广泛的应用。
 
中文名
数字振荡器
外文名
numerically controlled oscillator
又    名
数字控制振荡器
简    写
NCO

数字振荡器

高精度范围

在正交数字混频器中,采用数字频率合成技术,可以将数字处理延续到正交调制之后或正交解调之前,滤波器和增益控制就可以用数字方法实现,I、Q两路也就不会存在增益的不平衡,加上数控振荡器(NCO)的低正交误差,可以使系统误差降低到数据的最低比特(LSB)的高精度范围。

调制灵活性

此外,正交数字混频器更容易与数字信号处理技术结合,使得数字调制更加灵活,进而实现软件无线电所要求的软件可更改的调制解调。 数控振荡器是正交数字混频器的核心部分,它具有频率分辨率高、频率变化速度快、相位可连续线性变化和生成的正弦P余弦信号正交特性好等特点。而且NCO的相位、幅度均已数字化,可以直接进行高精度的数字调制解调。随着数字通信的发展,传送的数据速率越来越高。如何得到一个可数控的高频载波信号是实现高速数字通信系统必须解决的问题。

数控振荡器的基本实现原理

数控振荡器的作用是产生正交的正弦和余弦样本。传统方法是采用查表法(LUT),即事先根据各个正余弦波相位计算好相位的正余弦值,并按相位角度作为地址存储该相位的正余弦值,构成一个幅度P相位转换电路(即波形存储器)。在系统时钟的控制下,由相位累加器对输入频率字不断累加,得到以该频率字为步进的数字相位,再通过相位相加模块进行初始相位偏移,得到要输出的当前相位,将该值作为取样地址值送入幅度P相位转换电路,查表获得正余弦信号样本。对于一个相位位数为n ,输出信号幅度位数为M的数控振荡器,所需查找表大小为M×2n 。为了提高数控振荡器的频率分辨率,往往需要扩大波形存储器的容量,造成存储资源的大量消耗。而且,当需要外挂RAM 来存储波形时,由于受到RAM读取速度的影响,数控振荡器的输出速率必然受到制约。因此,当需要设计高速、高精度的数控振荡器时,不宜采用查表法。

足够的精度

为了避免使用大容量存储器,可以考虑利用算法来产生正余弦样本。基于矢量旋转的CORDIC算法正好满足了这一需求,该算法主要用于计算三角函数、双曲函数及其它一些基本函数运算。它有线性的收敛域和序列的特性,只要迭代次数足够,即可保证结果有足够的精度。

运算公式

Walther JS于1971年提出了统一的CORDIC形式。假定初始向量V1(x1 ,y1)旋转角度θ后得到向量V2(x2,y2):
即:
若每次旋转的角度θ是正切值为2 的倍数,即θi=arctan(2-i),则cosθi=(1+2-2i)-1/2 。假设以δi代表矢量的旋转方向,+1表示逆时针旋转,-1表示顺时针旋转,故第i 步旋转可用下式表示:
其中:(1+2-2i)-1/2为模校正因子。对于字长一定的运算,该因子是一个常数,用K表示,以16 bits字长为例,则:
可见,迭代运算不能使幅值比例因子恒为1。为了抵消因迭代产生的比例因子的影响,可将输入数据X,Y校正后再参与运算,以避免在迭代运算中增加校正运算,降低CORDIC算法的速度。由此运算迭代式可以简化成:
公式(5)运算仅通过加法器及移位器就可以实现。此外,若用Zi表示第i次旋转时与目标角度之差, 则:
经过n次旋转后,式(5)的n次迭代可以得到以下结果:
本文介绍的数控振荡器的设计是在式(7)的基础上,给定x0=K ,y0=0,则迭代结果为:
将所需产生的角度值作为z0输入,通过式(5)、(6)的迭代运算,迭代结果输出的xn和yn就是所需要的三角函数值。
数控振荡器的FPGA实现
图1是数控振荡器的顶层电路。由图可见,频率控制字寄存器将接收到的的频率控制字送入相位累加器,相位累加器对系统时钟进行计数,每到达输入频率控制字的值即对相位进行累加,随后将累加值送入相位相加器,与相位控制字寄存器接收到的初始相位进行相加,得到当前的相位值。其中,相位累加器是决定NCO性能的一个关键模块,可以利用FPGA器件的进位链实现快速、高效的电路结构。然而,由于进位链必须位于临近的逻辑阵列块CLB和逻辑单元LC内,所以长的进位链会减少其它逻辑使用的布线资源;同时,过长的进位链也会制约整个系统速度的提高。因此,设计中采用进位链和流水线技术相结合的办法。所谓流水线技术,即把在一个时钟内要完成的逻辑操作分成几步较小的操作,并插入几个时钟周期来提高系统的数据吞吐率。采用以上做法实现的相位累加器既能保证具有较高的资源利用率,又能大幅提高系统的性能和速度。
经过上述相位的处理之后,即可获得具有所设定初始相位的一定频率的正余弦相位序列,将此序列送入基于CORDIC算法的波形发生器,最终获得两路正交的正余弦输出序列。

NCO的顶层电路结构

CORDIC迭代算法的一种最直接的实现方法是,只设计一级CORDIC运算迭代单元,然后在系统时钟的驱动下,将本级的输出作为本级的输入,通过同一级迭代完成运算。这种方法虽然很直观,但是为了将计算结果提供给下一级运算而导致占用了大量的寄存器,带来许多额外的资源消耗。而最大的缺点是运算速度较慢(需要n-1个时钟周期才能输出一个数据),不利于数据的高速实时处理。
因此在实际设计中,采用的是图2所示的由16级CORDIC运算单元组成的流水线结构,正常工作时只需1个时钟周期就能输出1个数据,为数据实现高速实时处理提供了前提。每一级实现的功能是根据式(5)进行一次迭代,移位的位数等于当前的迭代级数,加减法选择由该级中Z 的最高位(符号位)决定,得到下一级的X 、Y 和Z 的值。经过16级流水线运算后,Z的值变为0,X 和Y 的值则为初始值z0的余弦和正弦值。每一级电路结构主要包括2个移位器和3个加(减)法器,级与级之间直接相连,不需要额外的寄存器。θi 的值为arctan(2-i),可将该小数转换为二进制数后,存储于存储单元中,为每一级流水线提供查找表。若对于16级的流水线结构,则的范围是0~15。

CORDIC迭代算法的流水线结构

设计中还应该注意迭代序列所能覆盖的角度范围,若直接采用n 级迭代序列:0 ,1 ,2 ,…,n - 1 ,则迭代所能覆盖的角度范围仅有- 99.9°~99.9°。本设计采用了增加迭代次数的方法来扩大角度覆盖范围,即增加两个i = 0 的迭代,将迭代序列扩展为0,0,0,1,2,…,n-1,从而使角度覆盖范围也扩大到-π~π。

数控振荡器的仿真结果及性能分析

利用ALTERA公司的QuartusII软件,采用VHDL硬件描述语言对上述数控振荡器结构进行描述,在Modlesim上通过功能仿真,结果正确后综合出电路网表,最后将程序下载至ALTERA公司生产的Stratix器件EP1S20B780C6实现。
由于设计中采用了Stratix器件,该器件的32位加减器工作频率可以达到90MHZ以上,为产生高速的正交信号提供高速可靠的的工作时钟。考虑到NCO的工作时钟瓶颈是在相位累加器,因此可以根据具体需要缩减相位累加器的位数来提高NCO的工作时钟。
本文设计的NCO工作时钟为100MHz,相位累加器的位数为16位,输入的频率控制字为4CCCH,根据公式:
其中:Φword为输入的频率控制字;fclk为工作时钟;N为相位累加器位数,可算出NCO输出的正余弦信号的频率;fout为30MHZ ;频率分辨率Δf ≈1.5 kHz。频率分辨率说明了若通过输入频率控制字来改变输出正余弦信号的频率时,可以达到1.5 kHz 的最小步进。另外,也可以根据实际需要的频率改变输入频率控制字值。当然,NCO输出频率的上限要受到Nyquist定律的限制,即fout的最大值为fclkP2,实际设计一般不大于0.4fclk。图3为数控振荡器的部分仿真时序图

结语

研究了正交数字混频器中数控振荡器的设计与实现方法,着重分析了如何在FPGA器件中利用CORDIC迭代算法产生正余弦信号。结果表明,基于CORDIC迭代算法的数控振荡器,仅用移位寄存器加法器就可产生正余弦信号,不但省去了传统NCO庞大的存储器资源,而且保留了一般数控振荡器频率分辨率高、频率变化速度快、相位可连续线性变化、生成的正弦P余弦信号正交特性好等特点,非常适用于在正交数字混频器中进行高速高精度的数字调制解调。

NCO的更多相关文章

  1. IP之NCO仿真

    NCO仿真要用.vo仿真模型,不能用.v文件 /**************************************************************************** ...

  2. Quartus II 软件生成FFT、NCO、FIR等IP核时卡住不动的解决办法

    据网友表示,遇到这个问题时,在任务管理器中手动关闭quartus_map进程就可以了,由于我的电脑最近一直没有出问题,因此也无法验证.欢迎大家针对这个问题讨论,提出肯定.否定的说法. 另外,很多人表示 ...

  3. BPM与 SAP & Oracle EBS集成解决方案分享

    一.需求分析 SAP和Oracle EBS都是作为全球顶级的的ERP产 品,得到了众多客户的青睐.然而由于系统庞大.价格昂贵以及定位不同,客户在实施过程中经常会面临以下困惑: 1.SAP如何实现&qu ...

  4. Android Studio开发RecyclerView遇到的各种问题以及解决(一)

    以前一直在用ListView,,,最近才看RecyclerView发现好强大.RecyclerView前提是Android版本在5.0以上,本人以前用的是eclipse只支持到4.4.索性就安装一个A ...

  5. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

  6. iOS事件传递->处理->响应

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  7. NFS服务器配置文档

    Server:192.168.1.206/WindowsClient:192.168.1.208/CentOS一.搭建windows NFS服务:1.安装NFS服务器:打开"服务管理器&qu ...

  8. CSS3中border-radius、box-shadow与gradient那点事儿

    一.border-radius border-radius用于添加圆角边框,用处非常广泛. 1)一个值,代表了四个角 .radius-one { /* Safari 3-4, iOS 1-3.2, A ...

  9. java web学习总结(二十) -------------------监听器属性详解

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

随机推荐

  1. 如何用css实现"等高布局"。

    有时候为了让网页实现美观,在不知道高度的情况下,我们要用css实现等高布局效果,传统的方法, 我们可以用javascript实现,但是由于需求决定或者其他的情况下,我们只能用css实现,其方法主要是采 ...

  2. C语言程序设计II—第五周教学

    第五周教学总结(25/3-31/3) 教学内容 本周的教学内容为:第七章 数组 7.3 字符串. 课前准备 在博客园发布作业:2019春第五周作业 第四周作业讲解视频:A Programing Vid ...

  3. <转>七种测试驱动模式

    本文转载自微信公众号:中国软件测试联盟 在进行软件测试时,我们都需要一个出发点,从哪里开始分析?测试设计是基于什么?简单说,就是什么驱动测试工作的进行? 基于对软件工程.产品质量和测试的理解,归纳出以 ...

  4. VC++编写简单串口上位机程序

    VC++编写简单串口上位机程序   转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...

  5. Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心

    传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...

  6. C#的delegate简单练习

    delegate中文的意思为委托. 在很久之前,Insus.NET有写过一篇<用一个简单的例子来演绎事件委托>http://www.cnblogs.com/insus/p/3732075. ...

  7. VB6 加密解密字符串

    Public Function EnCodeStr(ByVal password As String) As String Dim il_bit, il_x, il_y, il_z, il_len, ...

  8. MongoDB的导入导出

    一:MongoDB的导出功能 mongodb提供了导入和导出的功能,分别是MongoDB下载目录下的mongoexport.exe和mongoimport.exe文件 ,具体的导出命令格式如下: mo ...

  9. 一次线上redis实例cpu占用率过高问题优化(转)

    前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然而然就把redis也挪到我 ...

  10. Flask之WSGI:Werkzeug

    WSGI 一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给浏览器: 浏览器收到HTTP响应,从HT ...