【问题标题】:Generating 2 clock pulses in VHDL在 VHDL 中生成 2 个时钟脉冲
【发布时间】:2017-02-14 18:52:17
【问题描述】:

虽然我已经完成了数字逻辑的大学课程,但我是 VHDL 设计的新手,我希望有人可以帮助我创建 2 个依赖于彼此状态的时钟信号。

我在 DE2-115 FPGA 板上使用 50 MHz 时钟,用于创建 5MHz 时钟(名为 dclk_5)。但是,模拟显示了两个信号,但运行时间仅为 200 ns,并且不再运行。为什么仿真运行时间不超过 200 ns?

2 个时钟的数据表:

用于测试合成但仿真不正确的 dclk_5 和 clk_50 的替代 VHDL 设计:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity DCLK_top is
port(
    clk_50  : in std_logic;
    sw         : in std_logic;
    dclk_5  : out std_logic
);

end DCLK_top;

architecture behaviour of DCLK_top is
    signal clk_counter          : integer range 0 to 10 := 0;
    signal dclk_counter         : integer range 0 to 8  := 0;
    signal dclk_pause_counter   : integer range 0 to 7  := 0;

    signal dclk_pause               : std_logic := '0';
    signal clk_pause_counter    : integer range 0 to 7 := 0;

begin
    dclk_proc : process(clk_50)
    begin

        if(clk_50'event and clk_50='1' ) then
            clk_counter <= clk_counter+1;

            if(clk_counter=10) then
                clk_counter <= 0;
            end if;

            if(clk_counter<5) then
                dclk_5 <= '0';
            else
                dclk_5 <= '1';
            end if;
        end if;

    end process dclk_proc;
end architecture behaviour; 

仿真图片:

【问题讨论】:

  • 我对Quartus不太了解,但是没有像xilinx这样的生成时钟的工具吗?你既没有解释你的确切问题是什么......代码似乎是可综合的......我会把start_dclk = '1'放在另一个if中。
  • 我使用 ModelSim 生成时钟,但问题是 50MHz 本身可以正常运行任意时间,但是当我包含 dclk (5MHz) 时,整个模拟将在 400ns 后停止为 1 个 dclk 周期。所以我假设问题出在我的设计之内。我还将用模拟的屏幕截图更新帖子。
  • 你的问题不清楚,结果是什么,预期的结果是什么?请参阅How do I ask a good question?How to create a Minimal, Complete, and Verifiable example。最初在 Electrical Engineering Stack Exchange 上的地址为 Quartus VHDL ModelSim not showing what I want,Stack Overflow 上的问题指南有所不同。
  • 看一下信号分配。在仿真下,通常在过程完成之前不会更新信号。我建议你使用变量。使用变量,值会立即更新,使用信号......你必须等待一个增量时间。但是......我还没有理解这个问题......你如何运行Modelsim?您正在监控哪些信号? Modelsim 会给你错误信息吗?遵循@user1155120 的建议。拆分代码并进行增量测试。
  • 您可能想使用rising_edge(clk_50) 而不是clk_50'event and clk_50='1'

标签: vhdl clock quartus hardware-programming


【解决方案1】:

嗯,你的代码还不错,但是有一个问题。

clk_counter <= clk_counter+1;
if(clk_counter=10) then
    clk_counter <= 0;
end if;

所以&lt;= 分配直到进程结束才分配。所以整个过程的 clk_counter 是 9。它将被设置为 10,但直到进程结束,所以 if 语句不会触发。 所以进程的下一个评估,clk_counter 是 10。现在 if 语句 /will/ 触发。但是,在此之前,您想将 10+1 = 11 分配给 clk_counter.... 但这是不允许的,因为 clk_counter 的范围是 0 到 10。您可以将范围设置为 11,这不会发生。但是代码并没有做你想做的事情。 所以,更简洁的代码更好恕我直言。例如:

if(clk_counter<10) then
    clk_counter <= clk_counter+1;
else
    clk_counter <= 0;
end if;

您还可以将 dclk 的分配与进程分开。例如:

dclk <= '0' when (clk_counter<5) else '1';

但这对故障不友好。您最好像您已经在做的那样为您的作业计时。

【讨论】:

  • 附注下次请报错:modelsim将11分配给0到10范围的信号时会报错。错误信息非常重要!他们已经可以帮助您解决您自己的问题....
  • 如果你看一下波形,dclk 在第六个时钟被激活,尽管在第五个时钟被激活。这就是您的答案所解决的问题,并且不能解决模拟器的问题。但是,我对 Modelsim 了解不多,但在 ISim range 中,作业已被弃用。
  • 是的,当然可以。那是因为 clk_count 在一个时钟上变为 5,但被 (clk_count
  • 它有效!我更改了您提到的 if 语句,clk_counter 范围也更改为 9,现在它可以工作了。感谢您的帮助!
猜你喜欢
  • 2018-07-28
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多