数字控制振荡器
dcxo工作原理
dcxo工作原理DCXO(Digitally Controlled Crystal Oscillator)是一种数字控制晶体振荡器,它是通过数字控制电路来调节晶体振荡频率的。
它的工作原理是利用晶体振荡器的特性,通过数字控制电路来改变晶体振荡频率,从而实现精确稳定的时钟信号输出。
DCXO的核心部件是晶体振荡器。
晶体振荡器是一种利用晶体的特性进行振荡的电子元件,其基本原理是利用晶体的压电效应和谐振效应。
晶体振荡器由晶体谐振器、放大器和反馈网络组成。
晶体谐振器是通过将晶体片与电容和电感等元件连接在一起来实现的。
当通过谐振频率的电压信号作用于晶体片时,晶体片会发生压电效应,从而使晶体片振动,产生稳定的振荡信号。
放大器将晶体振荡器产生的弱振荡信号放大,然后通过反馈网络将一部分输出信号再反馈到晶体谐振器上,使晶体振荡器保持稳定的振荡。
通过调节晶体谐振器的电容和电感等元件的数值,可以改变晶体振荡器的振荡频率。
DCXO通过数字控制电路来调节晶体振荡器的电容和电感等元件的数值,从而改变晶体振荡器的振荡频率。
数字控制电路通常由微控制器、数字逻辑电路和数字-模拟转换器(DAC)等组成。
微控制器负责接收外部输入的控制信号,然后通过数字逻辑电路进行处理,最终将处理结果转换成模拟信号输出到DAC。
DAC将模拟信号转换成电压或电流信号,然后通过控制电路调节晶体振荡器的电容和电感等元件的数值。
DCXO的工作原理可以简单概括为以下几个步骤:首先,微控制器接收外部输入的控制信号,根据控制信号的数值确定需要调节的振荡频率。
然后,数字逻辑电路根据控制信号的数值计算出相应的调节数值。
接下来,数字-模拟转换器将计算结果转换成模拟信号输出到DAC。
最后,DAC将模拟信号转换成电压或电流信号,通过控制电路调节晶体振荡器的电容和电感等元件的数值,从而改变振荡频率。
DCXO广泛应用于各种需要精确稳定时钟信号的领域,如通信系统、计算机网络、无线电设备等。
数字控制振荡器
背景知识:在实际的通信系统中,携带数字信息的信号通常是由某种类型的载波调制方式发送的,传送信号的带宽限制在以载波为中心的一个频段上,如双边带调制,或在邻近载波的频段上,如单边带调制。
无论何种调制方式,在发送端均需要一个高频载波将信息调制上去,以减小信号衰落,相干解调时在接收端也需要一个与发送端同频同相的高频载波将信息从高频上解调下来。
为了产生这个高频载波,在数字电路中是采用数控振荡器(NCO),也称为直接数字频率合成器〔DDS),它的输出频率和相位可以受人为控制,从而满足各种需要。
基本原理:下图为NCO的工作原理框图:数控振荡器一般由基准时钟(fclk)、相位字寄存器、相位累加器以及幅度/相位转换电路等部分组成。
在基准时钟的作用下,每一个时钟周期存贮在相位字寄存器里的值都由相位累加器进行累加,相位果加器的输出作为查找表的输人,从而得到相对应的幅度值。
根据奈奎斯特采样定律,输出信号的频率应小于基准时钟的1/2。
相位累加器输出(△Ф)的数值和系统的频率(fclk)决定了输出频率(fout),它门的关系如下:N是相位寄存器的位数,N值的大小决定了频率分辨率(fres ),有在这里假设,fclk=128MHz, N=32,可以计算出NCO的频率分辨率fres=0.0298Hz相位累加器是决定NCO电路性能的一个关键部分。
我们可以采用了Altera 的加法器宏功能模块形成一个32bit的累加器,它以流水线处理方式进行工作。
相位/幅度转换电路是NCO电路中的另一个关键部分,在设计中面临的主要问题就是资源的开销。
一般电路采用ROM结构,相位累加器的输出是一种数字式锯齿波,通过取它的若干位作为ROM的地址输人,而后通过查表和运算,ROM就能输出所需波形的量化数据。
在APEX器件中,ROM由EAB实现,ROM表的尺寸随着地址位数或数据位数的增加成指数递增关系,因此在满足信号性能的前提条件下,如何减少资源的开销就是一个重要的问题。
数字锁相环基础知识
数字锁相环基础知识数字锁相环(Digital Phase-Locked Loop,简称DPLL)是一种广泛应用于通信系统、数字信号处理和时钟同步等领域的数字电路技术。
它通过对输入信号进行数字化处理,实现锁定输入信号的相位和频率,从而实现信号的同步和解调。
数字锁相环的基本原理是将输入信号与本地参考信号进行比较,通过调整本地参考信号的相位和频率,使得输入信号与本地参考信号保持同步。
为了实现这一目标,数字锁相环通常由相位检测器、数字控制环路滤波器、数字控制振荡器和数字控制频率合成器等组成。
相位检测器负责测量输入信号和本地参考信号之间的相位差。
常见的相位检测器有边沿检测器和乘法器相位检测器等。
边沿检测器通过测量输入信号和本地参考信号之间的边沿时间差来计算相位差;乘法器相位检测器通过将输入信号和本地参考信号相乘,得到一个与相位差成正比的输出。
接着,数字控制环路滤波器对相位差进行滤波处理,以获得平滑的控制信号。
常见的数字控制环路滤波器有积分环路滤波器和二阶锁相环滤波器等。
积分环路滤波器通过积分相位差来获得控制信号;二阶锁相环滤波器通过对相位差进行二阶滤波,提高了系统的稳定性和抗干扰能力。
然后,数字控制振荡器根据控制信号调整本地参考信号的相位和频率。
数字控制振荡器通常由数字控制调节器和数字控制振荡器组成。
数字控制调节器根据控制信号调节数字控制振荡器的频率,从而实现对本地参考信号频率的精确控制。
数字控制频率合成器根据数字控制振荡器的输出信号生成输出信号。
数字控制频率合成器通常由数字控制振荡器和数字控制调制器组成。
数字控制振荡器通过输出参考信号的频率来控制数字控制调制器的频率,从而实现对输出信号频率的精确合成。
数字锁相环具有很多优点。
首先,它可以实现高精度的相位和频率锁定,对于要求高精度同步的应用非常有用。
其次,数字锁相环具有较高的稳定性和抗干扰能力,可以有效抑制噪声和干扰信号。
此外,数字锁相环还具有灵活性强、可编程性好等特点,可以根据不同的应用需求进行灵活配置和调整。
9~11GHz数字控制LC振荡器
r e a l i z e d a n d t h e p h a s e n o i s e a t 9 . 3 8 GHz i s一 1 1 1 . 0 2 d B c / Hz a t 1 M Hz o f f s e t .
Ke y wor ds: a l l di g i t a l s y nt h e s i z e r; o s c i l l a t o r wi t h c o m pl e me nt ar y s t r u c t u r e; pha s e no i s e; f r e q ue nc y r e s o l u t i o n
( S t a t e Ke y L a b o r a t o r y o f A S I C&S y s t e m, F u d a n U n i v e r s i t y, S h a n g h a i ,2 0 1 2 0 3 , C HN )
Ab s t r a c t :A d i g i t a l — c o n t r o l l e d LC o s c i l l a t o r i s i mp l e me n t e d i n TS MC 6 5 n m CM OS p r o c e s s , wh i c h i s u s e d i n a l l d i g i t a l f r e q u e n c y s y n t h e s i z e r wi t h a n o u t p u t f r e q u e n c y r a n g e f r o m 8 . 9 5 GHz t o 1 1 . O 2 GH z .I n o r d e r t o r e d u c e t h e p h a s e n o i s e,t h e c o mp l e me n t a r y s t r u c t u r e wi t h t a i l i n d u c — t o r s i s u s e d .Th e c a p a c i t o r b a n k s a r e d i v i d e d i n t o t h r e e p a r t s i n o r d e r t o c o o r d i n a t e wi t h t h e t h r e e s t e p s o f f r e q u e n c y l o c k i n g p r o c e s s o f t h e s y n t h e s i z e r . Un d e r a s u p p l y o f 1 V ,t h e p o we r c o n — s u mp t i o n i s 3 . 5 3 mW .Ac c o r d i n g t o t h e me a s u r e me n t r e s u l t s ,a f r e q u e n c y r e s o l u t i o n o f 4 0 k Hz i s
数字高频调谐器原理与结构分析
数字高频调谐器原理与结构分析数字高频调谐器是一种用于调节高频信号频率的装置,它在无线通信、雷达、卫星通信等领域起着重要的作用。
本文将详细介绍数字高频调谐器的原理和结构,并分析其工作过程。
一、原理数字高频调谐器的原理基于频率合成和滤波技术。
其主要功能是将输入的高频信号调整到指定的频率范围内,并滤除不需要的频率分量。
其原理主要包括以下几个方面:1. 数字频率合成数字高频调谐器采用数字信号处理技术,通过数字频率合成器将输入的高频信号调整到目标频率范围内。
数字频率合成器是由相位锁定环路(PLL)和数字控制振荡器(DCO)组成的。
相位锁定环路用于锁定输入信号的相位,而数字控制振荡器则根据相位锁定环路的输出生成目标频率的高频信号。
2. 数字滤波数字高频调谐器还需要进行滤波处理,以滤除不需要的频率分量。
滤波器通常采用数字滤波器,其主要功能是在目标频率范围内增强信号的幅度,并在其他频率范围内削弱信号的幅度。
数字滤波器可以通过滤波算法实现,常用的算法包括有限脉冲响应(FIR)滤波器和无限脉冲响应(IIR)滤波器。
3. 数字控制数字高频调谐器还需要进行数字控制,以实现对频率和滤波参数的调节。
数字控制可以通过微处理器或可编程逻辑器件实现,通过调节相位锁定环路和数字滤波器的参数,可以实现对输入信号的精确调谐。
二、结构数字高频调谐器的结构主要包括输入端、数字频率合成器、数字滤波器和输出端。
下面将对每个部分进行详细介绍。
1. 输入端输入端主要用于接收外部的高频信号。
它通常包括天线、前置放大器和滤波器。
天线用于接收无线信号,并将其转换为电信号。
前置放大器用于放大电信号的幅度,以提高信号的强度。
滤波器用于滤除不需要的频率分量,以减少噪声和干扰。
2. 数字频率合成器数字频率合成器是数字高频调谐器的核心部分。
它由相位锁定环路和数字控制振荡器组成。
相位锁定环路用于锁定输入信号的相位,以实现相位同步。
数字控制振荡器根据相位锁定环路的输出生成目标频率的高频信号。
数字控制振荡器NCO
本文设计的 NCO 工作时钟为 100MHz,相位累加器的位数为 16 位,输入的频率控制字为 4CCCH,根据公式:
因此在实际设计中,采用的是图 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。
数控振荡器的 FPGA 实现
图 1 是数控振荡器的顶层电路。由图可见,频率控制字寄存器将接收到的的频率控制字 送入相位累加器,相位累加器对系统时钟进行计数,每到达输入频率控制字的值即对相位进 行累加,随后将累加值送入相位相加器,与相位控制字寄存器接收到的初始相位进行相加, 得到当前的相位值。其中,相位累加器是决定 NCO 性能的一个关键模块,可以利用 FPGA 器 件的进位链实现快速、高效的电路结构。然而,由于进位链必须位于临近的逻辑阵列块 CLB 和逻辑单元 LC 内,所以长的进位链会减少其它逻辑使用的布线资源;同时,过长的进位链 也会制约整个系统速度的提高。因此,设计中采用进位链和流水线技术相结合的办法。所谓 流水线技术,即把在一个时钟内要完成的逻辑操作分成几步较小的操作,并插入几个时钟周 期来提高系统的数据吞吐率。采用以上做法实现的相位累加器既能保证具有较高的资源利用 率,又能大幅提高系统的性能和速度。
CMOS 数控振荡器设计
CMOS 数控振荡器设计1 引言随着数字信号处理数字信号处理越来越广泛的应用,数字锁相环DPLL(Digital Phase Lock Loop)在现代集成电路设计中也越来越普遍,特别是在数字信号处理器DSP 和微处理器这类高性能数字电路应用中,数字锁相环更是一种必不可少的电路。
与传统的模拟锁相环(Analog Phase-Locked Loop)相比,由于数字锁相环较少采用高阻值电阻、电容以及电感等非线性器件,可以采用与高速数字逻辑电路相兼容的制造工艺来设计和制造,也更加容易在数字系统中应用。
一个典型的数字锁相环结构,数控数控振荡器振荡器DCO(Digital-Controlled Oscillator)是其中最关键和核心的部分。
数控振荡器DCO 输出了可变频率的振荡波形,决定了整个锁相环的噪声性能和功耗。
数字时间转换器(Time - to - DigitalConverter)输出了参考时钟和反馈来的输出时钟之间的相位差,一个数字环形滤波器(Digital LoopFilter)代替了模拟环形滤波器来控制DCO,由与参考时钟的相位差来控制DCO 输出或高或低的振荡频率,输出振荡信号由负反馈送到数字时间转换器,使相位差减小,最终让输出信号频率与参考时钟频率一致,即达到相位锁定。
整个DCO 因此不再需要含有电容或电感,同时也减少漏电流和电源噪音的问题。
图1 数字锁相环的基本结构2 电路结构和原理数控振荡器有多种实现结构,本文设计了一种完全采用静态CMOSCMOS 逻辑电路的DCO 结构,该DCO基于由CMOS 反相器构成的环形振荡器,其电路结构。
图2 电路结构图,每一级环形振荡器均是5 个CMOS反相器串联,并构成闭环负反馈回路,每个反相器的输出也与下一级环形振荡器对应的反相器输出相连。
根据巴克豪森准则:振荡器要产生振荡,那么环路增益必须大于等于一且总相移有360°。
因此环路中进行反相的次数必须是奇数,三个以上的奇数个CMOS 反相器串联闭环回路,在一个微小的激励下都能够产生振荡。
DDS原理及仿真
DDS原理及仿真DDS(Direct Digital Synthesis)直接数字合成是一种通过数字信号处理器(DSP)或者微处理器实现频率合成的方法,它可以生成高精度、稳定和可调节的连续频率信号。
DDS技术是一种广泛应用于无线通信、雷达、测量仪器等领域的频率合成技术。
本文将详细介绍DDS的原理及仿真方法。
DDS是通过以下几个基本组成部分来实现频率合成的:1. 相位累加器(Phase Accumulator):相位累加器是DDS的核心组件之一,它用于产生一个连续变化的相位信号。
相位累加器将一个初始相位值作为输入,并在每个时钟周期内按照设定的相位增量进行累加。
相位累加器的输出用于更新、控制数字控制振荡器(Digital Control Oscillator,DCO)的输出频率。
2. 数字控制振荡器(Digital Control Oscillator):DCO是DDS的另一个核心组件,它根据相位累加器的输出计算并产生一个数字化的频率信号。
DCO的输出被转换成模拟信号后为DDS系统提供频率源。
3. 相位加法器(Phase Adder):相位加法器主要用于将相位累加器输出的相位信号和相位修正信号进行相加,从而实现频率的调制或增强。
4. 数字控制字寄存器(Digital Control Word Register):数字控制字寄存器用于存储并传输DDS的相位增量值。
通过改变相位增量值,可以调节DDS系统的输出频率。
DDS仿真方法:DDS系统的设计和验证通常需要借助仿真工具来进行,以确保系统性能和可靠性。
下面介绍一种常用的DDS仿真方法。
1. 建立模型:首先,根据DDS系统的硬件规格和设计要求,建立一个仿真模型。
这个模型可以使用MATLAB、Simulink等建模软件来搭建,通过连线、添加模块等操作来构建一个完整的DDS系统。
2.添加输入信号:为DDS系统添加一个输入信号,该输入信号包含频率、幅度等参数,代表DDS的控制信号。
实验五 数字振荡器实验
实验五 数字振荡器实验一、实验目的本实验属于综合性实验,在项目开发中,我们经常要用产生某一频率的正弦振荡信号,比如在电话通信中,用两个不同频率的正弦信号的叠加来代表按键。
正弦信号的生成方法有三种,计算法、查表法和数字振荡器。
用计算法求正弦波的离散序列值程序设计容易,但实际应用时会占用计算时间,使系统运行速度变慢。
查表法是先通过matlab 将正弦波的序列值计算出来并寄存在存储器中,运行时只要按顺序和一定的速度取出便可。
这种方法要占用较多的存储空间,但是速度快。
第三种方法是利用数字振荡器来实现不同频率信号的叠加,这种方法通过迭代的方法计算出不同频率的正弦信号序列,结构简单,运算速度快,节省内存,因此在DSP 实际应用中我们选择这种方法。
数字振荡器的本质是,使用一个IIR (Infinite Impulse Response )滤波器,通过把它的极点放在单位圆上面来产生振荡。
利用正弦波sinx 的指数形式)(21sin jx jxe e j x --=可以得到正弦序列x(n)的Z 变换为)(21)sin(][jnwT jnwTe e j T n n x --==ϖ110011[()]()(X )2z 2jnwT jnwT n jwT n jwT nn n e e z e z e z j j ∞∞-----==⎡⎤-=-⎣⎦=∑∑() 12jwT jwT z z j z e z e -⎡⎤=-⎢⎥--⎣⎦222122cos()1jwT jwT z ze z ze j z z wT -⎡⎤--+=⎢⎥-+⎣⎦22sin()2cos()1z wT Czz z wT z Az B==-+--,此式在|z|>1时成立,且)sin(,1),cos(2wT C B wT A =-==。
根据Z 变换的基本原理和性质,序列x[n]及其Z 变换X (z )之间存在一一对应的关系,即对于给定的X (z ),可以通过反Z 变换,唯一地确定x[n]。
数字下变频中基于CORDIC算法的NCO设计
数字下变频中基于CORDIC算法的NCO设计刘刚;蒋伟进;董胡;钟新跃【摘要】在数字下变频中传统数字控制振荡器(Numerically Controlled Oscillator,NCO)模块都是基于查找表结构的,该结构在FPGA内部实现需要占用大量ROM资源,针对这一问题,提出采用坐标旋转数字计算(Coordinate Rotation DigitalComputer,CORDIC)算法进行NCO设计,相比传统的NCO设计,该方法具有输出信号频谱纯度高、能够直接混频而不需要乘法器等优点.设计中采用变象限映射方法解决CORDIC算法无法全周期覆盖的问题,采用流水线技术解决串行迭代带来难以实时输出的问题.经过Modelsim仿真分析,实际输出值与理论值之间的相对误差在10-4~ 10-5数量级范围内,满足数字下变频中NCO的性能需要.【期刊名称】《无线电工程》【年(卷),期】2017(047)012【总页数】4页(P71-74)【关键词】数字下变频;坐标旋转数字计算方法;流水线;数字控制振荡器;现场可编程门阵列【作者】刘刚;蒋伟进;董胡;钟新跃【作者单位】长沙师范学院信息与工程系,湖南长沙410100;湖南商学院计算机与信息工程学院,湖南长沙410205;长沙师范学院信息与工程系,湖南长沙410100;长沙师范学院信息与工程系,湖南长沙410100【正文语种】中文【中图分类】TN911在软件无线电接收机中,数字下变频器是把ADC数字化后的高速数字中频信号变为低速的基带信号,便于后续的相关处理。
数字下变频器在这里起到前端ADC和后端通用DSP器件之间的桥梁作用,其性能的优劣会对整个软件无线电系统的性能产生直接的影响[1]。
因此,数字下变频技术成为软件无线电接收机的关键技术之一,成为制约软件无线电性能的重要器件之一[1]。
文献[2-3]中采用基于多相滤波结构来设计实现数字下变频器,虽然在一定程度上能够节省FPGA内部资源和实现高速数据流下数字下变频,但在性能上还有较大的提升空间,因为只有改进和优化数字下变频中NCO这一核心模块才能大幅度提高数字下变频的性能。
dds的原理
dds的原理DDS的原理。
DDS(Direct Digital Synthesis)是一种用于产生数字信号的技术,它通过数字方式直接生成波形,而不需要使用传统的模拟信号发生器。
DDS的原理基于数字信号处理技术,其核心是数字控制的相位累加器和数字控制的振荡器。
下面将详细介绍DDS的原理。
首先,DDS的核心是相位累加器。
相位累加器是一个计数器,它以一定的增量不断累加,当累加值超过一个周期的时候,相位累加器会重新开始计数。
相位累加器的输出被用作振荡器的相位控制输入,通过改变相位累加器的累加速度,可以改变振荡器的输出频率。
这样,我们就可以通过控制相位累加器来实现对输出波形频率的精确控制。
其次,DDS的振荡器是一个数字控制的振荡器,它接受相位累加器的输出作为相位控制输入,并根据相位控制输入来产生特定频率的输出波形。
振荡器可以采用不同的数字信号处理技术,比如查表法、插值法等,来实现高精度、低失真的波形生成。
另外,DDS还包括数字到模拟转换器(DAC),它将数字振荡器的输出转换为模拟信号。
DAC的性能直接影响了DDS系统的输出质量,因此需要选择高性能的DAC芯片,并进行精确的校准和补偿,以保证输出信号的准确性和稳定性。
总的来说,DDS的原理是通过数字控制相位累加器和数字控制振荡器来实现对输出波形频率的精确控制,同时利用高性能的DAC将数字信号转换为模拟信号。
相比传统的模拟信号发生器,DDS技术具有频率分辨率高、频率稳定性好、调频速度快、波形灵活可编程等优点,因此在通信、雷达、医疗等领域得到了广泛的应用。
综上所述,DDS技术的原理基于数字信号处理,通过精密的相位累加器和数字控制振荡器实现对输出波形频率的精确控制,是一种高性能、灵活可编程的信号发生技术。
希望本文能够帮助读者更好地理解DDS的原理和应用。
msp430基础知识
5:完善的中断服务功能。
6:4种计数功能的选择
7:8种输出计数功能的选择。
8:支持多种时序控制
9:DMA使能
TAR 16位计数器
1:修改Timer _A:当计数时钟不是MLCK时,写入应该计数器在计数器停止计数时,因为它与CPU不同步,可能引起时间的竞争。
2:增计数模式
捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器。因为CCR0为16位寄存器,所以该模式适用于定时周期小于65536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。
LFXT1CLK:低频时钟源
XT2CLK:高频时钟源
DCOCLK:数字控制RC振荡器
时钟发生器的原理说明
问题的提出:
1: 高频,以便对系统硬件请求和事件作出快速的响应。
2:低频 以便将电流消耗降至最小
{
;
}
基本定时器
MSP430具有基本定时器(Basic Timer1),Basic Timer1经常用在低功耗应用中,它的工作目的就是支持软件和外围模块工作在低频率、低功耗条件下。Basic Timer1通过对SMCLK 和ACLK进行分频,向其他外围模块提供低频率控制信号。Basic Timer1非常适合于周期性地产生中断
。(F14系列没有该定时器)
Timer_A 的特性
1:输入时钟可以有多种选择,可以是慢始终、快时钟以及外部时钟。
2:没有自动重装时间常数功能,但产生的定时脉冲或PWM(脉宽调制)信号没有软件带来的误差。
3:不仅能捕获外部事件发生的时间还可以锁定其发生时的高低电平。
mspg2231中文资料
MSP430G2x31-Q1MSP430G2x21-Q1 ZHCS351A–NOVEMBER2011–REVISED DECEMBER2011混合信号微控制器特性•符合汽车应用要求•具有2个捕捉/比较寄存器的16位Timer_A•低电源电压范围:1.8V至3.6V•支持SPI和I2C的通用串行接口(请见表1)•超低功耗•欠压检测器–运行模式:220μA(在1MHz频率和2.2V电•带内部基准、采样与保持、和自动扫描功能的10压条件下)位200每秒千次采样(ksps)模数(A/D)转换器(请见表1)–待机模式:0.5μA•串行板上编程,–关闭模式(RAM保持):0.1μA无需外部编程电压,•5种节能模式利用安全熔丝实现可编程代码保护•可在不到1μs的时间里超快速地从待机模式唤醒•具有两线制(Spy-Bi-Wire)接口的片上仿真逻辑电•16位精简指令集(RISC)架构,62.5ns指令周期时路间•系列产品成员详细信息,请见表1和表2•基本时钟模块配置•采用14引脚塑料小外形尺寸薄型封装–具有一个校准频率并高达16MHz的内部频率(TSSOP)(PW)和16引脚四方扁平无引线(QFN)封–内部极低功率低频(LF)振荡器装(RSA)–32kHz晶振•完整的模块说明,请见《MSP430x2xx系列产品用–外部数字时钟源户指南》()说明德州仪器(TI)MSP430系列超低功耗微控制器包含多种器件,它们特有面向多种应用的不同外设集。
这种架构与5种低功耗模式相组合,专为在便携式测量应用中延长电池使用寿命而优化。
该器件具有一个强大的16位RISC CPU,16位寄存器和有助于获得最大编码效率的常数发生器。
数字控制振荡器(DCO)可在不到1µs的时间里完成从低功耗模式至运行模式的唤醒。
MSP430G2x21/G2x31系列产品是一款超低功率混合信号微控制器,此微控制器装有一个内置的16位定时器和10个I/O引脚。
数字控制振荡器NCO
设计中还应该注意迭代序列所能覆盖的角度范围,若直接采用 n 级迭代序列:0 ,1 , 2 ,…,n - 1 ,则迭代所能覆盖的角度范围仅有- 99.9°~99.9°。本设计采用了增加迭 代次数的方法来扩大角度覆盖范围,即增加两个 i = 0 的迭代,将迭代序列扩展为 0,0,0, 1,2,…,n-1,从而使角度覆盖范围也扩大到-π~π。
结语
研究了正交数字混频器中数控振荡器的设计与实现方法,着重分析了如何在 FPGA 器件 中利用 CORDIC 迭代算法产生正余弦信号。结果表明,基于 CORDIC 迭代算法的数控振荡器, 仅用移位寄存器和加法器就可产生正余弦信号,不但省去了传统 NCO 庞大的存储器资源,而 且保留了一般数控振荡器频率分辨率高、频率变化速度快、相位可连续线性变化、生成的正 弦 P 余弦信号正交特性好等特点,非常适用于在正交数字混频器中进行高速高精度的数字调 制解调。
经过上述相位的处理之后,即可获得具有所设定初始相位的一定频率的正余弦相位序 列,将此序列送入基于 CORDIC 算法的波形发生器,最终获得两路正交的正余弦输出序列。
NCO 的顶层电路结构
CORDIC 迭代算法的一种最直接的实现方法是,只设计一级 CORDIC 运算迭代单元,然后 在系统时钟的驱动下,将本级的输出作为本级的输入,通过同一级迭代完成运算。这种方法 虽然很直观,但是为了将计算结果提供给下一级运算而导致占用了大量的寄存器,带来许多 额外的资源消耗。而最大的缺点是运算速度较慢(需要 n-1 个时钟周期才能输出一个数据), 不利于数据的高速实时处理。
数控振荡器的基本实现原理
数控振荡器的作用是产生正交的正弦和余弦样本。传统方法是采用查表法(LUT),即事 先根据各个正余弦波相位计算好相位的正余弦值,并按相位角度作为地址存储该相位的正余 弦值,构成一个幅度 P 相位转换电路(即波形存储器)。在系统时钟的控制下,由相位累加器 对输入频率字不断累加,得到以该频率字为步进的数字相位,再通过相位相加模块进行初始 相位偏移,得到要输出的当前相位,将该值作为取样地址值送入幅度 P 相位转换电路,查表 获得正余弦信号样本。对于一个相位位数为 n ,输出信号幅度位数为 M 的数控振荡器,所 需查找表大小为 M×2n 。为了提高数控振荡器的频率分辨率,往往需要扩大波形存储器的 容量,造成存储资源的大量消耗。而且,当需要外挂 RAM 来存储波形时,由于受到 RAM 读 取速度的影响,数控振荡器的输出速率必然受到制约。因此,当需要设计高速、高精度的数 控振荡器时,不宜采用查表法。
数字控制振荡器(NCO)的FPGA实现
数字控制振荡器(NCO)的FPGA实现
NCO(N umerically Controlled Oscillator)是用于产生一个理想的、数字可控的正弦或余弦波的数字控制式振荡器,其实现方法有实时计算法和查表法等多种。
实时计算法的正弦波样本以实时计算产生,该方法因其计算需要耗费很多时间,因而只能产生较低频率的正弦波,而且存在计算精度与计算时间的矛盾。
由于在需要产生高速的正交信号时,实时计算法将无法实现。
因此,在实际应用中一般采用最有效、最简单的查表法,即事先根据各个NCO正弦波的相位计算好相位的正弦值,并按相位作为地址信息存储该相位的正弦值数据。
1 NCO的基本原理
在通过相位累加产生地址信息时,通常需要输出当前时刻的相位值所对应的正弦值,即以参考频率源对相位进行等可控间隔采样。
众所周知,理想的正弦波信号S(t)可以表示成:。
nco工作原理
nco工作原理NCO工作原理NCO(Numerically Controlled Oscillator)是一种数字控制振荡器,它可以通过数字信号来控制频率和相位。
在通信系统、雷达系统、无线电系统等领域中,NCO被广泛应用于频率合成、数字调制解调等方面。
本文将详细介绍NCO的工作原理。
一、NCO的基本结构NCO由两个主要部分组成:数字控制器和振荡器。
其中,数字控制器负责接收输入信号,并将其转换为相应的数字控制信号,然后将这些信号传递给振荡器。
振荡器则根据这些数字控制信号产生一个特定的频率和相位的输出信号。
二、数字控制器1. 数字输入NCO通常接收一个或多个32位宽度的二进制输入数据流。
这些数据可以是任何形式的数据,如音频、视频或其他类型的数据。
2. 相位累加器相位累加器是NCO中最重要的部分之一。
它负责计算当前输出信号的相位,并根据输入数据流中每个样本所代表的相位变化量进行更新。
具体来说,在每个时钟周期内,相位累加器会将其当前值与输入数据流中下一个样本值进行加法运算,从而计算出下一个输出信号的相位。
相位累加器的初始值可以是任何值,通常设置为0。
3. 数字控制信号生成NCO的数字控制器还负责生成一系列数字控制信号,这些信号用于控制振荡器的频率和相位。
具体来说,数字控制信号可以分为以下几种类型:(1)频率控制信号频率控制信号用于调节振荡器输出信号的频率。
在每个时钟周期内,数字控制器会根据输入数据流中每个样本所代表的频率变化量来更新频率控制信号。
(2)相位调节信号相位调节信号用于调节振荡器输出信号的相位。
在每个时钟周期内,数字控制器会根据输入数据流中每个样本所代表的相位变化量来更新相位调节信号。
4. 数字控制信号传输数字控制信号需要通过某种方式传输到振荡器中。
常见的传输方式有以下两种:(1)并行传输:将所有数字控制信号同时传输到振荡器中。
(2)串行传输:将所有数字控制信号按照一定顺序依次传输到振荡器中。
数字控制振荡器工作原理
数字控制振荡器工作原理一、数字控制振荡器概述要了解数字控制振荡器的工作原理,首先需要对其进行一个概述。
数字控制振荡器(Digital Controlled Oscillator,简称DCO)是一种能够产生特定频率的电路。
它是由数字控制系统和振荡电路组成的,可以通过调整数字控制系统中的参数来改变输出的频率。
二、数字控制振荡器的组成数字控制振荡器主要由以下几个组成部分构成:数字控制系统、振荡电路以及输出接口。
2.1 数字控制系统数字控制系统是数字控制振荡器的核心部分,它负责接收外部输入的控制信号,并根据控制信号的数值来调整振荡电路中的参数,从而改变输出的频率。
数字控制系统通常由微处理器和相关的控制逻辑电路组成。
2.2 振荡电路振荡电路是数字控制振荡器中的另一个重要部分,它负责根据输入的参数来产生特定频率的信号。
振荡电路通常由振荡器和频率调整电路组成。
振荡器一般采用LC振荡器或者晶体振荡器,它们可以产生稳定的振荡信号。
频率调整电路可以根据输入的参数对振荡信号的频率进行调整。
2.3 输出接口输出接口用于将数字控制振荡器产生的信号输出到外部设备。
它通常包括一个放大电路和一个输出端口。
放大电路可以增大振荡器产生的信号的幅度,使其可以驱动外部设备。
输出端口一般采用标准的数电接口,如TTL或CMOS。
三、数字控制振荡器的工作原理数字控制振荡器的工作原理可以简单描述为以下几个步骤:3.1 输入控制信号数字控制振荡器的工作需要外部输入一个控制信号。
这个控制信号可以是一个数字量,也可以是一个模拟量。
它可以通过按键、旋转编码器或者外部通信接口输入。
3.2 数字控制系统处理数字控制系统接收到输入的控制信号后,根据设定的算法和参数进行处理。
处理的结果通常是一个数字量,用来控制振荡电路的频率。
3.3 振荡电路产生振荡信号振荡电路接收到数字控制系统输出的控制信号后,根据信号的数值来调整振荡器的频率。
当频率达到设定值时,振荡电路就开始产生稳定的振荡信号。
ltc6904 范例
ltc6904 范例LTC6904是一款高性能的数字控制电压控制振荡器(DCVCO),由ADI (安富利)公司生产。
它可以通过I2C接口进行配置和控制,提供了高精度的频率合成功能。
LTC6904的范例应用广泛,本文将介绍其工作原理以及在实际应用中的一些案例。
我们来了解一下LTC6904的基本原理。
它是一种基于电容的振荡器,通过改变电容的充放电时间来调节输出频率。
LTC6904内部有一个电容阵列,可以通过配置寄存器来选择不同的电容组合,进而实现不同的频率输出。
此外,LTC6904还可以通过I2C接口调节电压控制输入(VCOIN)来进一步微调频率。
LTC6904的工作电压范围为2.7V至5.5V,输出频率范围为0.1Hz至20MHz。
它具有非常低的频率漂移和相位噪声,能够提供高度稳定的频率输出。
此外,LTC6904还提供了多种工作模式,包括连续振荡模式、单次振荡模式和脉冲振荡模式,可以满足不同应用的需求。
在实际应用中,LTC6904可以广泛应用于时钟生成、频率合成、数字信号处理等领域。
下面我们将介绍一些具体的应用案例。
首先是时钟生成。
在很多系统中,需要一个稳定的时钟信号来同步各个模块的工作。
LTC6904可以提供高精度的时钟信号,且可以通过I2C接口实时调节频率。
这使得它在通信系统、数据采集系统等领域中得到广泛应用。
其次是频率合成。
频率合成是将多个不同频率的信号合成为一个特定频率的信号。
LTC6904可以通过调节电容组合和VCOIN输入,实现精确的频率合成。
这在无线通信系统、雷达系统等需要频率合成的应用中非常常见。
LTC6904还可以用于数字信号处理。
在数字信号处理中,需要对信号进行数字化、滤波、解调等处理。
LTC6904可以提供稳定的时钟信号,为数字信号处理提供精确的时间基准。
这在音频处理、图像处理等领域中非常重要。
LTC6904是一款功能强大的数字控制振荡器,具有高精度、稳定性好的特点。
它可以通过I2C接口进行配置和控制,广泛应用于时钟生成、频率合成、数字信号处理等领域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//************************************************************ NCO//************************************************************ LIBRARY lpm;USE lpm.lpm_components.ALL;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;Entity nco ISGENERIC(WIDTH :INTEGER:=28);PORT(fcw :IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);sin,cos,acc :OUT STD_LOGIC_VECTOR(7 DOWNTO 0);clk :IN STD_LOGIC);END nco;Architecture rtl OF nco ISSIGNAL s,acc28: STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0); SIGNAL msbs : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL sin_cos: STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINadd1:lpm_add_subGENERIC MAP(LPM_WIDTH=>WIDTH,LPM_REPRESENTATION=>"SIGNED",LPM_DIRECTION=>"ADD",LPM_PIPELINE=>0)PORT MAP(dataa=>fcw,datab=>acc28,result=>s);reg1:lpm_ffGENERIC MAP(LPM_WIDTH=>WIDTH)PORT MAP(data=>s,q=>acc28,clock=>clk);select1:PROCESS(acc28)V ARIABLE i:INTEGER;BEGINFOR i IN 7 DOWNTO 0 LOOPmsbs(i)<=acc28(27-7+i);END LOOP;END PROCESS select1;acc<=msbs;rom1:lpm_romGENERIC MAP(LPM_WIDTH=>16,LPM_WIDTHAD=>8,PORT MAP(address=>msbs,inclock=>clk,outclock=>clk,q=>sin_cos);select2:PROCESS(sin_cos)V ARIABLE i:INTEGER;BEGINFOR i IN 7 DOWNTO 0 LOOPcos(i)<=sin_cos (15-7+i);sin(i) <=sin_cos (i);END LOOP;END PROCESS select2;END rtl;//************************************************************ NCO+MIXER//************************************************************ LIBRARY lpm;USE lpm.lpm_components.ALL;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;Entity system ISGENERIC(WIDTHA :INTEGER:=12;WIDTHB :INTEGER:=8;WIDTHP :INTEGER:=20);PORT(clock :IN STD_LOGIC;ADout :IN STD_LOGIC_VECTOR(11 DOWNTO 0);Phase_in :IN STD_LOGIC_VECTOR(27 DOWNTO 0);datai,dataq :OUT STD_LOGIC_VECTOR(19 DOWNTO 0));END system;Architecture rtl OF system ISCOMPONENT ncoPORT(fcw :IN STD_LOGIC_VECTOR(27 DOWNTO 0);sin,cos,acc :OUT STD_LOGIC_VECTOR(7 DOWNTO 0);clk :IN STD_LOGIC);END COMPONENT;SIGNAL cosout,sinout: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL mixer_i,mixer_q: STD_LOGIC_VECTOR(19 DOWNTO 0); BEGINu0:nco PORT MAP(fcw=>Phase_in,clk=>clock,sin=>sinout,cos=>cosout);mul1:lpm_multLPM_WIDTHB=>WIDTHB,LPM_WIDTHP=>WIDTHP,LPM_WIDTHS=>WIDTHP,LPM_REPRESENTATION=>"SIGNED")PORT MAP(dataa=>ADout,datab=>cosout,result=>mixer_i);mul2:lpm_multGENERIC MAP(LPM_WIDTHA=>WIDTHA,LPM_WIDTHB=>WIDTHB,LPM_WIDTHP=>WIDTHP,LPM_WIDTHS=>WIDTHP,LPM_REPRESENTATION=>"SIGNED")PORT MAP(dataa=>ADout,datab=>sinout,result=>mixer_q);PROCESS(clock)BEGINdatai<=mixer_i;dataq<=mixer_q;End PROCESS;//************************************************************GAIN ADJUSTING//************************************************************library ieee;use ieee.std_logic_1164.all;entity shiftadj isport(Din :in std_logic_vector(11 downto 0);SG1 :in std_logic_vector(1 downto 0);Dout:out std_logic_vector(11 downto 0));end shiftadj;architecture shift_arch of shiftadj isbeginprocess(Din)variable shiftB: std_logic_vector(1 downto 0);variable signbit: std_logic;beginshiftB:=SG1;signbit:=Din(Din'high);case shiftB iswhen "00"=> Dout<=signbit&signbit&Din(11 downto 2);when "01"=> Dout<=signbit&signbit&signbit&signbit&Din(11when"10"=>Dout<=signbit&signbit&signbit&signbit&signbit&signbit&signbit&signbit&Din(11 downto 8);whenothers=>Dout<=signbit&signbit&signbit&signbit&signbit&signbit&signbit&signbit&signbit&signbit&signbit&si gnbit;end case;end process;end shift_arch;END rtl;//************************************************************CIC-------------DIVIDE_M//************************************************************ library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity divm isport (clk:in std_logic;M:in std_logic_vector(3 downto 0);q:out std_logic);end divm;architecture rtl of divm issignal ca:std_logic;beginprocess(clk)variable qm:integer;beginif(clk'EVENT AND clk='1')thenif(qm=CONV_INTEGER(M))thenqm:=0;ca<='0';elsif(qm=CONV_INTEGER(M)-1)thenca<='1';qm:=qm+1;elseqm:=qm+1;ca<='0';end if;end if;q<=ca;end process;//************************************************************ CIC-------------DECIMATER (M=2~16)//************************************************************ PACKAGE n_bit_int ISSUBTYPE word28 IS INTEGER RANGE 0 TO 2**28-1;END n_bit_int;LIBRARY work;USE work.n_bit_int.ALL;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY cic4secdec ISPORT ( clk : IN STD_LOGIC;x_in: IN STD_LOGIC_VECTOR(11 DOWNTO 0);div_M:IN STD_LOGIC_VECTOR(3 DOWNTO 0);y_out:OUT STD_LOGIC_VECTOR(11 DOWNTO 0));END cic4secdec;ARCHITECTURE flex OF cic4secdec IScomponent divmport (clk:in std_logic;M:in std_logic_vector(3 downto 0);q:out std_logic);end component;SIGNAL clk2 : STD_LOGIC;SIGNAL x : STD_LOGIC_VECTOR(11 DOWNTO 0);SIGNAL sxtx : STD_LOGIC_VECTOR(27 DOWNTO 0);SIGNAL i0, i1 , i2,i3 : word28;SIGNAL i2d1, c1, c0 : word28;SIGNAL c1d1,c2d1, c3d1, c2 , c3,c4: word28;BEGINu0:divm PORT MAP(clk=>clk,M=>div_M,q=>clk2);sxt: PROCESS (x)BEGINsxtx(11 DOWNTO 0) <= x;FOR k IN 27 DOWNTO 12 LOOPsxtx(k) <=x(x'high);END LOOP;END PROCESS sxt;Int: PROCESSWAIT UNTIL clk = '1';x <= x_in;i0 <= i0 + CONV_INTEGER(sxtx);i1 <= i1 + i0;i2 <= i2 + i1;i3 <= i3 + i2;end PROCESS Int;Comb: PROCESSBEGINWAIT UNTIL clk2 = '1';c0<=i3;i2d1 <= c0;c1 <=c0-i2d1;c1d1 <=c1;c2 <=c1-c1d1;c2d1 <=c2;c3 <=c2-c2d1;c3d1 <=c3;c4 <=c3-c3d1;END PROCESS Comb;y_out<= CONV_STD_LOGIC_VECTOR(c4/2**16,12);END flex;//************************************************************ FIR---------------filter_state controlling//************************************************************ LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY controller2 ISPORT(CLK: IN STD_LOGIC;clear :OUT STD_LOGIC;plsr_load: OUT STD_LOGIC;add_sub_S1 :OUT STD_LOGIC;add_sub_S2 : OUT STD_LOGIC);END controller2;ARCHITECTURE controller_state OF controller2 ISTYPE STATE_TYPE IS (S1,S2,S3);SIGNAL state: STATE_TYPE;BEGINstate_logic: processvariable count :integer range 0 to 8;beginwait until CLK ='1' ;case state iswhen S1=> clear<='1';plsr_load<='1';add_sub_S1<='0';state<=S2;count:=0;when S2=> clear<='1' ;plsr_load<='1';add_sub_S1 <='0';add_sub_S2<='0';if(count=6)thenstate<=S3;elsestate <=S2;count:=count+1;end if;when S3=> clear<='0';plsr_load<='0';add_sub_S1<='1';add_sub_S2<='0';state<=S1;end case;end process;END controller_state;//************************************************************ FIR---------------Parallel to Serial conversion//************************************************************ library ieee;use ieee.std_logic_1164.all;entity ptos isport(data: in std_logic_vector(7 downto 0);clk : in std_logic;ptos_load : in std_logic;q:out std_logic);end ptos;ARCHITECTURE rtl OF ptos ISsignal q_temp:std_logic_vector(7 downto 0);beginprocess(clk)beginif(clk'event and clk='1')thenif (ptos_load='0') thenq_temp<=data;elseq_temp<=q_temp(6 downto 0)&q_temp(0);end if;end if;q<=q_temp(7);end process;end rtl;//************************************************************ FIR---------------shiftregisterlibrary ieee;use ieee.std_logic_1164.all;entity shiftregister isport(din:in std_logic;cp:in std_logic;dout: OUT std_logic_vector(15 downto 0));end shiftregister;ARCHITECTURE structure OF shiftregister IScomponent shift_regport(d1: in std_logic;cp:in std_logic;d0:OUT std_logic);end component;SIGNAL q_temp:std_logic_vector(15 downto 0);BEGINq_temp(0)<=din;label2:for i in 0 to 14 generateshift_regx: shift_reg port map (q_temp(i),cp,q_temp(i+1));end generate label2;dout<=q_temp(15 downto 0);END structure;//************************************************************ FIR---------------serial_adder//************************************************************ library ieee;use ieee.std_logic_1164.all;entity isport(A: in std_logic;B: in std_logic;clk: in std_logic;clr: in std_logic;S: out std_logic);end serial_adder;architecture structure of serial_adder issignal tmp1,tmp2,Cin,Cout:std_logic;beginlable1:process(clk,clr)beginif (clk'event and clk='1')thenif (clr='0')thenCin<='0';else Cin<=Cout;end if;end process;tmp1<=A xor B;tmp2<=tmp1 and Cin;S<=tmp1 xor Cin;Cout<=tmp2 or(A and B);end structure;//************************************************************ FIR---------------serial_adder8//************************************************************ library ieee;use ieee.std_logic_1164.all;entity serial_adder8 isport(A: in std_logic_vector(7 downto 0);B: in std_logic_vector(7 downto 0);clk: in std_logic;clear: in std_logic;S: out std_logic_vector(7 downto 0));end serial_adder8;architecture structure of serial_adder8 iscomponent serial_adderport(A: in std_logic;B: in std_logic;clk: in std_logic;clr: in std_logic;S: out std_logic);end component;beginlabel1: for i in 0 to 7 generateserialadderx: serial_adder port map (A(i),B(i),clk,clear,S(i));end generate label1;end structure;//************************************************************ FIR---------------coder//************************************************************ library ieee;use ieee.std_logic_1164.all;entity coder isport(S: in std_logic_vector(7 downto 0);address1:out std_logic_vector(2 downto 0);address2:out std_logic_vector(2 downto 0));end coder;ARCHITECTURE dataflow OF coder ISbeginaddress1(1)<= S(7) xor S(5);address1(0)<= S(7) xor S(4);address2(2)<= S(3) xor S(2);address2(1)<= S(3) xor S(1);address2(0)<= S(3) xor S(0);end dataflow;//************************************************************ FIR---------------LUT//************************************************************ library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity lut1 isport(table_in:in std_logic_vector(2 downto 0);table_out: out std_logic_vector(8 downto 0));end lut1;architecture lcs1 of lut1 isbeginprocessbegincase table_in iswhen "000"=>table_out<="111111110";when "001"=>table_out<="000000110";when "010"=>table_out<="111111011";when "011"=>table_out<="000000011";when "100"=>table_out<="111111010";when "101"=>table_out<="000000010";when "110"=>table_out<="111110111";when "111"=>table_out<="111111111";when others=>table_out<="000000000";end case;end process;end lcs1;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity lut2 isport(table_in:in std_logic_vector(2 downto 0);table_out: out std_logic_vector(8 downto 0));end lut2;architecture lcs2 of lut2 isbeginprocessbegincase table_in iswhen "001"=>table_out<="000100001";when "010"=>table_out<="111101110";when "011"=>table_out<="000101101";when "100"=>table_out<="111010011";when "101"=>table_out<="000010010";when "110"=>table_out<="111011111";when "111"=>table_out<="000011110";when others=>table_out<="000000000";end case;end process;end lcs2;//************************************************************ adder9//************************************************************ LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY adder9 ISPORT(Cin: IN STD_LOGIC;A,B: IN STD_LOGIC_VECTOR(8 downto 0);S: OUT STD_LOGIC_VECTOR(8 downto 0));END adder9;ARCHITECTURE a OF adder9 ISSIGNAL sA,sB,sS : STD_LOGIC_VECTOR(8 downto 0);SIGNAL sC,sT,sG: STD_LOGIC_VECTOR(8 downto 0);SIGNAL sCin: STD_LOGIC;BEGINsA<= A;sB<= B;sCin <=Cin;sT(0) <= sA(0) xor sB(0);sG(0) <= sA(0) and sB(0);sT(1) <= sA(1) xor sB(1);sG(1) <= sA(1) and sB(1);sT(2) <= sA(2) xor sB(2);sG(2) <= sA(2) and sB(2);sT(3) <= sA(3) xor sB(3);sG(3) <= sA(3) and sB(3);sT(4) <= sA(4) xor sB(4);sG(4) <= sA(4) and sB(4);sT(5) <= sA(5) xor sB(5);sG(5) <= sA(5) and sB(5);sT(6) <= sA(6) xor sB(6);sG(6) <= sA(6) and sB(6);sT(7) <= sA(7) xor sB(7);sT(8) <= sA(8) xor sB(8);sG(8) <= sA(8) and sB(8);sC(0) <= sG(0) or (sT(0) and sCin);sC(1) <= sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)));sC(2) <= sG(2) or (sT(2) and (sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)))));sC(3) <= sG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)))))));sC(4) <= sG(4) or (sT(4) and (sG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)))))))));sC(5) <= sG(5) or (sT(5) and (sG(4) or (sT(4) and (sG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)))))))))));sC(6) <= sG(6) or (sT(6) and (sG(5) or (sT(5) and (sG(4) or (sT(4) and (SG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1) and (sG(0) or (sT(0) and sCin)))))))))))));sC(7) <= sG(7) or (sT(7) and (sG(6) or (sT(6) and (sG(5) or (sT(5) and (sG(4) or (sT(4) and (sG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1) and (SG(0) or (sT(0)and sCin)))))))))))))));sC(8) <= sG(8) or (sT(8) and (sG(7) or (sT(7) and (sG(6) or (ST(6) and (sG(5) or (sT(5) and (sG(4) or (sT(4) and (sG(3) or (sT(3) and (sG(2) or (sT(2) and (sG(1) or (sT(1)and (sG(0) or (sT(0) and sCin)))))))))))))))));sS(0) <= sT(0) xor sCin;sS(1) <= sT(1) xor sC(0);sS(2) <= sT(2) xor sC(1);sS(3) <= sT(3) xor sC(2);sS(4) <= sT(4) xor sC(3);sS(5) <= sT(5) xor sC(4);sS(6) <= sT(6) xor sC(5);sS(7) <= sT(7) xor sC(6);sS(8) <= sT(8) xor sC(7);S <= sS;END a;//************************************************************mux2//************************************************************library ieee;use ieee.std_logic_1164.all;entity mux2 isport(din1:in std_logic_vector(8 downto 0);din2:in std_logic_vector(8 downto 0);s1 :in std_logic;s2 :in std_logic;q_out1:out std_logic_vector(8 downto 0);end mux2;ARCHITECTURE rtl OF mux2 ISsignal d1_1: std_logic_vector(8 downto 0);signal d1_0: std_logic_vector(8 downto 0);signal d2_1: std_logic_vector(8 downto 0);signal d2_0: std_logic_vector(8 downto 0);BEGINprocess(din1,din2,s1,s2)begind1_0<=din1;d1_1<=not(din1);d2_0<=din2;d2_1<=not(din2);case s1 iswhen '0'=>q_out1 <=d1_0;when '1'=>q_out1 <=d1_1;when others=>q_out1<="ZZZZZZZZ";end case;case s2 iswhen '0'=>q_out2 <=d2_0;when '1'=>q_out2 <=d2_1;when others=>q_out2<="ZZZZZZZZ";end case;end process;END rtl;//************************************************************ FIR--------------- add_sub//************************************************************ LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY add_sub ISPORT(s7: IN STD_LOGIC;s3: IN STD_LOGIC;add_sub_1 : IN STD_LOGIC;A,B: IN STD_LOGIC_VECTOR(8 downto 0);Cin_b:out std_logic;Sout: OUT STD_LOGIC_VECTOR(8 downto 0));END add_sub;ARCHITECTURE structure OF add_sub IScomponent mux2port(din1 :in std_logic_vector(8 downto 0);din2:in std_logic_vector(8 downto 0);s1 :in std_logic;s2 :in std_logic;q_out2:out std_logic_vector(8 downto 0));end component;component adder9port(Cin: IN STD_LOGIC;A,B: IN STD_LOGIC_VECTOR(8 downto 0);S: OUT STD_LOGIC_VECTOR(8 downto 0));end component;signal contro1_1: STD_LOGIC;signal contro1_2: STD_LOGIC;signal Cin:STD_LOGIC;signal A_1:STD_LOGIC_VECTOR(8 downto 0);signal B_1:STD_LOGIC_VECTOR(8 downto 0);begincontro1_1<=add_sub_1 xor s7;contro1_2<=add_sub_1 xor s3;Cin<=add_sub_1 xor s7;Cin_b<=add_sub_1 xor s3;U1:mux2 port map (A,B,contro1_1,contro1_2,A_1,B_1);U2:adder9 port map(Cin,A_1,B_1,Sout);end structure;//************************************************************ FIR---------------shift_accumulator//************************************************************ library ieee;use ieee.std_logic_1164.all;entity shift_accumulator isport(din:in std_logic_vector(8 downto 0);clk:in std_logic;add_sub_s2:in std_logic;Cin_b:in std_logic;dout: OUT std_logic_vector(7 downto 0));end shift_accumulator;ARCHITECTURE structure OF shift_accumulator IScomponent adder9port(Cin: IN STD_LOGIC;A: IN STD_LOGIC_VECTOR(8 downto 0);B: IN STD_LOGIC_VECTOR(8 downto 0);S: OUT STD_LOGIC_VECTOR(8 downto 0));end component;signal register_out:std_logic_vector(8 downto 0);signal shiftregister_out:std_logic_vector(7 downto 0);signal adder9_out:std_logic_vector(8 downto 0);signal adder_in:std_logic_vector(8 downto 0);signal q_temp:std_logic_vector(7 downto 0);mux2:process(add_sub_s2)begincase add_sub_s2 iswhen'0'=>adder_in<=register_out;when'1'=>adder_in<="111100000";when others=>adder_in<="ZZZZZZZZ";end case;end process;register2:process(clk)beginif (clk'event and clk='1')thenregister_out<=adder9_out(8) & adder9_out(8 downto 1); q_temp<=q_temp(7 downto 1) & adder9_out(0);end if;end process;U1:adder9 port map(Cin_b,din,adder_in,adder9_out); dout<=adder9_out(6 downto 0) & q_temp(0);end structure;。