【问题标题】:Clock divider simulation时钟分频器模拟
【发布时间】:2014-05-06 21:39:22
【问题描述】:

我已经用 VHDL 语言为分频器编写了这段代码,但我不明白为什么我的频率在模拟时没有被分频。我做错了什么?

library IEEE;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_1164.all;

entity div is
  port(clk                      : in  std_logic;
       clk1, clkafisare, clkorg : out std_logic);
end entity;

architecture fct_div of div is
begin
  process(clk)
    variable c, e, g : integer   := 0;
    variable d, f, h : std_logic := '0';
  begin
    if rising_edge(clk) then
      e := e+1; c := c+1; g := g+1;
      if g = 12000000 and h = '0' then
        h := '1'; g := 0;
      elsif g = 12000000 and h = '1' then
        h := '0'; g := 0;
      end if;
      if c = 25000000 and d = '0' then
        d := '1'; c := 0;
      elsif c = 25000000 and d = '1' then
        d := '0'; c := 0;
      end if;
      if e = 100000 and f = '0' then
        f := '1'; e := 0;
      elsif e = 100000 and f = '1' then
        f := '0'; e := 0;
      end if;
    end if;
    clk1       <= d;
    clkafisare <= f;
    clkorg     <= h;
  end process;
end fct_div;

【问题讨论】:

  • 你得到了什么,你的预期输出是什么?

标签: vhdl


【解决方案1】:

模拟表明您的代码确实会生成分频时钟,但是 除法中使用的大整数给出了最多 500 毫秒的周期,当 分频 100 MHz 时钟,因此您可能没有等待足够长的时间 :-)

您可以在下面看到模拟。

您确实可以将流程状态存储在流程变量中,因为该状态 在过程暂停之间保留。请注意,该过程不是 在运行之间调用,就像一个普通的软件功能,但只是暂停 最后(当有敏感列表时),然后在 敏感度列表中的信号之一的事件。

代码的一些cmets:

  • 分配给clk* 应该进入if rising_edge(clk),因为你 可能希望这些输出来自触发器。

  • 考虑使用clk* 中的状态,而不是dfh 变量,因为它几乎是多余的。

  • 考虑使用基于std_logic_vector 的信号制作计数器,而不是 的内部整数变量,因为调试通常更容易 使用可以很容易地在波形中显示的信号,你有更好的 控制实施。例如,在调试时,您将拥有 看到计数器实际上增加了,因此可能已经理解 分频器工作,但生成的时钟只有很长的周期。

【讨论】:

  • 我不确定我是否同意你的最后一个要点——为什么不使用integer(或至少unsigned!)类型的信号?它们完全可以作为波形查看。使用我的 modelsim 版本,variables 也是如此,我一直这样做。
【解决方案2】:

将变量转换为架构级别的信号,并从变量赋值切换到信号赋值。

您还应该将 clk1、clkafisare 和 clkorg 的赋值移到第一个 if 语句中来描述边沿敏感寄存器。如果您没有测试平台,您还必须编写一个测试平台来生成 clk 信号,然后才能获得任何输出。

【讨论】:

  • 您确实可以将流程状态存储在流程变量中,因为该状态在流程暂停之间保留。请参阅我的答案中的其他 cmets。
  • 你确实是对的。我在考虑子程序中的变量时遇到了麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2018-09-19
  • 2021-08-15
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多