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 ieeeUSE 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)