求VHDL语言(或者verilog)基于FPGA的全数字锁相环的代码 要全的

求VHDL语言(或者verilog)基于FPGA的全数字锁相环的代码 要全的,第1张

完整程序如下:其中:clk0_divide_by =>2,为分频因子

clk0_duty_cycle =>50,为占空丛森比

clk0_multiply_by =>3,为倍频因子,这些数据都可以根据需要自行设定

还有疑问裤搭的可以问我

LIBRARY ieee

USE ieee.std_logic_1164.all

LIBRARY altera_mf

USE altera_mf.all

ENTITY pll0 IS

PORT

(

inclk0 : IN STD_LOGIC := '渗纯亩0'

c0 : OUT STD_LOGIC

)

END pll0

ARCHITECTURE SYN OF pll0 IS

SIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0)

SIGNAL sub_wire1 : STD_LOGIC

SIGNAL sub_wire2 : STD_LOGIC

SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0)

SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0)

SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0)

COMPONENT altpll

GENERIC (

clk0_divide_by : NATURAL

clk0_duty_cycle : NATURAL

clk0_multiply_by : NATURAL

clk0_phase_shift : STRING

compensate_clock : STRING

inclk0_input_frequency : NATURAL

intended_device_family : STRING

lpm_hint : STRING

lpm_type : STRING

operation_mode : STRING

port_activeclock : STRING

port_areset : STRING

port_clkbad0 : STRING

port_clkbad1 : STRING

port_clkloss : STRING

port_clkswitch : STRING

port_configupdate : STRING

port_fbin : STRING

port_inclk0 : STRING

port_inclk1 : STRING

port_locked : STRING

port_pfdena : STRING

port_phasecounterselect : STRING

port_phasedone : STRING

port_phasestep : STRING

port_phaseupdown : STRING

port_pllena : STRING

port_scanaclr : STRING

port_scanclk : STRING

port_scanclkena : STRING

port_scandata : STRING

port_scandataout : STRING

port_scandone : STRING

port_scanread : STRING

port_scanwrite : STRING

port_clk0 : STRING

port_clk1 : STRING

port_clk2 : STRING

port_clk3 : STRING

port_clk4 : STRING

port_clk5 : STRING

port_clkena0 : STRING

port_clkena1 : STRING

port_clkena2 : STRING

port_clkena3 : STRING

port_clkena4 : STRING

port_clkena5 : STRING

port_extclk0 : STRING

port_extclk1 : STRING

port_extclk2 : STRING

port_extclk3 : STRING

)

PORT (

clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0)

inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0)

)

END COMPONENT

BEGIN

sub_wire4_bv(0 DOWNTO 0) <= "0"

sub_wire4<= To_stdlogicvector(sub_wire4_bv)

sub_wire1<= sub_wire0(0)

c0<= sub_wire1

sub_wire2<= inclk0

sub_wire3<= sub_wire4(0 DOWNTO 0) &sub_wire2

altpll_component : altpll

GENERIC MAP (

clk0_divide_by =>2,

clk0_duty_cycle =>50,

clk0_multiply_by =>3,

clk0_phase_shift =>"0",

compensate_clock =>"CLK0",

inclk0_input_frequency =>10000,

intended_device_family =>"Cyclone II",

lpm_hint =>"CBX_MODULE_PREFIX=pll1",

lpm_type =>"altpll",

operation_mode =>"NORMAL",

port_activeclock =>"PORT_UNUSED",

port_areset =>"PORT_UNUSED",

port_clkbad0 =>"PORT_UNUSED",

port_clkbad1 =>"PORT_UNUSED",

port_clkloss =>"PORT_UNUSED",

port_clkswitch =>"PORT_UNUSED",

port_configupdate =>"PORT_UNUSED",

port_fbin =>"PORT_UNUSED",

port_inclk0 =>"PORT_USED",

port_inclk1 =>"PORT_UNUSED",

port_locked =>"PORT_UNUSED",

port_pfdena =>"PORT_UNUSED",

port_phasecounterselect =>"PORT_UNUSED",

port_phasedone =>"PORT_UNUSED",

port_phasestep =>"PORT_UNUSED",

port_phaseupdown =>"PORT_UNUSED",

port_pllena =>"PORT_UNUSED",

port_scanaclr =>"PORT_UNUSED",

port_scanclk =>"PORT_UNUSED",

port_scanclkena =>"PORT_UNUSED",

port_scandata =>"PORT_UNUSED",

port_scandataout =>"PORT_UNUSED",

port_scandone =>"PORT_UNUSED",

port_scanread =>"PORT_UNUSED",

port_scanwrite =>"PORT_UNUSED",

port_clk0 =>"PORT_USED",

port_clk1 =>"PORT_UNUSED",

port_clk2 =>"PORT_UNUSED",

port_clk3 =>"PORT_UNUSED",

port_clk4 =>"PORT_UNUSED",

port_clk5 =>"PORT_UNUSED",

port_clkena0 =>"PORT_UNUSED",

port_clkena1 =>"PORT_UNUSED",

port_clkena2 =>"PORT_UNUSED",

port_clkena3 =>"PORT_UNUSED",

port_clkena4 =>"PORT_UNUSED",

port_clkena5 =>"PORT_UNUSED",

port_extclk0 =>"PORT_UNUSED",

port_extclk1 =>"PORT_UNUSED",

port_extclk2 =>"PORT_UNUSED",

port_extclk3 =>"PORT_UNUSED"

)

PORT MAP (

inclk =>sub_wire3,

clk =>sub_wire0

)

END SYN

电赛著

开篇之前,感谢杜勇老师,和他所著的《数字通信同步技术的MATLAB与FPGA实现,Altera/Verilog版》

[TOC]

说到锁相环,相信大家都熟悉.锁相环路(Phase Locked Loop,PLL)是一个闭环的相位控制系统.这博客分成两手局篇,第一篇讲锁相环的基本原理和参数设置,第二篇写实战.

可以先看锁相环的组成再跳回来看这里.

假设输入信号和本地振荡器的输出信号是

我们通过这个来得到他们的瞬时相差和瞬时频差:

总所周知,我们一般假设输入信号的频率和本地振荡器的初始频率(也叫作自由振荡频率)是不同的,也就是说在这种情况下两者会存在固定频差 ,如果没有进行相位追踪的话,显然两信号的相差 就会爆炸.如果我们可以控制固定频差在一个很小的范围,就能保证两个信号的相位差在 左右一个很小的范围震荡,这个就是锁相环路的捕获过程,如下:

再定义两个锁相环的参量,捕获时间和捕获带

如上所述,锁相环路存在两种状态,捕获状态和同步状态,就两种不同的工作状态下会有不同的性能参数:

显然,不介绍基本结构和动态方程之前谈性能是没意义的,所以:

因为我们需要锁相环来实现相位跟踪,最终的目的是为了实现输出信号和输入信号的同步,出于此来考虑的话,我们需要这个系统的相位误差是可收敛的,即锁相环的系统模型是一个相位的负反馈控制系统,他的基本组成大家也清楚:

分别有:

名副其实,鉴相器就是用来进行相位比较的,

比较常用的就是我们上课所讲过的乘法器加低通滤波器所构成的正弦型特性的鉴相器:

但实际上到后面实现数字锁相环的时候可能就有不一样的方法了,敬请期待.

不妨推导一下:(设乘法器增益为 )

经过LPF滤除 的高频分量之后,得到:

其中:

环路滤波器具有低通特性,一方面起着LPF的作用,另一方面是调节锁相环的参数的重要环节之一.对环路滤波器来说,他是一个线性电路,所以在时域分析中可用一个传输算子 来表示,其实p是微分算子,在频域中就可以用 来表示:

在这里我们不妨直接举一个我们首蠢都熟知的又有源比例积分滤波器:

显然,对压控振荡器来说,他的本征方程是:

其中

表示输出瞬时角频率, 为控制灵敏度或增益系数,单位是

我们可以轻松看出,他的控制特性依然是线性的.

而压控振荡器输出到鉴相器中,我们所需要考虑的是他所变化的相位情况,即:

所以我们可以看出鉴相器输出的 相位误差信号 和压控振荡器的 电压控制信号 中存在一个积分关系,而这个积分关系自然而然是在压控振荡源中完成的,对锁相环整体的性能也有比较大的影响.

现在要把刚刚介绍的三个部分综合起来一个系统来看了

锁相环在时域上的传输流程是这样毕芹让的

从上述模型中不难得出:

代入得锁相环路动态方程的一般形式:

不妨定义环路增益

显然这个环路增益表示的是VCO的最大频偏量,因为 是误差信号的最大值, 是增益系数(见上)

因为经过环路滤波器之后输出的误差信号是直流的,所以稳态误差很容易就可以解出:

这时考虑环路滤波器的传递因子 ,当A>>0时,有下列近似

其中:

所以容易得 ,这也是刚刚所说的理想二阶环没有稳态误差的来源.

但是实际上,因为A不可能无穷大,上式也只是近似得来的,所以上面的式子成立的可能性几乎也为0...

不妨将 代入锁相环的动态方程:

因为环路滤波器只有一个极点,传输算子是一阶的,所以相应的环路动态方程是二阶非线性微分方程,所以这种锁相环路称为 二阶锁相环路 .本博客缺少了对RC积分滤波器和无源比例积分滤波器的分析,有兴趣的pong友可以自行回去看书

线性相位模型就是将 非线性相位模型 近似得出的,因为显然动态方程是一个高阶的非线性微分方程(特别是加上噪声之后),而又由于瞬时相差一般是很小的,回顾一下高等数学的等价无穷小,我们容易想到sin(x)~x:

事先说明一点就是,这里对环路传递函数的建模是基于线性模型的,也就是说他同样存在上述的等价无穷小代换问题,所以不适应瞬时相差过大的情况.

不妨对线性模型做拉普拉斯变换:

不妨将不同的环路滤波器的传递函数代入得下表:

显然此时的二阶系统经线性化后变成二阶线性系统,这个的话我们在学校学的知识就已经足以应付了(特别是电路),此时定义描述二阶线性系统的两个系统常量:无阻尼振荡频率 和阻尼系数 来描述系统的响应,对应关系见下表:

这里先省略锁相环的性能分析,搞这个有点累,放到下一篇(或下几篇)博客再讨论,或者边实战边讨论吧.因为电赛这次做得题目最多就做一个位同步而已,根本就没有这么多的东西要看.我也只是先做一点基础铺垫,以免后面出问题.

想我尽早更新的方法之一

LIBRARY ieee

USE ieee.std_logic_1164.all

LIBRARY altera_mf

USE altera_mf.all

ENTITY pll IS

PORT

(

inclk0 : IN STD_LOGIC := '0'

c0 : OUT STD_LOGIC

)

END pll

ARCHITECTURE SYN OF pll IS

SIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0)

SIGNAL sub_wire1 : STD_LOGIC

SIGNAL sub_wire2 : STD_LOGIC

SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0)

SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0)

SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0)

COMPONENT altpll

GENERIC (

clk0_divide_by : NATURAL

clk0_duty_cycle : NATURAL

clk0_multiply_by : NATURAL

clk0_phase_shift : STRING

compensate_clock : STRING

inclk0_input_frequency : NATURAL

intended_device_family : STRING

lpm_type : STRING

operation_mode : STRING

port_activeclock : STRING

port_areset : STRING

port_clkbad0 : STRING

port_clkbad1 : STRING

port_clkloss : STRING

port_clkswitch : STRING

port_configupdate : STRING

port_fbin : STRING

port_inclk0 : STRING

port_inclk1 : STRING

port_locked : STRING

port_pfdena : STRING

port_phasecounterselect : STRING

port_phasedone : STRING

port_phasestep : STRING

port_phaseupdown : STRING

port_pllena : STRING

port_scanaclr : STRING

port_scanclk : STRING

port_scanclkena : STRING

port_scandata : STRING

port_scandataout : STRING

port_scandone : STRING

port_scanread : STRING

port_scanwrite : STRING

port_clk0 : STRING

port_clk1 : STRING

port_clk2 : STRING

port_clk3 : STRING

port_clk4 : STRING

port_clk5 : STRING

port_clkena0 : STRING

port_clkena1 : STRING

port_clkena2 : STRING

port_clkena3 : STRING

port_clkena4 : STRING

port_clkena5 : STRING

port_extclk0 : STRING

port_extclk1 : STRING

port_extclk2 : STRING

port_extclk3 : STRING

)

PORT (

inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0)

clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0)

)

END COMPONENT

BEGIN

sub_wire4_bv(0 DOWNTO 0) <= "0"

sub_wire4<= To_stdlogicvector(sub_wire4_bv)

sub_wire1<= sub_wire0(0)

c0<= sub_wire1

sub_wire2<= inclk0

sub_wire3<= sub_wire4(0 DOWNTO 0) &sub_wire2

altpll_component : altpll

GENERIC MAP (

clk0_divide_by =>1,

clk0_duty_cycle =>50,

clk0_multiply_by =>1,

clk0_phase_shift =>"0",

compensate_clock =>"CLK0",

inclk0_input_frequency =>10000,

intended_device_family =>"Cyclone II",

lpm_type =>"altpll",

operation_mode =>"NORMAL",

port_activeclock =>"PORT_UNUSED",

port_areset =>"PORT_UNUSED",

port_clkbad0 =>"PORT_UNUSED",

port_clkbad1 =>"PORT_UNUSED",

port_clkloss =>"PORT_UNUSED",

port_clkswitch =>"PORT_UNUSED",

port_configupdate =>"PORT_UNUSED",

port_fbin =>"PORT_UNUSED",

port_inclk0 =>"PORT_USED",

port_inclk1 =>"PORT_UNUSED",

port_locked =>"PORT_UNUSED",

port_pfdena =>"PORT_UNUSED",

port_phasecounterselect =>"PORT_UNUSED",

port_phasedone =>"PORT_UNUSED",

port_phasestep =>"PORT_UNUSED",

port_phaseupdown =>"PORT_UNUSED",

port_pllena =>"PORT_UNUSED",

port_scanaclr =>"PORT_UNUSED",

port_scanclk =>"PORT_UNUSED",

port_scanclkena =>"PORT_UNUSED",

port_scandata =>"PORT_UNUSED",

port_scandataout =>"PORT_UNUSED",

port_scandone =>"PORT_UNUSED",

port_scanread =>"PORT_UNUSED",

port_scanwrite =>"PORT_UNUSED",

port_clk0 =>"PORT_USED",

port_clk1 =>"PORT_UNUSED",

port_clk2 =>"PORT_UNUSED",

port_clk3 =>"PORT_UNUSED",

port_clk4 =>"PORT_UNUSED",

port_clk5 =>"PORT_UNUSED",

port_clkena0 =>"PORT_UNUSED",

port_clkena1 =>"PORT_UNUSED",

port_clkena2 =>"PORT_UNUSED",

port_clkena3 =>"PORT_UNUSED",

port_clkena4 =>"PORT_UNUSED",

port_clkena5 =>"PORT_UNUSED",

port_extclk0 =>"PORT_UNUSED",

port_extclk1 =>"PORT_UNUSED",

port_extclk2 =>"PORT_UNUSED",

port_extclk3 =>"PORT_UNUSED"

)

PORT MAP (

inclk =>sub_wire3,

clk =>sub_wire0

)

END SYN


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12446208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存