ZYNQ——锁相环(PLL)实验

news2024/11/24 23:00:05

文章目录

  • 一、介绍
  • 二、添加时钟 IP
  • 三、设计源代码
  • 四、仿真测试
  • 五、添加 ILA IP
  • 六、分配引脚
  • 七、板上验证
  • 八、示波器输出
  • 九、问题汇总


一、介绍

ZYNQ开发板上只有一个50MHz的时钟输入,如果要用到其他频率的时钟,就需要通过FPGA芯片内部集成的PLL(Phase Locked Loop,锁相环)来分频或者倍频实现。
一个复杂的系统往往需要多个不同频率、不同相位的时钟信号,所以FPGA芯片中的PLL的数量也是衡量FPGA芯片性能的重要指标。在FPGA的设计中,时钟系统的FPGA高速的设计相当重要,一个低抖动、低延迟的系统时钟会增加FPGA设计的成功率。
本实验通过添加时钟 IP 核实现分频和倍频。


二、添加时钟 IP

打开 IP Catalog,搜索 Clocking 找到 Clocking Wizard 双击打开。
在这里插入图片描述
打开后弹出下面对话框,选择PLL,输入时钟设为 50MHz。
在这里插入图片描述
MMCM(Mixed Mode Clock Manager)是混合模式时钟管理器,用于在与给定输入时钟有设定的相位和频率关系的情况,以生成不同的时钟信号。
PLL 主要用于频率综合,使用一个PLL可以从一个输入时钟信号生成多个时钟信号。
然后在输出时钟子页面下设置四个输出频率。
在这里插入图片描述
设置完成后点击OK,弹出下面窗口,点击生成即可完成时钟 IP 核的添加。
在这里插入图片描述


三、设计源代码

在IP Sources下找到上面添加时钟IP核的.veo文件,双击打开如下图。
在这里插入图片描述
将其中的例化代码复制,新建一个设计源文件,粘贴到里面,最终的代码如下。

module pll(
    input clk,
    input rst,
    output clk_out1,
    output clk_out2,
    output clk_out3,
    output clk_out4
);

wire locked;

clk_wiz_0 clk_wiz_0_inst
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output 200MHz
    .clk_out2(clk_out2),     // output 100MHz
    .clk_out3(clk_out3),     // output 50MHz
    .clk_out4(clk_out4),     // output 25MHz
    // Status and control signals
    .reset(~rst), // input reset
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk));      // input 50MHz

endmodule

这里需要注意的是,PLL的复位是高电平有效,如果后续需要在开发板上通过按键来复位,由于按键是低电平有效的,因此上述代码中的复位信号需要反向。


四、仿真测试

本例中的仿真测试源代码如下。

`timescale 1ns / 1ps
module sim_pll();
reg clk;
reg rst;
wire clk_out1;
wire clk_out2;
wire clk_out3;
wire clk_out4;

initial
begin
    clk = 0;
    rst = 1; //PLL复位高电平有效,代码中有取反,所以这里设置为1
end

always #10 clk = ~clk;

pll uut_pll(
    .clk(clk),
    .rst(rst),
    .clk_out1(clk_out1),
    .clk_out2(clk_out2),
    .clk_out3(clk_out3),
    .clk_out4(clk_out4)
);
endmodule

仿真输出结果如下图所示。
在这里插入图片描述
代码中的时钟是20ns一个周期,所以频率就是50MHz。通过上面的输出结果可以看到,clk_out1的频率是输入时钟频率的4倍,即200MHz,同理,clk_out2的频率是输入时钟频率的2倍,也就是100MHz,clk_out3与输入同频率,即50MHz,clk_out4的频率是输入时钟频率的0.5倍,即25MHz。
在 PLL 中改变一下时钟3和时钟4的相位,如下图。
在这里插入图片描述
修改相位后的仿真输出结果如下图所示。
在这里插入图片描述
再与上面相位未做变化时做比较,可以明显看到时钟3和输入时钟反向,即相移180°,时钟四相较于输入时钟相移90°。
因此,通过上述仿真可以直到,通过PLL可以生成多个不同频率、不同相位的时钟信号。


五、添加 ILA IP

这里添加五个探针,都是一位的,用于观察输出的信号。
在这里插入图片描述


六、分配引脚

用上面的代码在板上验证时需要示波器测量,我这里通过添加ILA分析输出的结果,编写的代码如下。

module pll(
    input clk,
    input rst,
    output clk_out1,
    output clk_out2,
    output clk_out3,
    output clk_out4
);

reg in,out1,out2,out3,out4;
wire locked;
initial
begin
in = 1;
out1 = 1;
out2 = 1;
out3 = 1;
out4 = 1;
end

always@(posedge clk or negedge rst)
begin
if(!rst)
    in = 0;
else
    in = ~in;
end

clk_wiz_0 clk_wiz_0_inst
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output 200MHz
    .clk_out2(clk_out2),     // output 100MHz
    .clk_out3(clk_out3),     // output 50MHz
    .clk_out4(clk_out4),     // output 25MHz
    // Status and control signals
    .reset(~rst), // input reset
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk));      // input 50MHz

always@(posedge clk_out1)
begin
if(!rst)
    out1 = 0;
else
    out1 = ~out1;
end

always@(posedge clk_out2)
begin
if(!rst)
    out2 = 0;
else
    out2 = ~out2;
end

always@(posedge clk_out3)
begin
if(!rst)
    out3 = 0;
else
    out3 = ~out3;
end

always@(posedge clk_out4)
begin
if(!rst)
    out4 = 0;
else
    out4 = ~out4;
end

ila_0 ila_inst (
	.clk(clk), 

	.probe0(in),
	.probe1(out1),
	.probe2(out2),
	.probe3(out3),
	.probe4(out4)
);

endmodule

给代码中的各端口分配引脚如下图。
在这里插入图片描述


七、板上验证

生成比特流并将其下载到ZYNQ开发板上进行验证。
在这里插入图片描述
在集成逻辑分析仪窗口查看输出结果如下图。
在这里插入图片描述
上面这张图是输入为50MHz的情况,out1(200MHz)和out2(100MHz)没有正确的显示。
在这里插入图片描述
根据代码中编写的,in信号代表的是输入时钟(in信号是实际时钟频率的二分频,不过不影响和后续频率的比较,因为输出信号都是在此机制下产生的,因此倍数关系不会变),我改为了200MHz,因为50MHz在板上验证的时候,发现倍频输出的两个频率100MHz和200MHz不能正确的输出,而分频可以正常输出,所以我就改为了200MHz,只看分频的结果。
可以看到,输出out1与输入in信号同频;输出out2是输入in信号的二分频;输出out3是输入in信号的四分频;输出out4是输入in信号的八分频。这与我在PLL中预设的是一致的,但是仔细观察上面的两个图发现,输入为50MHz和200MHz时,in信号的波形是一致的,所以通过ILA这种方式查看输出不太准确。


八、示波器输出

本来想通过ILA验证一下输出结果就行了,但是又出现了一系列的问题,所以还是决定在示波器中测量一下相关引脚的频率。
输入还是设置为50MHz,输出时钟设置如下。
在这里插入图片描述
在Vivado中生成比特流文件,将其下载到开发板,然后根据引脚的分配测量相关引脚的频率。
示波器中200MHz引脚的输出如下图所示。
请添加图片描述
示波器中100MHz引脚的输出如下图所示。
在这里插入图片描述
示波器中50MHz引脚的输出如下图所示。
在这里插入图片描述
示波器中25MHz引脚的输出如下图所示。
在这里插入图片描述
通过上面各图的结果可知,频率能够按照代码中设置的那样进行输出。不过输出的波形不太像方波,反而更像正弦波,这是因为示波器带宽不太够,可以参考文章示波器的带宽,一般示波器带宽是所测信号频率的5倍时,方波就比较明显了,上面的四张图随着频率的减小,波形也越接近正弦波。不过波形不是我们这里关心的重点,频率输出是正确的。


九、问题汇总

这个实验在仿真的过程中很顺利,基本没碰到什么问题,但在板上验证时遇到了一些麻烦,现列出如下。
1、运行时报错了,如下图所示。
在这里插入图片描述
报错信息如下。

[DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity. The signal clk_wiz_0_inst/inst/clk_in1 on the clk_wiz_0_inst/inst/plle2_adv_inst/CLKIN1 pin of clk_wiz_0_inst/inst/plle2_adv_inst with COMPENSATION mode ZHOLD must be driven by a clock capable IO.

解决办法:回到PLL IP核这里,将Source改为Global buffer。
在这里插入图片描述
2、输入时钟频率直接通过探针无法观看,输出是一条线,因此,我在代码里引入了reg变量,通过时钟的上升沿让值反转来表示该频率,实际的频率应当是该种表示方法表示下的二倍,不过这里只是验证一下各输出频率与输入频率的关系,因此,这个差异不影响最终的结果判定。
3、在板上验证时发现倍频的波形输出不正确而分频正确,也不知道是什么原因造成的,我这里直接将输入频率改为最大,只验证了分频的正确性。
4、还有一个不算是问题吧,就是一个简单的操作,默认的引脚分配窗口打开就是下图所示的这样。
在这里插入图片描述
可以看到 Name 这一列是空的,在分配引脚时端口对应代码中的哪个端口虽然可以通过 I/O Ports Properties 得知,但总是觉得哪里不太对劲。是的,确实不太对劲,你用鼠标把 Name 对应的这一列往宽拉一点就发现“新大陆”了!
在这里插入图片描述


以上就是ZYNQ——锁相环(PLL)实验的全部内容了,自己总是会在实验中碰到这样那样奇怪的问题,发现问题和寻找解决办法的过程虽然有点痛苦,甚至有点绝望,但是这些都是必经之路!
参考资料:
ZYNQ 开发平台 FPGA 教程 AX7020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识磁盘及磁盘的读写原理

认识磁盘 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk&…

linux centos Python + Selenium+Chrome自动化测试环境搭建?

在 CentOS 系统上搭建 Python Selenium Chrome 自动化测试环境,需要执行以下步骤: 1、安装 Python CentOS 7 自带的 Python 版本较老,建议使用 EPEL 库或源码安装 Python 3。例如,使用 EPEL 库安装 Python 3: sud…

【C语言初阶】循环语句的具体用法,有这篇博客就够了

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!今天要将的内容是循环语句的具体用法。同时如果你是0基础小白的话,建议先看看下面两篇博客哦&#…

普通人接了人生第一单

大家好,我是 “秋意零” ,全网同名(某平台多了一个数字0 “如:秋意零0”)。 你,相信天上掉馅饼吗? 40 分钟赚 150 你敢信? 现在我突然有点信了,为什么呢?请…

ESP-C3入门19. RSA算法加密、解密的实现

ESP-C3入门19. RSA算法加密、解密的实现 一、概述二、重要函数1. mbedtls_pk_parse_public_key和mbedtls_pk_parse_key函数原型:函数参数: 2. mbedtls_pk_encrypt函数原型:函数参数:函数功能: 三、实现过程1. CMakeLis…

@Param注解的用法

1、使用Param注解的原因 在 Mapper接口中,当方法的参数为多个字面量类型,此时mybatis会将这些参数存储在一个Map集合中,以两种方式进行存储 1、以arg0.arg1…为键,以参数为值2、以param1,param2…为键,以…

解读Linux常用命令使用方法

文章目录 1.前言1.1 定义1.2 特点 2.常用命令介绍2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm2.8 cp2.9 mv2.10 man(联机手册)2.11 vim2.12 grep2.13 ps2.14 netstat 1.前言 1.1 定义 Linux是一套免费使用和自由传播的类Unix操作系统&#xf…

【百套源码】HTML5期末大作业 - 各类网页作业源码合集

文章目录 持续更新文章记录1️⃣ 个人介绍类相关源码1.1 html实现个人简历1.2 科技风个人简历1.3 网站风个人简历1.4 多种风格个人主页模板1.5 html好看的个人简历明星版1.6 专属个人主页-系列11.7 专属个人主页-系列21.8 专属个人主页-系列31.9 专属个人主页-系列41.10 专属个…

uniapp和springboot微信小程序开发实战:前端架构之微信小程序主页实现

文章目录 主页效果前端代码后端实现主页效果 前端代码 具体代码实现如下: <template><view><!--首页轮播图--><view class="uni-banner-wrap"><swiper class="swiper" circular :indicator-dots="indicatorDots" …

数字信号处理11:变换

之前好长一段时间都在写软著、写一些结课作业&#xff0c;就断断续续的在学&#xff0c;很少有时间把东西串起来&#xff0c;前些博文主要就是讲的说&#xff0c;做这个Z变换&#xff0c;今天就主要来看看其他的变换&#xff0c;当然&#xff0c;最重要的还是傅里叶变换&#x…

有哪些优秀好用的网站SEO文章采集软件?

有哪些优秀好用的网站SEO文章采集软件?Ai智能采集文章操作教程及txt转Word教程#资源变现 #资源采集 我为什么会死磕seo并利用采集站seo赚到了第一个100W&#xff1f; 两个原因&#xff1a; 第一就是seo就是目前网络上免费的获取精准用户最牛逼&#xff0c;最有效的引流吸粉手…

linux下express+puppeteer安装部署并用PM2守护进程

背景 承上篇 puppeteer-不需重构&#xff0c;无痛加强vue单页面应用的SEO&#xff0c;提升百度收录排名,是在本地nginx部署前端&#xff0c;本地另起express服务进行测试&#xff0c;下面我们来讲讲如何部署express到linux服务器&#xff0c;并用PM2守护进程。 node 16.14.1 p…

java 学习交流社区平台系统Myeclipse开发mysql数据库web结构jsp编程计算机servlet网页项目

一、源码特点 JSP 学习交流社区平台系统 是一套完善的系统源码&#xff0c;对理解JSP java serlvet dao bean MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内…

wsl中docker自启动

前言 wsl -l -v # 查看 wsl 的状态 wsl -t Ubuntu # 关闭指定版本 wsl -d Ubuntu # 启动指定版本 启动 docker 通过命令 ps -p 1 -o comm 我们知道我们用的是 init&#xff0c;故我们将 systemd 命令修改为 SysV init命令。 ps -p 1 -o comm 更换命令&#xff0c;用SysV in…

NLP作业02:课程设计报告

作业头 这个作业属于哪个课程自然语言处理这个作业要求在哪里NLP作业02&#xff1a;课程设计报告我在这个课程的目标实现基于Seq2Seq注意力机制的聊天机器人这个作业在哪个具体方面帮助我实现目标问题的提出&#xff0c;资料的查找参考文献1.简说Seq2Seq原理以及实现 2.序列到…

Android加载大图策略,防止OOM

前言 Android中图片以位图&#xff08;Bitmap&#xff09;的形式存在&#xff0c;位图常见的格式有.png、.jgp、.bmp、.gif。在加载图片的过程中常见的就是OOM&#xff08;Out of Memory&#xff09;内存溢出。 内存溢出是系统会给APP分配内存也就是Heap Size值。当APP占用的内…

含多类型充电桩的电动汽车充电站优化配置方法(matlab代码)

目录 1 主要内容 目标函数 约束条件 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第三章《含多类型充电桩的电动汽车充电站优化配置方法》&#xff0c;本章选择3种典型的电动汽…

乐鑫创客沙龙精彩回顾|激发创新、共享技术

近期&#xff0c;乐鑫科技在全国多个城市举办了 ESP Friends 创客沙龙活动&#xff0c;吸引了来自物联网各个领域的企业家、开发者、创客和学生的参与&#xff0c;包含智能硬件企业家、技术自媒体、教育从业者、博士生、高校学生等。他们与乐鑫资深应用工程师和技术专家面对面深…

冯诺依曼体系结构和操作系统的工作方式

目录 一. 冯诺依曼体系结构 1.1 什么是冯诺依曼体系结构 1.2 为什么冯诺依曼体系结构这样设计 1.3 冯诺依曼体系结构与现实问题的结合 二. 操作系统的工作方式 2.1 操作系统的功能 2.2 操作系统对下进行软硬件管理的方式 2.3 操作系统对上提供使用环境的方式 三. 总结…

泛微E-Office前台文件上传漏洞

0x01 阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&…