FPGA学习-PLL锁相环IP核使用

本文介绍了PLL(相位锁定环路)的功能及其在时钟信号分频、倍频及相位控制的应用,并通过具体实验展示了如何使用PLL生成不同频率的时钟信号,并通过LED的闪烁规律验证了信号的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验现象:

        调用IP核,配置工作方式,输入为50M,利用PLL生成25M,75M,100M三中时钟,用仿真观察时序,检查PLL对分频、倍频处理的正确性。

PLL介绍:

        PLL——phase locked loop相位锁定环路

功能1:

        对时钟信号进行分频倍频,得到不同频率的时钟信号。例如,在各种通信协议中,USB、PCIE、以太网这类协议,都有各自固定的数据传输频率。USB2.0协议芯片CY7C68013使用片外24M晶振,倍频20倍到480M以供传输数据使用;以太网协议芯片W5500使用片外25M晶振,倍频6倍到150M以供传输数据使用。

功能2:

        对同一个PLL生成的多个时钟进行相位控制,以得到期望的时间差。例如,一个时钟通过PLL产生频率相同,相位不同的两路时钟供SDRAM控制器和SDRAM芯片使用。SDRAM控制器和SDRAM芯片要求时钟要严格保证180°相位差,但clk2从fpga到SDRAM芯片往往会有延迟

,所以就需要PLL控制两路频率相同信号的相位差。

配置PLL IP核:

testbench测试文件(这个测试不需要rtl程序):

`timescale 1ns/1ns
`define clock_period 20

module PLL_tb;
	/***************定义输入输出*************/
	reg	  areset;
	reg	  clk;
	wire	  c0;
	wire	  c1;
	wire	  c2;
	wire	  locked;
	
	/***************例化PLL模块*************/
	PLL PLL(
		.areset(areset),
		.inclk0(clk),
		.c0(c0),
		.c1(c1),
		.c2(c2),
		.locked(locked)
	);

	/*************产生系统时钟激励***********/
	initial clk=1;
	always #(`clock_period/2)clk=~clk;
	
	/***************先置位areset观察输出,再areset置0,观察输出和相位锁定时间*************/
	initial begin
		areset=1;
		#(`clock_period*20+1);
		areset=0;
		#(`clock_period*20);
	end 
endmodule

波形图:

        在areset置位(为高)时,相位不能锁定(locked不能置高,PLL不能工作)。

        当areset变成0时,PLL不会立刻相位锁定,需要经过一段不稳定时间,然后相位锁定并稳定输出期望的分频倍频时钟。

实验二:

        用PLL分频倍频产生25M、50M、100M时钟,控制LED,观察闪烁规律。
rtl程序(TOP文件):

module PLL_LED(clk50M,rst_n,led);
	input clk50M;
	input rst_n;
	output [3:0] led;

	wire c0;
	wire c1;
	wire c2;
	wire locked;
	PLL PLL(
		.areset(~rst_n),
		.inclk0(clk50M),
		.c0(c0),
		.c1(c1),
		.c2(c2),
		.locked(locked)
	);


	ledcounter #(.MAX_CNT(25'd10000))
	u0(
		.clk(clk50M),
		.rst_n(locked),
		.ledout(led[0])
	);


	ledcounter #(.MAX_CNT(25'd10000))
	u1(
		.clk(c0),
		.rst_n(locked),
		.ledout(led[1])
	);


	ledcounter #(.MAX_CNT(25'd10000))
	u2(
		.clk(c1),
		.rst_n(locked),
		.ledout(led[2])
	);


	ledcounter #(.MAX_CNT(25'd10000))
	u3(
		.clk(c2),
		.rst_n(locked),
		.ledout(led[3])
	);
endmodule

子模块:

module ledcounter(clk,rst_n,ledout);
	input clk;
	input rst_n;
	output reg ledout;

	reg [24:0] counter;
	parameter MAX_CNT=25'd24_999_999;

	/**********************计数器产生********************/
	always @ (posedge clk or negedge rst_n) begin
		if(!rst_n)
			counter<=25'd0;
		else if(counter==MAX_CNT)
			counter<=25'd0;
		else 
			counter<=counter+1'b1;
	end


	/***********到达设定时刻MAX_CNT就会翻转LED************/
	always @ (posedge clk or negedge rst_n) begin
		if(!rst_n)
			ledout<=1'b0;
		else  if(counter==MAX_CNT)
			ledout<=~ledout;
		else 
			ledout<=ledout;
	end
endmodule

testbench文件:

`timescale 1ns/1ns
`define clock_period 20

module PLL_LED_tb;
	reg clk;
	reg rst_n;
	wire [3:0]led;

	PLL_LED PLL_LED(
		.clk50M(clk),
		.rst_n(rst_n),
		.led(led)
	);

	defparam PLL_LED.u0.MAX_CNT=24;
	defparam PLL_LED.u1.MAX_CNT=24;
	defparam PLL_LED.u2.MAX_CNT=24;
	defparam PLL_LED.u3.MAX_CNT=24;

	initial clk=1;
	always #(`clock_period/2) clk=~clk;
	initial begin 
		rst_n=0;
		#(`clock_period*20+1);
		rst_n=1;
		#(`clock_period*200);
		$stop;
	end
endmodule

波形图:

        可以看到LED0~3分别代表50M、25M、75M、100M时钟计24个数翻转一次LED的波形图。可以看出倍数关系。

### FPGA PLL IP 的设计与实现 #### 了解PLL的功能及其重要性 PLL(Phase-Locked Loop),即锁相环,是一种用于同步信号源之间相位的反馈控制系统。在FPGA应用中,PLL具有强大的性能,能够对时钟信号执行多种操作,比如分频、倍频、相位调整和占空比调整等[^3]。 #### 配置环境及创建项目结构 为了有效地管理和组织代码及相关资源,在开始之前应当做好充分准备。这通常意味着要分别为工程文件、RTL描述文件以及仿真测试脚本设立独立目录;另外还需特别设置一个专门存储IP的子目录于主工程项目内[^2]。 #### 创建并配置PLL IP 利用Quartus II这样的集成开发工具来简化这一过程是非常有效的办法之一。具体来说,可以通过图形化界面轻松完成PLL参数设定工作——例如指定输入时钟频率为50MHz,并定义所需的输出特性如两倍频程、五分之一周期长度变化后的波形以及其他特定属性(像90度相移或是改变至20%的高电平持续时间比例)。这些定制化的选项使得开发者可以根据实际需求灵活调整最终产生的时钟信号形式[^1]。 ```verilog // 示例Verilog代码片段展示如何实例化已生成好的PLL模块 module top_level ( input wire clk_in, // 输入原始时钟信号 output reg [7:0] led // 输出LED控制信号或其他逻辑单元连接端口 ); wire pll_clk_out; // 定义来自PLL处理过的内部节点变量名 // 插入由Qsys/Megawizard生成的具体PLL组件声明语句... altpll your_instance_name ( .inclk0(clk_in), // 将外部提供的基准脉冲接入此位置作为参考标准 .c0(pll_clk_out) // 获取经过PLL转换之后的新版定时脉冲序列供后续环节使用 ); always @(posedge pll_clk_out or negedge reset_n) begin if (!reset_n) led <= 8'b0; else // ...其余部分正常编写业务逻辑即可 end endmodule ``` #### 调试验证阶段 一旦完成了上述步骤,则进入到调试验证环节至关重要。此时应该编译整个设计并将比特流下载到目标板卡上去检验实际运行效果是否满足预期指标。同时也可以借助软件模拟器来进行前期的功能性检查以减少硬件层面反复试验所带来的不便之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值