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 中的通用时钟分频器的主要内容,如果未能解决你的问题,请参考以下文章