jjzjj

IP核简介及PLL_IP核的调用

混子王江江 2024-06-27 原文

文章目录


前言

这几天在学习FPGA的IP核的知识,里面涉及了许多方法于是写博客方便后续的复习等。IP核在我目前的理解来说就像我们学习c语言的头函数一样,是别人已经实现封装的一个方法,我们需要进行引入并了解他的接口,具体看下面。


一、IP核是什么?

1、定义

IP(Intellectual Property) 即知识产权。在半导体产业将IP核定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”。简而言之,这里的IP即电路功能模块

在数字电路中,将常用的且比较复杂的功能模块设计成参数可修改的模块,让其他用户可以直接调用这些模块,这就是IP核。

2、优点

1、随着FPGA的规模越来越大,它的设计也是越来越复杂。
2、随着设计规模增大,复杂度提高,使用IP核可以提高开发效率,减少设计和调试时间,加速开发进程,降低开发成本,是业界的发展趋势。

3、IP核存在形式(依据产品交付方式)

1、HDL语言形式 — 软核

硬件描述语言; 可进行参数调整、复用性强;布局、布线灵活;设计周期短、设计投入少。

2、网表形式 — 固核

完成了综合的功能块;可预布线特定信号或分配特定的布线资源。

3、版图形式 — 硬核

硬核是完成提供设计的最终阶段产品-掩膜(Mask),缺乏灵活性、可移植性差;更易于实现IP核的保护。

4、缺点

1、IP核往往不能跨平台使用
2、IP核不透明,看不到内部核心代码
3、定制IP需额外收费

5、调用IP核的几种方式

1、Mega Wizard插件管理器(常用)
2、SOPC构造器
3、DSP构造器(仅支持部分IP核的例化使用)
4、Qsys设计系统例化(仅支持部分IP核的例化使用)

二、PLL-IP核

1.PLL-IP核简介

PLL (Phase Locked Loop,即锁相环)是最常用的IP核之一,其性能强大,可以对输入到FPGA的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟。

  • 在Altera中,使用的锁相环是模拟锁相环,对应的还有数字锁相环。相对于数字锁相环,我们的模拟锁相环输出的信号稳定度高、相位连续可调、延时连续可调。但当温度过高或电池辐射过强会导致失锁。

1、工作原理

首先,我们的锁相环是一个反馈系统。输入到锁相环中的ref_clk是一个参考时钟,输入到鉴频鉴相器,FD是鉴频,PD是鉴相,此外输入鉴频鉴相器中的还有一个比较时钟,就是反馈的时钟。如果输入的参考时钟与比较时钟对比大小一致则输出0,表示相等,输出一个变大的成正比的一个值,表示大于,输出一个变小的成正比的,表示小于。鉴频鉴相器的信号输出到LF(环路滤波器),LF根据输入的不同值输出不同电压幅值。接着来到 VCO(压控振荡器),输入到压控振荡器的电压越高,输出信号的频率越高。在经过多次对比调节,参考时钟频率会与比较时钟频率相等,最后输出。

2、倍频

因为输入鉴频鉴相器的两个信号会趋于相等,那么在反馈时进行一个div,那么就会使的输出的信号增大几倍。那么你是否会想到,分频的话,div应该位于哪里?

3、分频

直接对输入的参考时钟进行分频的信号输入鉴频鉴相器,最终输出的信号与反馈信号一致,并且在鉴频鉴相器的中,反馈信号会与分频后的信号一致,便实现了分频。

2、PLL-IP核配置

首先,我们需要新建文件体系,四个文件夹sim、rtl、prj、doc。在prj中新建工程,参考:
https://blog.csdn.net/qq_52215423/article/details/128006883

  • 选择IP核:

  • 搜索IP核并双击点击进行配置:


- 设置IP核存放位置

在prj文件夹下新建ip_core文件夹用于存放IP文件,在之下又新建子文件pll_ip用于存放我们的目标ip。

  • 弹出设置界面:

  • 参数配置:

这里的时钟反馈模式有:
1、源同步模式
2、无补偿模式
3、标准模式
4、零延迟缓冲模式
5、确定性延迟补偿模式
Altera PLL IP核四种工作模式介绍

  • 点击next:
  • 继续next:

这个界面主要是拓展频谱时钟和带宽可编程功能,属于锁相环高级特性,我们先不进行操作。

  • 继续next:

这里也是高级属性,不进行使用。

  • 继续next,进入第二个设置界面:

这个界面是锁相环的重配置,主要用于锁相环动态重配置和动态相位重配置,也属于高级属性,我们不能进行使用,选择默认。

  • 继续next来到输出时钟的设置:

每个锁相环可以输出五个时钟,对应下面有五个子选项。

  • 下面是设置完的参数:

  • 继续next进入eda设置界面:

这里没有我们需要设置的界面,继续next。

  • Summary设置界面:

点击finish,完成配置。

选择yes,完成ip核的设置。

  • 绘制波形图:

  • 查看pll_ip文件夹下是否生成ip文件:

3、PLL-IP核调用

  • 查看ip核的实例化文件(pll_ip_inst):
pll_ip	pll_ip_inst (
	.inclk0 ( inclk0_sig ),
	.c0 ( c0_sig ),
	.c1 ( c1_sig ),
	.c2 ( c2_sig ),
	.c3 ( c3_sig ),
	.locked ( locked_sig )
	);
  • 编写顶层文件:
module pll (
    input wire sys_clk,
    output wire clk_mul_2,
    output wire clk_div,
    output wire clk_pha_90,
    output wire clk_duc_20,
    output wire locked
);
pll_ip	pll_ip_inst (
	.inclk0 ( sys_clk ),
	.c0 ( clk_mul_2 ),
	.c1 ( clk_div ),
	.c2 ( clk_pha_90 ),
	.c3 ( clk_duc_20 ),
	.locked ( locked )
	);    
endmodule
  • 引入顶层文件后进行全编译:

编译通过。

  • 补充:临时想对ip核进行重新的设置:
    勾选IP_Component

    双击进行修改:
  • 不小心把IP核文件删除:

右击将文件进行添加即可

4、PLL-IP仿真

  • 仿真文件:
`timescale 1ns/1ns
module tb_pll();
reg sys_clk;

wire clk_mul_2;
wire clk_div;
wire clk_pha_90;
wire clk_duc_20;
wire locked;

initial begin
     sys_clk=1'b1;
end

always #10 sys_clk=~sys_clk;

pll pll_inst(
    .sys_clk    (sys_clk), 
    .clk_mul_2  (clk_mul_2),
    .clk_div    (clk_div),
    .clk_pha_90 (clk_pha_90),
    .clk_duc_20 (clk_duc_20),
    .locked     (locked)
);

endmodule

将仿真文件添加,然后进行全编译,然后进行仿真设置(忽略),接着就是仿真。

  • 仿真波形图:

仔细对照绘制的波形图或查看波形图的频率、相位以及占空比与设置的一致,仿真通过。


三、总结

这篇文章主要介绍了IP核以及它的一些用法,此外了解了PLL (Phase Locked Loop,即锁相环)是最常用的IP核之一,可以通过PLL_IP获得期望的时钟。后续会继续更新其他IP核的内容。

四、参考资料

1、Altera PLL IP核四种工作模式介绍
2、野火FPGA系列教学视频

有关IP核简介及PLL_IP核的调用的更多相关文章

  1. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  5. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  8. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  9. ruby - 如何找到调用当前方法的方法 - 2

    如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====

  10. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

随机推荐