我正在使用10M50 FPGA通过MIPI-CSI2从摄像机读取数据,但是板上的时钟运行得不够快。因此,现在我正在尝试使用PLL生成更快的时钟信号。
我正在使用以下代码通过手动设置v1变量来测试我生成的时钟信号是否正确,以便我的led每秒闪烁一次。在该示例中,PLL(由Quartus IP Catalog中的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 PLL10M50 User Guide
您的设计时机是否固定?时序报告说什么?
也许不是PLL,但是结构本身足够慢,无法在更高的频率下工作。您有一些30位比较器和一个30位加法器以400 Mhz的单时钟工作,这对于MAX10来说非常苛刻。您应该考虑增加加法器流水线,这将提高其频率性能,但每2或3个或更多时钟周期只能产生一次结果,因此您需要在其输出端附加一个锁存器。
至于比较器,如果您切换为2的幂作为极限,则可能根本不需要它们。将v1设置为31位值,并对s_led0使用v1的第31位,这将为您提供另一个分频比,但是在逻辑上更加简单。而且您也不需要重置v1-加法器会自动将其环绕。