我正在尝试将一个50 VGA的时钟降低到25.175 VGA,以便在VGA控制器中使用。我已经有了一个时钟分频器,但每当当前时钟速度和所需时钟速度的结果分频不是整数时,就会遇到减慢时钟的问题。即50000000/25175000 ~ 1.98.时钟分频器编译并运行,但如果分频为十进制数,则不输出任何内容。下面是我的代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Clockdiv IS PORT (
Clkin: IN STD_LOGIC;
Clk: OUT STD_LOGIC);
END Clockdiv;
ARCHITECTURE Behavior OF Clockdiv IS
CONSTANT max: INTEGER := 50000000/25175000;
CONSTANT half: INTEGER := max/2;
SIGNAL count: INTEGER RANGE 0 TO max;
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clkin'EVENT and Clkin = '1';
IF count < max THEN
count <= count + 1;
ELSE
count <= 0;
END IF;
IF count < half THEN
Clk <= '0';
ELSE
Clk <= '1';
END IF;
END PROCESS;
END Behavior;我在谷歌上搜索,发现使用REAL数据类型将允许您使用小数,但当我将使用的变量更改为REAL时,Quartus给出错误:Error (10414): VHDL Unsupported Feature error at Clockdiv.vhd(12): cannot synthesize non-constant real objects or values。
然后,如果我将“CONSTANT”更改为count类型,则会得到错误:Error (10477): VHDL error at Clockdiv.vhd(18): name "count" must represent signal。
谁知道我怎么才能把时钟降到25.175兆赫?另外,有没有人知道如何放慢时钟的速度,以便编译器对结果除法为十进制值感到满意?
谢谢
发布于 2012-06-18 22:43:12
一般来说,实数是不可合成的,所以你需要想出一个基于整数的解决方案。
这是一个相当棘手的比例,因为它几乎是2:1,但不完全是。大多数基于边沿的时钟分频器电路只工作在原始时钟的一个边沿上,因此可以除以的最低比率是2。在这种情况下,您必须在时钟的两个边沿上工作。
一旦你得到了它,你需要有一个计数器,它以你的比率的分母为增量,并且它超过了分子,然后输出一个时钟边沿。
PROCESS
BEGIN
WAIT UNTIL Clkin'EVENT;
IF count < max THEN
count <= count + DENOMINATOR;
ELSE
count <= 0;
END IF;
IF count > NOMINATOR THEN
Clk <= ~Clk;
END IF;
END PROCESS;对于这个比率,我认为最小的表示方法是2000/1007。
这样做的问题是,你会得到一个基本上是25 The的时钟,但偶尔(每2000 /7次迭代)你会得到一个额外的边缘。它不会是25.175 won的时钟。如果没有锁相环,从50 PLL得到25.175 PLL是不可能的。
发布于 2012-06-19 03:27:22
我已经编写了大量的VGA控制器,仅仅使用25 MHz的时钟并不是什么大问题。如果您确实想要更接近一些,那么您的FPGA可能有某种类型的时钟管理器(我只熟悉Xilinx设备),它将允许您通过乘除输入时钟来合成输出时钟。
此外,虽然使用派生/门控时钟(在进程中直接设置值的时钟)在这种情况下可能会对您起作用,但它可能会导致许多难以调试的问题。更好的解决方案是生成时钟使能,然后在相同的(快速)时钟上运行所有内容。
最后一件事,虽然这可能是首选风格的问题,但我通常使用时钟处理语句而不是WAIT语句(如下所示,具有上升沿触发器、同步复位和时钟使能)。我发现它更容易阅读和理解,而且不太容易编写不能合成的结构,如wait for 10ns;,或具有多个WAIT的语句。
process(clk)
begin
if(rising_edge(clk)) then
if(sync_reset = '1') then
--Reset logic
elsif(clk_enable = '1') then
--Actual functionality
end if;
end if;
end process;https://stackoverflow.com/questions/11079358
复制相似问题