FPGA实验 - 锁相环调用

锁相环(PLL)

  • 片内时钟管理单元PLL:用来统一整合时钟信号。
  • 优点
    • 很大范围内实现任意大小的分频和倍频。
    • 有效减小时钟发生部分的代码量。
    • 利用全局时钟树,较高的时钟管理效率。

项目要求

  • 利用一个锁相环将50MHz的系统时钟分成两个时钟:25MHz和100MHz。
  • 学会如果通过锁相环进行倍频分频的基本操作。

调用IP核

  • 点击tools
    FPGA实验 - 锁相环调用_第1张图片
  • 直接下一步
    FPGA实验 - 锁相环调用_第2张图片
  • 搜索pll,选择altpll,选择verilog HDL,输入命名,点击下一步。
    FPGA实验 - 锁相环调用_第3张图片
  • 设置系统时钟,50MHz,其他默认,下一步
    FPGA实验 - 锁相环调用_第4张图片
  • 创建areset即locked功能引脚,左上角的模块框图可以观察其结构,由于无需第二个输入时钟信号,后面默认下一步。
    FPGA实验 - 锁相环调用_第5张图片
  • 进入输出信号引脚设置,第一个c0输出25MHz,第二个c1输出100MHz,相位跟占空比选择默认。
    FPGA实验 - 锁相环调用_第6张图片
    FPGA实验 - 锁相环调用_第7张图片
  • 可见输出c0-c4,即一个pll模块可以输出5个时钟,这里设置c0,c1即可,其他不使用。
    FPGA实验 - 锁相环调用_第8张图片
  • 到这里pll的时钟设置完成,开始编写使用模块代码,用来调用该时钟模块。

系统框架

FPGA实验 - 锁相环调用_第9张图片

端口名称 说明
clk 输入时钟,50MHz
areset 复位信号,高电平有效
clk_25M 输出时钟,25MHz
clk_100M 输出时钟,100MHz
locked 时钟稳定信号

代码实现

  • 观察生成的my_pll.v文件中的端口名,做调用使用。
    FPGA实验 - 锁相环调用_第10张图片

  • 代码如下,简单的调用锁相环。

    // 锁相环调用
    module pll_test(clk, areset, clk_25M, clk_100M, locked);
    
    input clk;
    input areset;
    
    output clk_25M;
    output clk_100M;
    output locked;
    
    my_pll my_pll_inst(
    	.areset(areset),
    	.inclk0(clk),
    	.c0(clk_25M),
    	.c1(clk_100M),
    	.locked(locked)
    );
    
    endmodule
    

仿真测试

  • 代码如下
    // 定义时间单位及精度
    `timescale 1ns/1ps
    
    module pll_test_tb();
    
    reg clk;
    reg areset;
    
    wire clk_25M;
    wire clk_100M;
    wire locked;
    
    initial clk = 1'b0;
    always #10 clk = ~clk; // 定义50MHz系统时钟
    
    initial	begin
    	areset = 1'b1;
    	#50
    	areset = 1'b0;	// 50ns后复位信号置0
    end
    repeat (100)@(posedge clk_100M);// 观察clk_100M端口数据,100次后停止
    $stop;
    
    pll_test pll_test_inst(
    	.clk(clk),
    	.areset(areset),
    	.clk_25M(clk_25M),
    	.clk_100M(clk_100M),
    	.locked(locked)
    );
    endmodule
    
  • 仿真波形,当输出的时钟频率稳定后,locked(时钟稳定)信号由低电平变为高电平。输出两个时钟:25MHz,100MHz。满足设计要求。
    在这里插入图片描述

总结

  • 熟悉了IP核-pll的设置及调用。
  • 观察locked信号低电平有效,可以作为系统的复位信号。

你可能感兴趣的:(FPGA,fpga开发)