首页 > 解决方案 > 在 MAX10 FPGA 上使用 PLL 产生优于 400Mhz 的时钟信号

问题描述

我正在使用 10M50 FPGA 通过 MIPI-CSI2 从相机读取数据,但我在板上的时钟运行速度不够快。所以现在我正在尝试使用 PLL 来生成更快的时钟信号。

我正在使用以下代码来测试生成的时钟信号是否正确,方法是手动设置 v1 变量,使我的 LED 每秒闪烁一次。在本例中,PLL(由 Quartus IP 目录中的 ALTPLL 向导生成)被设置为接收 100MHz 时钟信号,并且应该显示 400MHz 时钟信号,但是没有任何反应。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

LIBRARY altera_mf;
USE altera_mf.all;

--   debut entity     --

entity test is 
    port(
        CLK : in std_logic;
        LED0 : out std_logic     -- leds are ON for '0' and OFF for '1'
    );
end test;


-- debut architecture --

architecture test_led of test is 
signal s_led0 : std_logic :='1';
signal c0 : std_logic;

component pll400
    port(   inclk0      : IN STD_LOGIC  := '0';
            c0      : OUT STD_LOGIC 
    );
end component;

begin

clk1:pll400
    port map(inclk0 => CLK, 
                c0 => c0
    );

p:process(c0,s_led0)
variable v1 : integer range 0 to 800000000 :=0;
begin               
    if c0'event and c0 = '1' then
        v1 := v1 + 1;       
        if v1 = 400000000 then
            s_led0 <='0';   
        end if; 
        if v1 = 800000000 then
            s_led0 <='1';
            v1 := 0;
        end if;
    end if;

LED0 <= s_led0;
end process;    
end test_led;

我能够使用它来生成和测试高达 320MHz 的信号,但它似乎无法更高,尽管我没有找到任何文件说这是不可能的。(我的资料主要是 10M50 用户指南和 Intel Max10 Clocking and PLL User guide)

我也尝试在级联中使用 PLL,将 100 -> 200Mhz PLL 的输出时钟输入到 200 -> 400MHz PLL 但我得到了相同的结果,这意味着我的 LED 不会闪烁。

那么我是否缺少某些东西,或者我目前的电路板不可能产生这样的信号?

编辑:我用作参考的数据表: MAX10 Clocking and PLL 10M50 User Guide

标签: vhdlclockintel-fpga

解决方案


您的设计是否受到时间限制?时间报告说什么?

也许不是锁相环,但结构本身足够慢,可以在更高的频率下工作。你有一些 30 位比较器和一个 30 位加法器,以 400 Mhz 单时钟工作,这对 MAX10 来说是相当苛刻的。您应该考虑增加加法器流水线,这将提高其频率性能,但它只会在每 2 个或 3 个或更多时钟周期产生一次结果,因此您将需要在其输出端增加一个锁存器。

至于比较器,如果您切换到 2 的幂作为限制,则可能根本不需要它们。将 v1 设置为 31 位值,并为 s_led0 使用 v1 的第 31 位,这将为您提供另一个分频比,但逻辑上要简单得多。而且您也不需要重置 v1 - 加法器会自动环绕它。


推荐阅读