VHDL 中的通用时钟分频器

Posted

技术标签:

【中文标题】VHDL 中的通用时钟分频器【英文标题】:Generic clock divider in VHDL 【发布时间】:2020-04-06 17:42:39 【问题描述】:

我想用 VHDL 写一个像这样的通用时钟分频器:

entity Generic_Clk_Divider is
     Generic(
            INPUT_FREQ: integer := 100;
            OUTPUT_FREQ: integer  := 25;
             );
      Port (
             Clk: in std_logic;
             Rst: in std_logic; 
             Generated_Clk: out std_logic
           );
end entity;

architecture Behavioral of Generic_Clk_Divider is

signal Cnt: integer := 0;
signal Gen_Clk : std_logic := '0';
constant MaxCnt: integer := (integer (INPUT_FREQ/OUTPUT_FREQ)) - 1;


begin 

    process(clk, Rst)
    begin 
        if (Rst = '1') then
            Cnt <= 0;
        elsif rising_edge(Clk) then 
            Cnt <= Cnt + 1 ;
            if (Cnt = MaxCnt) then 
                Gen_Clk <= not Gen_Clk;
                Cnt <= 0;
            end if;
        end if;
     Generated_Clk <= Gen_Clk;
    end process;
end architecture;

如果我使用测试台对其进行测试,它可以工作,但如果我将生成的 Clk 信号与另一个组件(在本例中为 VGA 控制器)一起使用,但如果我将它放在板上,则它不起作用。我的问题是关于 2 个整数之间的划分,董事会似乎不承认它。

【问题讨论】:

...如果我将生成的 Clk 信号与另一个组件(在这种情况下为 VGA 控制器)一起使用,如果我将它放在板上,它就不起作用了。 你能更具体一点?您在综合过程中收到了哪些警告?你如何确定它不起作用?另请注意计数 0、1、2、3,然后将 Gen_Clk 反相将得到 Gen_Clk 时钟周期,即 8 100 MHz 时钟或 12.5 MHz。根据设备的不同,您可能有时钟资源可以提供内置的 4 分频时钟。 【参考方案1】:

Integer/ Integer,返回一个整数,余数被丢弃。因此,对于 INPUT/OUTPUT 是彼此整数倍的情况,这很好。但否则,它将无法正常工作。

例如。

200/75 = 2
150/40 = 3

等等

真正起作用的唯一方法是使用真实类型,这样您就可以找到分数关系,然后使用更大的计数器值来获得精确的关系。

但是,这根本没有真正的帮助,因为像这样的时钟分频器是非常不鼓励的。逻辑生成的时钟使时序分析变得困难并导致时序问题。使用真实时钟并生成时钟使能更安全。

【讨论】:

哪些综合供应商会自动检查多时钟路径?您的回答更像是一条评论,这个问题缺少具体问题。 在这种情况下,我使用了 100 和 25,但它仍然不起作用

以上是关于VHDL 中的通用时钟分频器的主要内容,如果未能解决你的问题,请参考以下文章

SAMD21时钟配置

verilog的bufg作用

帮我详细解读一下这个分频模块啊

systemC构建时钟分频器

时钟分频器

STM32通用定时器时钟源探究