Verilog——PLL锁相环 IP调用以及modelsim仿真测试

PLL锁相环

相位锁定环路,对输入时钟进行分频倍频,得到更高或更低频率的时钟信号,供逻辑电路使用。

N:前置分频计数器
PFD:相位频率检测器
Charge Pump:电荷泵
Loop Filter:环路滤波器
VCO:压控振荡器
M:反馈乘法器
K,V:后置分频器

电路原理介绍:

首先Fin输入时钟,进入N预分频单元,出来的是FREF参考时钟,进入PFD频率相位检测电路,检测VCO反馈回来的时钟信号与参考时钟进行比较,然后将比较结果送入Charge,能得到一个电压信号,电压信号经过一个环路滤波器后,就是一个比较稳定的电压信号,这电压信号再来控制VCO压控振荡器,从来产生一个时钟信号Fvco,再次经过M的一个倍频,输入到PFD,这里就是一个环路反馈,不断调整达到一个平衡。当PFD=M就稳定下来,稳定下来之前需要一定时间。

在这里插入图片描述
目的:将系统时钟50MHZ倍频4倍,得到200MHZ的时钟信号

调用PLL IP核

在这里插入图片描述
在这里插入图片描述
速度等级:8
Inclk0 :晶振产生的频率50MHZ
运行模式:普通模式

在这里插入图片描述
Areset:复位信号 高电平复位
Pfdena:PFD的一个使能信号,保证pll的工作
Locked:锁定输出,当高电平则锁定环路,输出的时钟信号是有效的
在这里插入图片描述
Inclk1:如果是多个时钟输入,就可以通过这个来切换
在这里插入图片描述
这里来表示输出,可以看出可以输出C0-C4五个,这里的50M就是我们最终得到的50M
Clock multiplication:时钟的倍频因子
Clock division :时钟分频因子
Clock phase shift:时钟的相移,就是指时钟的一个相位差
Clock duty cycle:时钟的占空比

在这里插入图片描述
我这里配置生成一个100MHZ的时钟c0,配置完成后点击finish

编写tb文件对PLLl锁相环ip核进行仿真测试

`timescale 1ns/1ps

module pll_tb;

		reg  CLK; 
		reg  rst;      
		wire c0; 

		wire locked  ;  
		
pll_tb u1(
		.inclk0(CLK),   
		.areset(~rst),     
		.c0(c0), 
		.locked(locked)   

);
initial CLK = 0;
always #10 CLK = ~CLK;

initial begin  
	 rst = 0;
	 #100;
	 rst = 1;
	 #100;
	 $stop;
end


endmodule 

红色:未知态
当locked锁相环被锁定的时候,输出时钟信号才有效。

在这里插入图片描述

quartus17.1 及以上版本进行PLL仿真

学习如何设置相位偏移

这里设置相位偏移-30
分成生成outclk2 = 50Mhz,outclk1 = 100Mhz,以及带有-30相位偏移的100Mhz = outclk0
在这里插入图片描述
在这里插入图片描述
设置完成后,等待v文件的生成。

将ip核例化成顶层文件

module ip_clk_gen (
		input  wire  refclk,   //  refclk.clk
		input  wire  rst,      //   reset.reset
		output wire  outclk_0, // outclk0.clk
		output wire  outclk_1, // outclk1.clk
		output wire  outclk_2, // outclk2.clk
		output wire  locked    //  locked.export
	);
	
	
	clk_gen u1 (
		
		.refclk(refclk),   //  refclk.clk
		.rst(~rst),      //   reset.reset
		.outclk_0(outclk_0), // outclk0.clk
		.outclk_1(outclk_1), // outclk1.clk
		.outclk_2(outclk_2), // outclk2.clk
		.locked(locked)    //  locked.export
	);
	
endmodule

tb文件:

`timescale 1ns/1ps

module ip_clk_gen_tb;

		reg  refclk;  //  refclk.clk
		reg  rst;      //   reset.reset
		wire outclk_0; // outclk0.clk
		wire outclk_1; // outclk1.clk
		wire outclk_2; // outclk2.clk
		wire locked  ;  //  locked.export
		
ip_clk_gen u1(
		.refclk(refclk),   //  refclk.clk
		.rst(~rst),      //   reset.reset
		.outclk_0(outclk_0), // outclk0.clk
		.outclk_1(outclk_1), // outclk1.clk
		.outclk_2(outclk_2), // outclk2.clk
		.locked(locked)    //  locked.export

);
initial refclk = 0;
always #5 refclk = ~refclk;

initial begin  
	 rst = 0;
	 #100;
	 rst = 1;
	 #100;
	 $stop;
end


endmodule 

波形:
可看到PLL的复位信号是高电平复位。

reclk为系统时钟 100 Mhz

红色clk0为偏移了30度相位的100mhz时钟

紫色clk1:没有相位偏移的100mhz时钟

黄色clk2 = 50mhz,可看到时钟周期是20ns
在这里插入图片描述

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Verilog语言是一种硬件描述语言,可以用于FPGA数字锁相环PLL)实现。PLL是一种基于电路的频率合成器,可将输入信号的频率锁定到输出时钟信号的频率,实现时钟信号的同步和稳定性。 在Verilog中,PLL可以通过使用IP核来实现。IP核是可重用的硬件组件,可在设计中轻松添加和配置功能。 要使用Verilog实现PLL,您需要了解PLL的基本结构和原理,以及Verilog编程语言。您需要编写代码来初始化PLL的各个功能块(如相位检测器、环路滤波器和VCO),并编写代码来配置所需的输出时钟频率。 您可以使用仿真工具(如ModelSimVerilog Simulator)验证与设计的正确性。一旦验证完成,您可以将代码编译成比特流并将其下载到FPGA中。然后,您可以使用FPGA来实现锁相环生成所需的时钟信号。 总体而言,使用Verilog语言实现FPGA数字锁相环PLL可以提供高度可定制和灵活的设计,同时具有良好的时钟同步和稳定性。 ### 回答2: Verilog语言的FPGA数字锁相环PLL实现,是一种利用FPGA的硬件资源实现的数字控制系统。通过使用Verilog语言编写数字锁相环的控制逻辑,并将其实现到FPGA芯片上。这种实现方式具有功耗低、可编程性强、精度高等优点。 数字锁相环是一种常见的时钟和频率控制电路,在各种数字电路中得到广泛应用。常用于时钟成形、数字信号解调和数据通信等领域。 在Verilog语言的FPGA数字锁相环PLL实现中,需要设计锁相环控制电路的各个模块,包括相锁环环路(PLL)、振荡器、分频器和反馈控制等模块。通过适当的控制和优化,可实现锁相环的频率和相位的高精度控制。 在实现过程中,需要深入了解数字锁相环的工作原理和各个模块的功能,同时要熟练掌握Verilog语言的编程技术。此外,还需要根据具体应用需求对系统进行合理的设计和优化,以保证系统的性能和稳定性。 总之,Verilog语言的FPGA数字锁相环PLL实现是一种颇具挑战性的技术,它能够为数字电路的实现和应用提供重要的支持和保障。 ### 回答3: Verilog语言是一种硬件描述语言,用于设计各种数字电路、系统和芯片。在 FPGA 中,数字锁相环PLL)是一种重要的基础电路,可以对时钟信号进行频率分频、频率加倍、相位偏移等操作,从而实现时钟信号的高精度控制和校准。本文将介绍如何用 Verilog 语言实现 FPGA 上的数字 PLL。 在 Verilog 中,数字 PLL 的实现通常需要依靠三个模块:相位比较器、数字控制振荡器和滤波器。相位比较器用于将参考时钟信号与反馈时钟信号进行比较,产生一个相位误差信号。数字控制振荡器根据相位误差信号调整自身振荡频率,从而使其输出的时钟信号与参考时钟信号保持同步。滤波器则用于平滑相位误差信号,避免产生较大的频率震荡和噪声。 具体地,可以采用如下的 Verilog 代码实现数字 PLL 的各个模块: // Phase Comparator module phase_comparator ( input reference_clock, input feedback_clock, output phase_error ); always @(posedge reference_clock or posedge feedback_clock) begin if (feedback_clock && ~reference_clock) // rising edge of feedback_clock phase_error <= phase_error + 1; else if (~feedback_clock && reference_clock) // rising edge of reference_clock phase_error <= phase_error - 1; end endmodule // Numerical Controlled Oscillator module nco ( input system_clock, input signed [15:0] phase_error, output reg signed [15:0] accumulator, output nco_clock ); reg signed [15:0] increment = 100; // initial phase increment value reg signed [15:0] offset = 0; // initial phase offset value always @(posedge system_clock) begin accumulator <= accumulator + increment + phase_error + offset; nco_clock <= $signed($greater(accumulator, 0)); end endmodule // Low-pass Filter module low_pass_filter ( input system_clock, input filter_input, output reg signed [15:0] filter_output ); reg signed [15:0] filter_gain = 100; always @(posedge system_clock) begin filter_output <= (filter_gain * filter_input + (32768 - filter_gain) * filter_output) >> 15; end endmodule 然后,将上述模块进行组合,并添加时钟频率控制、时钟输出等接口,即可构建出数字 PLL 的完整设计。实际的设计中,还需要通过仿真和调试来验证和优化设计的性能和精度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值