首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带十进制的VHDL时钟分频器

带十进制的VHDL时钟分频器
EN

Stack Overflow用户
提问于 2012-06-18 16:36:47
回答 2查看 6.7K关注 0票数 3

我正在尝试将一个50 VGA的时钟降低到25.175 VGA,以便在VGA控制器中使用。我已经有了一个时钟分频器,但每当当前时钟速度和所需时钟速度的结果分频不是整数时,就会遇到减慢时钟的问题。即50000000/25175000 ~ 1.98.时钟分频器编译并运行,但如果分频为十进制数,则不输出任何内容。下面是我的代码:

代码语言:javascript
复制
    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兆赫?另外,有没有人知道如何放慢时钟的速度,以便编译器对结果除法为十进制值感到满意?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-18 22:43:12

一般来说,实数是不可合成的,所以你需要想出一个基于整数的解决方案。

这是一个相当棘手的比例,因为它几乎是2:1,但不完全是。大多数基于边沿的时钟分频器电路只工作在原始时钟的一个边沿上,因此可以除以的最低比率是2。在这种情况下,您必须在时钟的两个边沿上工作。

一旦你得到了它,你需要有一个计数器,它以你的比率的分母为增量,并且它超过了分子,然后输出一个时钟边沿。

代码语言:javascript
复制
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是不可能的。

票数 4
EN

Stack Overflow用户

发布于 2012-06-19 03:27:22

我已经编写了大量的VGA控制器,仅仅使用25 MHz的时钟并不是什么大问题。如果您确实想要更接近一些,那么您的FPGA可能有某种类型的时钟管理器(我只熟悉Xilinx设备),它将允许您通过乘除输入时钟来合成输出时钟。

此外,虽然使用派生/门控时钟(在进程中直接设置值的时钟)在这种情况下可能会对您起作用,但它可能会导致许多难以调试的问题。更好的解决方案是生成时钟使能,然后在相同的(快速)时钟上运行所有内容。

最后一件事,虽然这可能是首选风格的问题,但我通常使用时钟处理语句而不是WAIT语句(如下所示,具有上升沿触发器、同步复位和时钟使能)。我发现它更容易阅读和理解,而且不太容易编写不能合成的结构,如wait for 10ns;,或具有多个WAIT的语句。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11079358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档