时钟分频器模拟

时间:2014-05-06 21:39:23

标签: vhdl

我已经用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;

2 个答案:

答案 0 :(得分:1)

模拟显示您的代码确实生成了分频时钟,但是 分区中使用的大整数给出的时间最长为500毫秒 划分100 MHz时钟,所以你可能没有等待足够长的时间: - )

您可以在下面看到模拟。

enter image description here

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

对代码的一些评论:

  • clk*的分配应该放在if rising_edge(clk)内,因为您 可能希望这些输出来自触发器。

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

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

答案 1 :(得分:0)

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

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