在 VHDL 中生成 2 个时钟脉冲

Generating 2 clock pulses in VHDL

虽然我已经完成了数字逻辑的大学课程,但我是 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; 

仿真图片:

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

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

所以<=赋值直到进程结束才赋值。所以clk_counter整个过程都是9。它将设置为 10,但直到过程结束才会设置,因此 if-statement 不会触发。 所以下一个过程的评估,clk_counter 是 10。现在 if-statement/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';

但这不是故障友好的。您最好像您已经在做的那样为您的作业打卡。