FPGA_学习_10_IP核_PLL

news2024/10/7 0:10:07

1 PLL IP核配置步骤

(Vivado 赛灵思)

 

 

我看的教程里面,那个兄弟是选的下面这个。 看来还是比较注重开发效率。

下面按照截图路径打开这个veo文件,学习如何在FPGA程序中例化IP核(有点像C++你创建了一个类,然后你实例化一个)。

2 测试代码

现在咱们有3个不同频率的时钟了,我们用这三个时钟计数到同样的值,然后点灯。 就能看出时钟频率的区别。由于灯只有两个,所以实验分成了两次,一次是50MHz时钟和100MHz时钟的对比,一次是50MHz时钟和25MHz时钟的对比。

`timescale 1ns / 1ps

module pll(
        input   wire            clk     ,
        input   wire            rst_n   ,
        output  wire    [1:0]   led   
);

//==================================================================
//                        Parameter define
//==================================================================

localparam CNT_MAX = 50_000_000 - 1;


//==================================================================
//                        Internal Signals
//==================================================================

// IP_PLL 输出信号引出
wire            clk_out1        ;       // 注意,这里用的wire类型
wire            clk_out2        ;
wire            clk_out3        ;
wire            locked          ;

reg     [31:0]  timer1cnt       ;
reg     [31:0]  timer2cnt       ;
reg     [31:0]  timer3cnt       ;
reg     [1:0]   led_r           ;

assign  led = ~led_r;

IP_PLL inst_pll
(
        .clk_out1(clk_out1),    // output clk_out1      50MHz   0
        .clk_out2(clk_out2),    // output clk_out2      100MHz  90
        .clk_out3(clk_out3),    // output clk_out3      25MHz   0
        .reset(~rst_n),         // input reset          默认高有效,我们的复位信号是低有效,遂取反
        .locked(locked),        // output locked
        .clk_in1(clk)           // input clk_in1        我们的输入时钟信号是clk
);         

//----------------------------- clk_out1 and timer1cnt and locked -----------------------------
always @(posedge clk_out1 or negedge rst_n) begin
        if (rst_n == 1'b0) begin
                timer1cnt       <= 'd0;     
        end
        else if (locked == 1'b1) begin
                if (timer1cnt == CNT_MAX) begin
                        timer1cnt <= 'd0;
                end
                else begin
                        timer1cnt <= timer1cnt + 1'b1;
                end
        end
        else begin
                timer1cnt <= 'd0;
        end
end

//----------------------------- clk_out2 and timer2cnt and locked -----------------------------
always @(posedge clk_out2 or negedge rst_n) begin
        if (rst_n == 1'b0) begin
                timer2cnt       <= 'd0;     
        end
        else if (locked == 1'b1) begin
                if (timer2cnt == CNT_MAX) begin
                        timer2cnt <= 'd0;
                end
                else begin
                        timer2cnt <= timer2cnt + 1'b1;
                end
        end
        else begin
                timer2cnt <= 'd0;
        end
end

//----------------------------- clk_out3 and timer3cnt and locked -----------------------------
always @(posedge clk_out3 or negedge rst_n) begin
        if (rst_n == 1'b0) begin
                timer3cnt       <= 'd0;     
        end
        else if (locked == 1'b1) begin
                if (timer3cnt == CNT_MAX) begin
                        timer3cnt <= 'd0;
                end
                else begin
                        timer3cnt <= timer3cnt + 1'b1;
                end
        end
        else begin
                timer3cnt <= 'd0;
        end
end

//----------------------------- clk_out1 led -----------------------------
always @(posedge clk_out1 or negedge rst_n) begin
        if (rst_n == 1'b0) begin
                led_r[0] <= 1'b0;                    
        end
        else if (timer1cnt == CNT_MAX) begin
                led_r[0] <= ~led_r[0];
        end
        else begin
                led_r[0] <= led_r[0];
        end
end


// //----------------------------- clk_out2 led -----------------------------
// always @(posedge clk_out2 or negedge rst_n) begin
//         if (rst_n == 1'b0) begin
//                 led_r[1] <= 1'b0;                    
//         end
//         else if (timer2cnt == CNT_MAX) begin
//                 led_r[1] <= ~led_r[1];
//         end
//         else begin
//                 led_r[1] <= led_r[1];
//         end
// end

//----------------------------- clk_out3 led -----------------------------
always @(posedge clk_out3 or negedge rst_n) begin
        if (rst_n == 1'b0) begin
                led_r[1] <= 1'b0;                    
        end
        else if (timer3cnt == CNT_MAX) begin
                led_r[1] <= ~led_r[1];
        end
        else begin
                led_r[1] <= led_r[1];
        end
end

endmodule

在代码中,应该重点关注IP核是如何被调用(例化)的,同时注意例化时,填写的输入输出。 另外,在使用IP核输出的时钟信号计数时,我们同时使用了locked信号,这一点请不要忽略。

3 约束文件

create_clock	-period			20.000		[	get_ports	clk	]

set_property    PACKAGE_PIN		N18			[	get_ports	clk			]
set_property    PACKAGE_PIN		P15			[	get_ports	{led[0]}	]
set_property    PACKAGE_PIN		U12			[	get_ports	{led[1]}	]
set_property    PACKAGE_PIN		T12			[	get_ports	rst_n		]

set_property    IOSTANDARD      LVCMOS33	[	get_ports	clk			]  
set_property    IOSTANDARD      LVCMOS33	[	get_ports	{led[*]}	]  
set_property    IOSTANDARD      LVCMOS33	[	get_ports	rst_n		]  

4 运行结果

PLL_RUN1

左边的灯闪1次,右边的灯闪2次。  左边灯用的是50MHz时钟,右边灯用的100MHz时钟

PLL_RUN2

左边的灯闪2次,右边的灯闪1次。  左边灯用的是50MHz时钟,右边灯用的25MHz时钟

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

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

相关文章

MES生产管理系统简介与实践经验分享,一篇就够了

MES系统是制造业企业数字化转型的重要组成部分&#xff0c;也是实现智能制造的基础。本文将从MES系统的定义、功能和应用实践等方面进行介绍和分享。 一、MES系统简介 MES系统&#xff08;Manufacturing Execution System&#xff09;又称生产执行系统&#xff0c;是在企业信…

JS自定义打印网页内容(详细全面)

浏览器自身打印 (不在赘述,重点是讲述打印自定义的几种方法与常见的问题) 使用 window.print() 调起浏览器自带的打印预览弹框打印默认会打印 body 里面所有内容const handlePrintPdf = () => {window.print(); }方式一:通过 iframe 打印部分区域 动态创建一个不可见的 i…

【Android -- JNI 和 NDK】认识 NDK

简介 定义&#xff1a;Native Development Kit &#xff0c;是 Android 的一个工具开发包。 NDK 是属于 Android 的&#xff0c;与 Java 并无直接关系 作用&#xff1a;快速开发 C、 C 的动态库&#xff0c;并自动将 so 和应用一起打包成 APK 即可通过 NDK 在 Android 中 使用…

拼多多买家订单API

目录 订单查询支持两种方式 请求数据格式&#xff08;指定账号&#xff09; 请求头示例 数据格式说明 返回数据格式&#xff08;指定账号&#xff09; 返回头示例 数据格式说明 不同页面层级各自有什么订单数据 请求数据格式&#xff08;指定订单编号&#xff09; 请…

电脑桌面图标打不开?尝试这3个解决方法!

Dam在使用电脑时&#xff0c;无论怎么点击桌面图标都无法打开&#xff0c;他感到很苦恼。遇到电脑桌面图标打不开的情况应该怎么办呢&#xff1f; 电脑桌面上的图标是我们经常使用的快捷方式&#xff0c;但有时候它们可能会出现无法打开的问题。这可能是由于各种原因引起的&…

数字孪生世界建设核心能力:地理信息数据应用能力

地理信息数据是数字孪生的核心基础之一&#xff0c;它能够把真实世界的空间结构和关系映射到数字世界&#xff0c;包含了静态的地理元素和动态的时空变量&#xff0c;如道路、建筑、水系、交通流量、人口密度、环境质量等&#xff0c;它能够反映真实世界的时空特点和动态变化&a…

建设现代化智慧档案八防设备系统解决方案

档案馆库房八防温湿度空气质量一体化解决方案 档案库房是档案事业发展的基石&#xff0c;其主要任务是集中保管国家机构及个人等在各种形式下形成的具有一定价值和保存价值的各种载体档案&#xff0c;主要包括文书档案、科技档案、会计档案、人事档案、实物档案等。随着我国经济…

sqlmap拿shell

sqlmap5种思路拿shell总结 ①利用dump 管理员类的账户后进入进行站点后拿shell 或者拿到账户后远程连接进行连接进行udf类提取类拿shell #连接方法 sqlmap -d “mysql://admin:password192.168.1.1:3306/security” admin是账号,psw是密码&#xff0c;后面是地址和端口&#x…

springboot基于微信小程序的安全教育平台面向大学生-计算机毕设 附源码85871

springboot基于微信小程序的安全教育平台面向大学生 目 录 摘要 1 绪论 1.1 研究背景 1.2 研究现状 1.3论文结构与章节安排 2 基于微信小程序的安全教育平台面向大学生系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删…

Eureka 平滑迁移 Nacos 方案

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

Python基础语法1(语法和规则)

Python是一门脚本语言&#xff0c;相比与C/C&#xff0c;Java的优势就是不用事先进行编译&#xff0c;可以直接读取脚本文件&#xff0c;一边解释一边执行 大家好&#xff0c;我是纪宁 本文将介绍pytho的基础语法第一部分&#xff0c;关于一些python写代码的基本规则 博主也正…

14-2利用遗传算法求解BP神经网络初始化权值和阈值的最优问题(附matlab程序)

1.简述 核心问题&#xff1a; BP网络是前向网络的核心部分&#xff0c;是神经网络中的最精华、最完美的部分&#xff0c;由于其简单的结构&#xff0c;可调整的参数多&#xff0c;训练算法也多&#xff0c;而且可操作性好&#xff0c;BP神经网络获得了非常广泛的应用&#xff0…

易基因:ChIP-seq等揭示METTL14调控哺乳动物二价结构域的表观遗传机制|科研进展

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 组蛋白及其翻译后修饰在调控基因表达和其他染色质模板化过程中起着重要作用。组蛋白H3赖氨酸4三甲基化&#xff08;H3K4me3&#xff09;和组蛋白H3K27me3分别在小鼠植入前胚胎的基因激活…

C盘中哪些文件可以删除?这些文件放心删!

我的c盘动不动就显示爆满&#xff0c;想删一些c盘的文件吧&#xff0c;又害怕误操作删了电脑的系统文件。有没有电脑高手能总结一下c盘里哪些文件可以删除呀&#xff01; C盘作为我们默认的存储盘&#xff0c;会自动保存很多文件&#xff0c;久而久之我们可能会发现&#xff0c…

【保姆级教程】Vue项目调试技巧

前言 在Vue项目开发过程中&#xff0c;当遇到应用逻辑出现错误&#xff0c;但又无法准确定位的时候&#xff0c;知晓Vue项目调试技巧至关重要&#xff0c;debug是必备技能。 同后台项目开发一样&#xff0c;可以在JS实现的应用逻辑中设置断点&#xff0c;并进行单步、进入方法…

sqoop导入实战

Sqoop导入实战 Sqoop-import 案例1 表没有主键&#xff0c;需要指定map task的个数为1个才能执行 Sqoop导入原理: ​ Sqoop默认是并行的从数据库源导入数据。您可以使用-m或--num-mappers参数指定用于执行导入的map任务(并行进程)的数量。每个参数都取一个整数值&#xff0…

【软件工程题库】第六章 编码和测试

&#x1f57a;作者&#xff1a; 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Python基础(15)——Python字典(dict)详解

Python基础&#xff08;15&#xff09;——Python字典&#xff08;dict&#xff09;详解 文章目录 Python基础&#xff08;15&#xff09;——Python字典&#xff08;dict&#xff09;详解课程&#xff1a;字典目标一. 字典的应用场景二. 创建字典的语法三. 字典常见操作3.1 增…

arm64架构的linux中断分析(一)

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 2.5 硬件中断号和软件中断号 1. 中断的概念和作用 当计算机的CPU需要在执行任务的同时响应外部事件时&#xff0c;中断是一种重要的…

Python基础(13)——Python列表(list)详解

Python基础&#xff08;13&#xff09;——Python列表&#xff08;list&#xff09;详解 文章目录 Python基础&#xff08;13&#xff09;——Python列表&#xff08;list&#xff09;详解课程&#xff1a;列表目标一. 列表的应用场景二. 列表的格式三. 列表的常用操作3.1 查找…