EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。 ! I2 s! E o+ c3 e7 c) U, V; g
系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用,这种快乐试试你就会懂的。话不多说,上货。 5 |. T' L2 @& D2 k; B! ^
2 K4 L B7 p5 {IP CORE 之 PLL- ISE 操作工具 # Q# ^: y0 J) M
8 k0 F4 T7 K6 l- J% [. T g2 w: P9 p: i
本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。
8 \$ h, Z- _: G* E9 E- Y
Xilinx 锁相环 IP 核是由锁相环(PLL)电路实现。锁相环是一种反馈控制系统,它可以自动调整本地产生的信号的相位,以匹配输入信号的相位。锁相环通过振荡器产生的波形的相位匹配输入信号的相位来工作。输入信号的微小变化首先表现为输入信号和振荡器产生波形的相位偏差。这个相位偏差作为一个调整信号,改变本地锁相环震荡频率来匹配输入信号。输入信号和本地振荡器之间的锁相关系称为锁相环路。 5 Z j( J& p& Q& m6 K
锁相环经常用于高速通信、计算机和其他的电子应用中。可以使用PLL产生稳定频率的时钟,从高噪声的通信信道中恢复信号或者在设计中产生各种时钟信号。
$ b. ^/ p% {6 D( n( _8 x
* u" Y* m, f5 p7 ^ F# c6 ?" ^
7 I, A4 u& t* ]0 m
锁相环包括前置分频模块(N counter),鉴频鉴相器(PFD),电荷泵(Charge pump),环路滤波器(Loop filter),压控振荡器(VCO),反馈分频模块(M counter),后期分频模块(K和V计数器)。
5 V9 K: t/ v, }+ Y9 P1 d
PFD检查出Fref和Feedback两个信号之间的相位和频率差距,然后控制电荷泵和环路滤波器产生一个调整电压,此电压控制VCO。根据此电压,VCO会产生一个更高或者更低的时钟。通过不断的反馈,Fref和Feedback拥有相同的频率和相位后,锁相环就锁定了。 5 y( ~$ P& b: h
插入的前置分频模块和反馈分频模块的作用是将信号进行分频处理。即:Fref=Fin/N,Feedback=Fvco/M。PLL锁定后,Fref=Feedback,即Fin/N=Fvco/M。Fvco=(Fin*M)/N,在经过后期分频分模块,Fout=Fvco/K=(Fin*M)/(N*K)。 7 O: f3 u5 B% }% m1 U Y
- 硬件介绍
/ a- s8 m+ Z: m' e6 H @( Z6 n; h( I! b! n' B2 u
开发板上的FPGA芯片为XC6SLX9-2TQG144,此芯片内部含有两个通用的PLL。 ! T4 Q' `: E2 I0 Y; I" k
: b# l5 m7 V5 s) u% u/ @: E$ p9 Z
+ H2 g( g( @9 b7 ?3 }
$ b2 b( @- B2 C# ]+ B+ g* O
- 设计要求
N* g; \ _# d: }; w5 X: v# k9 s
利用开发板外部扩展针,输出频率为100MHz和频率为10Mhz的方波,并利用示波器进行测量。
2 f- u9 J" o, S) Y
- 设计分析+ ^9 D2 l8 d1 G( H$ D' n/ j# O
开发板的晶振为50MHz,FPGA内部嵌入有PLL模块。使用PLL模块可以方便快速的产生100MHz和10MHz的方波。
7 r9 U {( R7 S
PLL模块有一个高电平有效的复位,开发板外部输入按键为低电平有效,故而需要将外部复位信号进行反相。
: w* N4 s$ V+ h w! E
PLL模块可以输出5个时钟,我们利用两个抽头即可。 * {& z- |1 R7 j: P/ T6 [1 n9 o
PLL模块会输出锁定标志信号,设计时直接将此信号输出到外部扩展针即可。 - i( t t4 C9 y/ p. H0 m; n' A
架构设计和信号说明 $ w- e; b9 p: j& s' _. \" Y1 A
" Y$ E' _; E. ], T# p此模块命名为pll_test。
& R% u" k- M1 {) C; [* Z2 h
4 T9 G8 H# F' x- B1 J% I6 ^5 ]
7 Z. }5 b5 u# ^9 ^5 W' a
本设计共有两个模块构成:一个反相器和一个PLL模块(my_pll)。
* Z! f5 n; j! |$ a: }5 }; w! W
* I8 l+ R& j, u5 n) T
) [. F* Z6 e% V
+ V6 ^$ m$ Z) \7 v. }/ s6 ^+ B( {6 x' Y- J9 o# J8 k
- pll_my设计实现
' t3 G7 [; {5 G5 M
本模块为FPGA内部ip 模块,不需要设计,只是需要利用参数化界面配置一些信息,然后调用出来即可。
# I% Q5 K* R* p# ^' [! ^' O* n
首先我们选中顶层,右键选择New Source...
# d- |* ]/ ^: Z/ @8 n6 k 7 Z$ G5 K! C' j; @3 D" O
我们需要新建IP核,所以选中第一个IP(CORE Generator &Architecture Wizard),文件名为my_pll。 / P Q( Z' A g4 j3 ?
7 w7 J7 B# n0 g. H8 H
7 k4 V3 r, H4 y- w/ y( p
点击Next。
# g7 `0 o5 ~2 V; I% k
( ?+ ], U0 X6 q) J6 e2 I B! e/ s. }( y
在众多IP库中,我们可以快速搜索我们需要的IP核,这样节省时间。那么我们的锁相环名字为clocking Wizard,我们直接搜索即可。
" c& J. O" ^& ?1 M. M
7 O8 Z1 ~5 F5 g+ t( C
+ L" h9 u, y( {
选中之后点击Next。 7 n( G5 F8 b2 f* x1 C# e
9 }- C/ Y8 F5 M \* Q
} N$ n d8 A& u# P. b0 W
点击Finish。 " n0 Q2 @6 `9 P5 P
' D' i/ y" U) {9 d% U: y: N( M* _: v" S3 q9 }
在输入频率设置的地方,把100MHz改为我们板子的输入时钟50MHz。然后点击Next。
( w, X7 M) d3 q& p# R5 D " y( K! i, f4 b; H+ P7 v. }5 S6 K: {
点击next,启动PLL的输出配置界面。
9 D6 m$ ]. F" i5 x W- k, V
+ ~+ \; R8 R5 X8 m- O9 Q6 R! P
1 l: W, W# L7 F3 v# T$ o
在界面中,选择 output frequency(键入输出时钟频率),在requested settings(要求设置)中输入100MHz,Actual settings(实际设置)中不用输入,软件会自动计算键入的时钟频率是否能够实现,对于不能实现的频率,软件会输出一个比较接近的频率。 . r5 j1 D5 f" }. T ~* ]
phase 为时钟相移,通过改变参数,可以达到输出时钟相移的功能。保持默认:0。
0 e" e* q# T: H
duty cycle为时钟占空比,通过改变参数,可以达到输出时钟占空比不同的功能。保持默认:50。
/ N& T6 H9 R" y) h f& s; |; X% g) U4 d
8 k$ r7 x# B* r" W, U$ o点击Next。
$ z9 V o4 c+ h9 H, R) n; ~' X8 K
4 S9 }2 R+ y4 R V* }
, x# V1 R4 q) T* y: l+ |
选择输入输出端口,这里RESET为复位端口,高电平有效。 6 k( S1 O6 V$ f+ l1 a
LOCKED为输出有效端口,此端口可以看到PLL输出稳定的时间段。
3 p9 R7 ]3 ^& }3 k( j
+ `! D; I6 ~9 A: m$ n* k- r此界面配置输入输出抽头,在此保持默认。点击Next。 + A* k, x T F) M, q3 c
* o% ]& ]( K2 h
/ G; D, I' C+ B, M/ q$ i; _6 s7 A
7 s8 K1 m5 A: k7 L
此界面保持默认,点击Next。
3 F( \/ v ]. V* e: {4 u5 |8 W
9 v" ^8 E$ S& [) T+ q. ], G! |( g
0 _. i* f2 P) ?
此界面展示了整个PLL配置信息,包括输入频率和输出频率。以及输入输出抽头。点击next。 6 Z1 {6 n9 w1 @1 [4 T% ^9 j
/ y* M1 P2 l' e6 l: b: R- C
% Z- f. D Y6 x
4 B! A( Q. _5 m4 I6 Q/ q3 d
点击Generate。
% n2 t- m$ Z7 U2 U 4 S' \# ^, G/ Q+ n$ C
在工程向导窗口的Hierarchy标签页下,就出现了my_pll.xco的文件。
/ j* A0 M' {* i0 \4 @
0 m7 }: {7 ?5 R( F7 n2 Z7 t
3 U7 O! H$ @* }9 @) j3 X
此时my_pll的ip core建立完成。
$ C; ~& @# K, P A
- pll_test设计实现0 ]" O, i/ q, I9 f/ m+ }
此模块负责调用my_pll,并且将外部复位进行取反,产生供给my_pll模块的复位信号。 * [7 x' b7 o' p+ t- x4 H, a6 A
my_pll的例化文件,在my_pll文件夹内,my_pll.veo为例化文件,打开后,可以直接复制。 O' s- i: s, h! R
设计代码为:
; M9 r8 a+ l# G9 D& T* l( n
g8 u! G9 M$ [# f" ^6 ~' t' V( y* {' j- h- {/ l4 `# b
: ~; @& w( j w- s) s
' v2 M# ~8 `, v% _9 h
仿真代码为: ! g2 G4 P2 t8 V
, ~9 V8 T, y2 c9 n3 J E* E/ J {- c' j6 u
5 g( b8 x h8 {5 P
% n4 J, `9 W4 o
在RTL仿真图中,可以看到,复位结束后,PLL并没有立刻锁定,而是输出不确定,等待一段时间后,PLL输出锁定,稳定的输出我们想要的波形。在复位期间,PLL输出的波形都是低电平。
+ l$ a# C9 W' g0 m: K
- 板级测试2 J4 V* R. ~- @" A; X. m V8 z6 B: w
分配管脚,综合下板后,使用示波器测量。
0 }" c9 F" K4 z8 `3 z3 r1 B4 w8 s
3 g) k6 h6 ~$ n100MHz的方波测试的波形。
8 O# g$ z S7 ^+ I- C& p
# l6 C7 r/ l$ N' Z8 ?. W$ `: F+ j( H7 C
10MHz方波测试波形。
' J( Z# j5 B7 b0 ~ [ S( s' X
; d) o- N: X. s: S6 z+ Y) y
5 T' c) n+ p7 u& m1 c: H' W
8 a2 B2 d3 s# y
% x% u6 V1 `" B
# `1 T7 B a4 ~ |