【FPGA学习】IP核(五)

1. IP核概述

1.1 IP核是什么

IP 核(Intellectual Property Core):

知识产权核,FPGA/ASIC 设计里的预制、可复用硬件模块,不是软件函数,是已经做好的硬件电路。

ASIC 和FPGA 中预先设计好的电路模块;

1.2 使用IP核的原因

1. 可靠性高

设计越来越复杂,自己设计功能难以保证;

2. 提高开发效率

规定时间内完成;

3. 加快产品上市

减轻工程师负担;

1.3 IP核的局限性

1. 移植性差

IP不能跨平台使用;

2. 功能调整空间小

黑匣子

3. 部分需付费使用

部分IP核价格昂贵;

1.4 如何使用IP核

PROJECT MANAGER -> IP CATALOG;

2. IP核之PLL实验

时钟的倍频器;

2.1 简介

Xilinx FPGA的时钟管理

CMT(Clock Management Tiles):时钟管理单元 ,可以对时钟进行管理,具有时钟倍频 、分频 、相位偏移、可编程占空比和优化抖动等功能。

PLL: phase-locked loop

MMCM: mixed-mode clock manager

CMT结构:

对于7系列来说:

CMT含有一个PLL和一个MMCM;

MMCM中包含PLL和DCM;

即,MMCM在PLL的基础上加上了相位动态调整的功能;

2.2 PLL原理

PLL:

PLL:Phase Locked Loop(锁相环)

PLL是一种时钟反馈控制电路,特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位;

PLL原理:

输出的CLK和参考CLK比较,直到输出的CLK和参考REF相同;

类比示意图:

主要就是OUT和REF;

PLL分频原理:

PLL倍频原理:

使用实际的分频后的频率与REF相比;

此时也就是相当于倍频了;

2.3 实验任务

本节的实验任务是使用开发板输出4路不同频率或相位的时钟,时钟分别为100Mhz,100Mhz(相位偏移180度)、50Mhz和25Mhz。将四路时钟分别输出至扩展口的端口,并通过示波器来测量输出结果是否正确。

2.4 操作过程

  1. 点击IP catalog 搜索;

  2. 设置PLL,并对其进行设置:

    主要是如下:

    注意设置首要的时钟频率,根据自己的开发板的时钟进行设置:

  3. 输出时钟配置:

    如下图所示:

    按照要求设置输出时钟:

  4. 本页面设置时钟端口的重命名:

  5. 这个页面是得到输出时钟的具体参数设置:

  6. 这里是总结页面:

    总的来看,主要也就是需要设置板载的时钟频率,以及最终的输出频率;

    也就是上面的,第二步 和第三步;

  7. 这里直接点击生成即可;

  8. 此时的IP核会出现在IP Sources界面:

  9. 对IP核进行例化:

    复制对应的例化模板;

代码示例:

clike 复制代码
module ip_clk_wiz(
    input       sys_clk,
    input       sys_rst_n,
    
    output      clk_100m,
    output      clk_100m_180deg,
    output      clk_50m,
    output      clk_25m
    
    );
 
wire    locked;
wire    rst_n;

assign  rst_n = sys_rst_n & locked;
 
clk_wiz_0 u_clk_wiz_0
   (
    // Clock out ports
    .clk_out1           (clk_100m),     // output clk_out1
    .clk_out2           (clk_100m_180deg),     // output clk_out2
    .clk_out3           (clk_50m),     // output clk_out3
    .clk_out4           (clk_25m),     // output clk_out4
    // Status and control signals
    .reset              (~sys_rst_n), // input reset
    .locked             (locked),       // output locked
   // Clock in ports
    .clk_in1            (sys_clk)      // input clk_in1
); 
 
endmodule

2.5 仿真

有两种仿真的方法:

  1. 使用Vivado自带的仿真器进行仿真;
  2. 联合仿真,先产生Vivado仿真库,然后和Modelsim进行联合仿真;

2.5.1 使用Vivado自带的仿真器

  1. 右击Design Sources 添加源文件:
  2. 添加源文件与tb代码,在添加tb代码的时候,注意要选择simulation sources;

    这部分需要分两次添加:
  3. 点击运行仿真;
  4. 这里可以设置初始运行时间:
  5. 此时界面就已经产生了对应的波形
  6. 此部分设置对应的运行时间;
  7. 仿真结束后关闭即可;

2.5.2 Vivado+Modelsim联合仿真

  1. 生成对应的编译仿真库

  2. 按照下图进行设置,注意就是选择对应的系列,选的越多编译越慢;

  3. 编译完成以后,点击设置,对第三方的软件进行关联;

    并在仿真部分选择modelsim软件与对应的库,并勾选下面的选项;

  4. 点击开始仿真,此时如果正常,那么就直接打开Modelsim软件了;

    就像使用Modelsim软件一样即可;

2.6 上板验证

RTL文件代码:

clike 复制代码
module ip_clk_wiz(
    input       sys_clk,
    input       sys_rst_n,
    
    output      clk_100m,
    output      clk_100m_180deg,
    output      clk_50m,
    output      clk_25m
    
    );
 
wire    locked;
wire    rst_n;

assign  rst_n = sys_rst_n & locked;
 
clk_wiz_0 u_clk_wiz_0
   (
    // Clock out ports
    .clk_out1           (clk_100m),     // output clk_out1
    .clk_out2           (clk_100m_180deg),     // output clk_out2
    .clk_out3           (clk_50m),     // output clk_out3
    .clk_out4           (clk_25m),     // output clk_out4
    // Status and control signals
    .reset              (~sys_rst_n), // input reset
    .locked             (locked),       // output locked
   // Clock in ports
    .clk_in1            (sys_clk)      // input clk_in1
); 
 
endmodule

tb激励文件代码:

clike 复制代码
`timescale 1ns/1ns

module tb_ip_clk_wiz();
 
parameter clk_period = 20;
 
reg     sys_clk;
reg     sys_rst_n;

wire    clk_100m;
wire    clk_100m_180deg;
wire    clk_25m;
wire    clk_50m;

initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;           
    #200
    sys_rst_n <= 1'b1;

end

always #(clk_period/2) sys_clk = ~sys_clk;

//


// 
ip_clk_wiz u_ip_clk_wiz(
    .sys_clk                    (sys_clk),
    .sys_rst_n                  (sys_rst_n),
    .clk_100m                   (clk_100m),    
    .clk_100m_180deg            (clk_100m_180deg),
    .clk_50m                    (clk_50m),                        
    .clk_25m                    (clk_25m)
    
    );

endmodule

XDC约束文件:

确定要输出的引脚,对引脚进行约束:

这是一个标准引脚约束的代码:

clike 复制代码
set_property -dict {PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports clk_100m]

完整版本:

clike 复制代码
#时序约束
create_clock -period 20.000 -name sys_clk [get_ports sys_clk] 

#IO引脚约束
#----------------------系统时钟---------------------------
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]

#----------------------系统复位---------------------------
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

set_property -dict {PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports clk_100m]
set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports clk_100m_180deg]
set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk_50m]
set_property -dict {PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports clk_25m]
相关推荐
叼烟扛炮2 小时前
Linux 学习笔记(四十七):TCP 状态机与 tcpdump 抓包排雷实战
linux·网络·笔记·学习·tcp/ip·tcpdump
東隅已逝,桑榆非晚2 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
动词ing3 小时前
【学习笔记】动态数码管显示
笔记·学习
陈年老古董3 小时前
ClickHouse 单机搭建记录
hive·笔记·学习·clickhouse·硬件架构
艾莉丝努力练剑3 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk
蓝祁子yoky3 小时前
Qt学习日记 Day15:网络编程(二)- UDP基础
网络·qt·学习
FserSuN3 小时前
Hive 分区表存储与查询优化学习总结
hive·hadoop·学习
2603_969694853 小时前
【MySQL学习笔记】DQL(基础查询/条件/聚合/分组/排序/分页)与 DCL(用户权限)全解析
数据库·笔记·学习·mysql·学习方法
承渊政道3 小时前
Linux网络学习【数据链路层、ARP工作过程与ARP欺骗详解】
linux·网络·学习·数据链路层·arp