zoukankan      html  css  js  c++  java
  • FPGA零基础学习:IP CORE 之 PLL设计

    本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
    系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用。话不多说,上货。

    基础 IP 核:IP CORE 之 PLL

    作者:郝旭帅  校对:陆辉

    本篇实现基于叁芯智能科技的SANXIN -B01 FPGA开发板,以下为配套的教程,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。

    SANXIN-B01 Verilog教程-郝旭帅团队

     

    基础IP核概述

    FPGA利用可配置逻辑单元完成电路功能,但是配置的电路功能只能完成数字逻辑功能,对于一些模拟电路功能无法实现,例:温度测量等。对于某些高速数据流的发送和接收也无法采用可配置逻辑单元进行收发。例:数据速率超过1GHz。对于常用一些缓存,可配置逻辑单元虽然可以实现,但是所使用的面积太大。例如:存储器。

    如果FPGA无法实现或者FPGA实现的缺点比较大时,厂家会将一部分常用的ASIC电路直接放入到FPGA内部,配置好接口后,可配置逻辑就可以与ASIC进行通信。

    对于一部分比较复杂的设计,厂家也会将设计结果封装成一个模块,供给设计者使用。

    将上述的电路统称为IP核(Intellectual Property core),IP核就是知识产权核或知识产权模块的意思,在EDA技术开发中具有十分重要的地位。IP主要分为软IP、固IP和硬IP。软IP是用Verilog/VHDL等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。固IP是完成了综合的功能块。硬IP提供设计的最终阶段产品--掩膜。

    IP(知识产权)核将一些在数字电路中常用,但比较复杂的功能块,如FIR滤波器、SDRAM控制器、PCI接口等设计成可修改参数的模块。随着CPLD/FPGA的规模越来越大,设计越来越复杂(IC的复杂度以每年55%的速率递增,而设计能力每年仅提高21%),设计者的主要任务是在规定的时间周期内完成复杂的设计。调用IP核能避免重复劳动,大大减轻工程师的负担,因此使用IP核是一个发展趋势,IP核的重用大大缩短了产品上市时间。

    利用IP核设计电子系统,引用方便,修改基本元件的功能容易。具有复杂功能和商业价值的IP核一般具有知识产权,尽管IP核的市场活动还不规范,但是仍有许多集成电路设计公司从事IP核的设计、开发和营销工作。

    基础IP核:IP CORE 之 PLL

    Altera锁相环(ALTPLL)IP核是由锁相环(PLL)电路实现。锁相环是一种反馈控制系统,它可以自动调整本地产生的信号的相位,以匹配输入信号的相位。锁相环通过振荡器产生的波形的相位匹配输入信号的相位来工作。输入信号的微小变化首先表现为输入信号和振荡器产生波形的相位偏差。这个相位偏差作为一个调整信号,改变本地锁相环震荡频率来匹配输入信号。输入信号和本地振荡器之间的锁相关系称为锁相环路。

    锁相环经常用于高速通信、计算机和其他的电子应用中。可以使用PLL产生稳定频率的时钟,从高噪声的通信信道中恢复信号或者在设计中产生各种时钟信号。

    锁相环包括前置分频模块(N counter),鉴频鉴相器(PFD),电荷泵(Charge pump),环路滤波器(Loop filter),压控振荡器(VCO),反馈分频模块(M counter),后期分频模块(K和V计数器)。

    PFD检查出Fref和Feedback两个信号之间的相位和频率差距,然后控制电荷泵和环路滤波器产生一个调整电压,此电压控制VCO。根据此电压,VCO会产生一个更高或者更低的时钟。通过不断的反馈,Fref和Feedback拥有相同的频率和相位后,锁相环就锁定了。

    插入的前置分频模块和反馈分频模块的作用是将信号进行分频处理。即:Fref=Fin/N,Feedback=Fvco/M。PLL锁定后,Fref=Feedback,即Fin/N=Fvco/M。Fvco=(Fin*M)/N,在经过后期分频分模块,Fout=Fvco/K=(Fin*M)/(N*K)。

    • 硬件介绍

    开发板上的FPGA芯片为EP4CE6E22C8,此芯片内部含有两个通用的PLL。

    • 设计要求

    利用开发板外部扩展针,输出频率为100MHz和频率为10Mhz的方波,并利用示波器进行测量。

    • 设计分析

    开发板的晶振为50MHz,FPGA内部嵌入有PLL模块。使用PLL模块可以方便快速的产生100MHz和10MHz的方波。

    PLL模块有一个高电平有效的复位,开发板外部输入按键为低电平有效,故而需要将外部复位信号进行反相。

    PLL模块可以输出5个时钟,我们利用两个抽头即可。

    PLL模块会输出锁定标志信号,设计时直接将此信号输出到外部扩展针即可。

    • 架构设计和信号说明

    此模块命名为pll_test。

    本设计共有两个模块构成:一个反相器和一个PLL模块(pll_my)。

    • pll_my设计实现

    本模块为FPGA内部ip 模块,不需要设计,只是需要利用参数化界面配置一些信息,然后调用出来即可。

    在调用IP模块之前,建议大家在qprj文件夹中建立一个ipcore的文件夹,然后在ipcore文件夹中建立一个pll_my的文件夹。此文件夹用于存放后面建立的pll_my的文件。

    打开Tools-> ip catalog。在屏幕的右侧就会出现ip catalog。

    按照下图索引方式,双击打开ALTPLL。

    选择Verilog,并指定到pll_my文件夹中(选择路径对话框后面的三个点),名字叫做pll_my(指定路径完成后,在最后的路径中,需要写入调用IP核的名称)。

    点击OK,启动PLL的参数化界面。

    在参数化界面中,本文档只讲解和本次设计相关内容,其他的配置信息可以参考《ug_altpll.pdf》(此文档在FPGA的芯片手册文件夹中)。

    指定使用的器件的速度等级为8,输入频率为50MHz。点击Next。

    此界面配置输入输出抽头,在此保持默认。点击Next。

    此界面保持默认,点击Next。

    此界面保持默认,点击Next。

    此界面保持默认,点击Next。

    此界面保持默认,点击Next。

    在界面中,选择enter output clock frequency(键入输出时钟频率),在requested settings(要求设置)中输入100MHz,Actual settings(实际设置)中不用输入,软件会自动计算键入的时钟频率是否能够实现,对于不能实现的频率,软件会输出一个比较接近的频率。

    clock phase shift为时钟相移,通过改变参数,可以达到输出时钟相移的功能。保持默认:0。

    clock duty cycle为时钟占空比,通过改变参数,可以达到输出时钟占空比不同的功能。保持默认:50。

    点击Next。

    选择使用这个时钟抽头,键入时钟频率为10MHz。

    一个PLL拥有5个时钟抽头,本次设计只使用其中两个(c0、c1)。

    点击Finsh。

    勾选上Instantiation template file(例化模板文件),点击Finish。

    询问是否将IP 文件加入工程,点击Yes。

    在工程向导窗口的file标签页下,就出现了pll_my.qip的文件。

    此时pll_my的ip core建立完成。

    • pll_test设计实现

    此模块负责调用pll_my,并且将外部复位进行取反,产生供给pll_my模块的复位信号。

    pll_my的例化文件,在pll_my文件夹内,pll_my_inst.v内部,打开后,可以直接复制。

    设计代码为:

    module pll_test (  input     wire              clk,  input     wire              rst_n,  output    wire              clk_100m,  output    wire              clk_10m,  output    wire              pll_locked);  wire                        pll_rst;  assign pll_rst = ~rst_n;  pll_my  pll_my_inst (      .areset     ( pll_rst ),      .inclk0     ( clk ),      .c0         ( clk_100m ),      .c1         ( clk_10m ),      .locked     ( pll_locked )    );endmodule

    在综合的报告中,可以看到使用了一个PLL。

    • RTL仿真

    仿真代码为:

    `timescale 1ns/1psmodule pll_test_tb;  reg                 clk;  reg                 rst_n;  wire                clk_100m;  wire                clk_10m;  wire                pll_locked;  pll_test pll_test_inst(      .clk          (clk),      .rst_n        (rst_n),      .clk_100m     (clk_100m),      .clk_10m      (clk_10m),      .pll_locked   (pll_locked)    );  initial clk = 1'b0;  always # 10 clk = ~clk;  initial begin    rst_n = 1'b0;    # 201    rst_n = 1'b1;    # 5000    $stop;  end endmodule

    在RTL仿真图中,可以看到,复位结束后,PLL并没有立刻锁定,而是输出不确定,等待一段时间后,PLL输出锁定,稳定的输出我们想要的波形。在复位期间,PLL输出的波形都是低电平。

    • 板级测试

    分配管脚,综合下板后,使用示波器测量。

    100MHz的方波测试的波形。

    10MHz方波测试波形。

    - End -

    【福利】:QQ交流群173560979,进群备注名字+学校/企业。淘宝店铺:https://shop588964188.taobao.com
    论坛网址:www.sxznfpga.com
    郝旭帅团队制作

    往期推荐

  • 相关阅读:
    [转]在Ubuntu 下安装Redis 并使用init 脚本启动
    [资源]PHP使用消息队列
    [转]reids客户端 redis-cli用法
    [转]redis.conf的配置解析
    【转】微信公共号开发,提示“该公众号暂时无法提供服务,请稍后再试”,如何解决?
    [转]php 解决json_encode中文UNICODE转码问题
    [资料]Keychain 获取设备唯一
    [转]PHP 获取服务器详细信息代码
    crontab任务取消发送邮件
    [转]php返回json数据中文显示的问题
  • 原文地址:https://www.cnblogs.com/sxznfpga/p/13271765.html
Copyright © 2011-2022 走看看