FPGA实战篇(IP核之MMCM/PLL实验)

1.MMCM/PLL IP 核简介

        锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。
        锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相 位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。Xilinx 7 系列器件中具有时钟管理单元 CMT 时钟资源, xc7z020 芯片内部有 4 CMT xc7z010 芯片内部有 2 CMT ,为设备提供强大的系统时钟管理以及高速 I/O 通信的能力。
        在本实验中,读者可以简单地理解为:外部时钟连接到具有时钟能力的输入引脚 CCIO Clock-Capable Input),进入 MMCM/PLL ,产生不同频率和不同相位的时钟信号,然后驱动全局时钟资源 BUFG 。但是要 进行更深入的 FPGA 开发,就必须理解器件的时钟资源架构。
2.实验任务
        本节实验任务是使用 Zynq 开发板输出 4 个不同时钟频率或相位的时钟,并在 Vivado 中进行仿真以验证结果,最后生成比特流文件并将下载到开发板上,使用示波器来测量时钟的频率。
3.硬件设计
        本章实验将 Clocking Wizard IP 核产生的 4 个时钟 100MHz 100MHz_180deg 50MHz 25MHz ,连接到开发板的 J3 扩展口 IO 上,分别是第 9 10 11 12 号脚。扩展口原理图如下图所示:
        本实验中,各端口信号的管脚分配如下表所示:
4.程序设计
        我们首先创建一个空的工程,工程名为“ip_clk_wiz ”。接下来添加 PLL IP 核。在 Vivado 软件的左侧 “Flow Navigator ”栏中单击“ IP Catalog ”,“ IP Catalog ”按钮以及单击后弹出的“ IP Catalog ”窗口如下图所示。

        打开“IP Catalog” 窗口后,在搜索栏中输入 “clock” 关键字,可以看到 Vivado 已经自动查找出了与关键 字匹配的 IP 核名称,如下图所示。

        我们双击“FPGA Features and Design ”→“ Clocking ”下的“ Clocking Wizard ”,弹出 “Customize IP” 窗口,如下图所示。

        接下来就是配置 IP 核的时钟参数。最上面的“ Component Name ”一栏设置该 IP 元件的名称,这里保持默认即可。在第一个“Clocking Options” 选项卡中, “Primitive” 选项用于选择是使用 MMCM 还是 PLL 来输出不同的时钟,对于我们的本次实验来说,MMCM PLL 都可以完成,这里我们可以保持默认选择 MMCM
        需要修改的是最下面的“Input Clock Information” 一栏,把 “Primary” 时钟的输入频率修改为我们开发板的核心板上的晶振频率 50MHz ,其他的设置保持默认即可,如下图所示。
        接下来切换至“Output Clocks ”选项卡,在“ Output Clock ”选项卡中,勾选前 4 个时钟,并且将其“ Output Freq(MHz)”分别设置为 100 100 50 25 ,注意,第 2 100MHz 时钟的相移“ Phase(degrees) ”一栏要设置为 180 。其他设置保持默认即可,如下图所示。
        “Port Renaming ”选项卡主要是对一些控制信号的重命名。这里我们只用到了锁定指示 locked 信号, 其名称保持默认即可,如下图所示。

        “MMCM Setting ”选项卡展示了对整个 MMCM/PLL 的最终配置参数,这些参数都是根据之前用户输入的时钟需求由 Vivado 来自动配置, Vivado 已经对参数进行了最优的配置,在绝大多数情况下都不需要用户对它们进行更改,也不建议更改,所以这一步保持默认即可,如下图所示。
        最后的“Summary ”选项卡是对前面所有配置的一个总结,在这里我们直接点击“ OK ”按钮即可,如下图所示。
        接着就弹出了“Genarate Output Products ”窗口,我们直接点击“ Generate ”即可,如下图所示。

        之后我们就可以在“Design Run ”窗口的“ Out-of-Context Module Runs ”一栏中出现了该 IP 核对应的 run“ clk_wiz_0_synth_1 ”,其综合过程独立于顶层设计的综合,所以在我们可以看到其正在综合,如下图所示。

        在其Out-of-Context 综合的过程中,我们就可以开始编写代码了。首先打开 IP 核的例化模板,在“ Source ” 窗口中的“IP Sources ”选项卡中,依次用鼠标单击展开“ IP -“clk_wiz_0”- Instantitation Template ”,我 们可以看到“clk_wiz.veo ”文件,它是由 IP 核自动生成的只读的 verilog 例化模板文件,双击就可以打开它, 在例化时钟 IP 核模块的时钟,可以直接从这里拷贝,如下图所示。
        我们接下来创建一个 verilog 源文件,其名称为 ip_clk_wiz.v ,代码如下:
1 module ip_clk_wiz(
2 input sys_clk , //系统时钟
3 input sys_rst_n , //系统复位,低电平有效
4 //输出时钟
5 output clk_100m , //100Mhz 时钟频率
6 output clk_100m_180deg, //100Mhz 时钟频率,相位偏移 180 度
7 output clk_50m , //50Mhz 时钟频率
8 output clk_25m //25Mhz 时钟频率
9 );
10
11 //*****************************************************
12 //** main code
13 //*****************************************************
14
15 wire locked;
16
17 //MMCM/PLL IP 核的例化
18 clk_wiz_0 clk_wiz_0
19 (
20 // Clock out ports
21 .clk_out1_100m (clk_100m), // output clk_out1_100m
22 .clk_out2_100m_180 (clk_100m_180deg), // output clk_out2_100m_180
23 .clk_out3_50m (clk_50m), // output clk_out3_50m
24 .clk_out4_25m (clk_25m), // output clk_out4_25m
25 // Status and control signals
26 .reset (~sys_rst_n), // input reset
27 .locked (locked), // output locked
28 // Clock in ports
29 .clk_in1 (sys_clk) // input clk_in1
30 ); 
31
32 endmodule
        程序中例化了 clk_wiz_0 ,把 FPGA 的系统时钟 50Mhz 连接到 clk_wiz_0 clk_in1 ,系统复位信号连接到 clk_wiz_0 reset ,由于时钟 IP 核默认是高电平复位,而输入的系统复位信号 sys_rst_n 是低电平复位, 因此要对系统复位信号进行取反。clk_wiz_0 输出的 4 个时钟信号直接连接到顶层端口的四个时钟输出信号。
        我们接下来先对代码进行仿真,TestBench 代码如下:
1 `timescale 1ns / 1ps
2 
3 module tb_ip_clk_wiz();
4 
5 reg sys_clk;
6 reg sys_rst_n;
7 
8 wire clk_100m; 
9 wire clk_100m_180deg;
10 wire clk_50m; 
11 wire clk_25m; 
12
13 always #10 sys_clk = ~sys_clk;
14
15 initial begin
16 sys_clk = 1'b0;
17 sys_rst_n = 1'b0;
18 #200
19 sys_rst_n = 1'b1;
20 end
21
22 ip_clk_wiz u_ip_clk_wiz(
23 .sys_clk (sys_clk ),
24 .sys_rst_n (sys_rst_n ),
25
26 .clk_100m (clk_100m ),
27 .clk_100m_180deg (clk_100m_180deg),
28 .clk_50m (clk_50m ),
29 .clk_25m (clk_25m ) 
30 );
31
32 endmodule
        对模块进行仿真的方法这里不再赘述,仿真后得到的波形如下图所示:
        由上图可知,locked 信号拉高之后,锁相环开始输出 4 个稳定的时钟。 clk_100m clk_100m_180deg 周期都为 10ns ,即时钟频率都为 100Mhz ,但两个时钟相位偏移 180 度,所以这两个时钟刚好反相; clk_50m 周期为 20ns ,时钟频率为 50Mhz clk_25m 周期为 40ns ,时钟频率为 25Mhz 。也就是说,我们创建的锁相环从仿真结果上来看是正确的。
5.下载验证
        编译工程并生成比特流.bit 文件后,此时把将下载器一端连接电脑,另一端与开发板上的 JTAG 下载口连接,连接电源线,并打开开发板的电源开关。
        点击 Vivado 左侧“ Flow Navigator ”窗口最下面的“ Open Hardware Manager ”,如果此时 Vivado 软件识别到下载器,则点击“Hardware” 窗口中“ Progam Device ”下载程序,在弹出的界面中选择“ Program ” 下载程序。 程序下载完成后,接下来我们使用示波器测量开发板 J3 扩展口的第 9 10 11 12 号脚。示波器测试 依次为 U20(100MHz )、T20( 100MHz_180 )、P19( 50MHz )和 N18( 25MHz )。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress网站安装了Linux宝塔面板,限制IP地址访问网站,只能使用域名访问网站

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程,保证网站能够正常访问,并且使用Linux宝塔面板申请并部署了SSL证书,使用https协议默认443端口正常访问。 三…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字,如果等全部文字返回了一次性去TTS,那么延迟会非常严重,常用的方法就是通过标点符号断句,返回了一句话就提交给TTS。随着流TTS的出现,就可以直接把大模型返回的文字灌给流TTS&#xff0…

leetcode每日一题(20241210)

leetcode每日一题(20241210)今天依旧是棋盘类型的题目,但是今天的只是表面相关,看题: 935.骑士拨号器 题目描述: 象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一…

记录ubuntu22.04重启以后无法获取IP地址的问题处理方案

现象描述:我的虚拟机网络设置为桥接模式,输入ifconfig只显示127.0.0.1,不能连上外网。,且无法上网,用ifconfig只有如下显示: 1、sudo -i切换为root用户 2、输入dhclient -v 再输入ifconfig就可以看到多了…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…

strncpy在复制含有多个\0的字符串时遇到的问题

strncpy在复制含有多个\0的字符串的时候,会产生截断,因为strncpy在读取源字符串的时候,遇到了\0,函数会认为该字符串已经结束了,然后会向目标字符串内填充\0。 char buffer[100] "ak\0jl";for (int i 0; i…

C# 网络编程--基础核心内容

在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌: : 上图引用大佬的图,大家也关注一下,有技术有品质,有国有家,情…

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

计算机启动过程 | Linux 启动流程

注:本文为“计算机启动、 Linux 启动”相关文章合辑。 替换引文部分不清晰的图。 探索计算机的启动过程 Aleksandr Goncharov 2023/04/21 很多人对计算机的启动方式很感兴趣。只要设备开启,这就是魔法开始和持续的地方。在本文中,我们将概…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

Hash、HASHTABLE底层原理【Redis对象篇】

🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…

YOLOv11改进,YOLOv11添加GSConv卷积+Slim-neck,助力小目标检测,二次创新C3k2结构

实时目标检测在工业和研究领域中具有重要意义。在边缘设备上,巨大的模型难以满足实时检测的要求,而由大量深度可分离卷积(depth-wise separable convolution)构建的轻量级模型又无法达到足够的精度。作者引入了一种新的轻量级卷积技术——GSConv,以减轻模型重量同时保持精…

利用Java爬虫MinC根据ID获取商品详情的完整指南

在当今数字化时代,获取商品详情数据对于市场分析、价格监控和竞争对手分析至关重要。Java作为一种强大且广泛使用的编程语言,非常适合开发复杂的爬虫系统。本文将详细介绍如何利用Java编写爬虫程序来根据商品ID获取商品详情,并提供完整的代码…

IP地址中的网络号:定义、作用与重要性

在计算机网络中,IP地址是每台设备的唯一标识。它由网络号和主机号两部分组成,其中网络号用于标识一个特定的网络,而主机号则用于区分该网络内的不同设备。网络号的正确分配和管理,是IP网络互联互通的基础。本文将带您走进网络号的…

java_连接数据库的方法_后端处理_前端调用_打通整体思路

参考:14 尚上优选项目-平台管理端-权限管理模块-开发角色管理接口(上)_哔哩哔哩_bilibili 第一步. 定义数据 在数据库中定义好数据(如role表格),在java后端定义好对应的实体类(Role类&#xf…

PHP富文本编辑器eWebEditor实战指南

本文还有配套的精品资源,点击获取 简介:eWebEditor是一个基于PHP的开源在线文本编辑器,提供类似Word的用户界面,简化了网页文本的创建和编辑过程。它广泛适用于博客、论坛、CMS等平台的内容管理,具备富文本编辑、表格…

docker nginx 部署vue 实例

1.安装docker https://blog.csdn.net/apgk1/article/details/144354588 2. 安装nginx docker 安装 nginx-CSDN博客 3. 复制 nginx-test 实例的一些文件到宿主机中,目前已 /home/jznh/路径演示 3.1 在/home/jznh/ 创建 conf html logs 三个文件夹,…

一个直接看央视频道的软件,可直接安装到TV

优点 打开无广告,直接自动默认打开央视频道加载速度快,切换频道响应快,不用转圈圈画质清晰,画质清晰无雪花频道多,差不多上百个频道 软件截图 下载链接 跳转原文下载

JavaEE之多线程的风险以及如何避免

上文我们了解了单线程以及线程的一些基本常见方法,但是多线程在一些方面会存在安全问题,此文我们来为多线程的安全 保驾护航!! 详情请见下文 1. 多线程带来的风险——线程安全 1.1 观察线程不安全 /*** 使用两个线程&#xff0c…