0

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

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

2个时钟的数据表:

https://gyazo.com/485e354bf8cfef984757e2014fa8fde3

用于测试合成但仿真不正确的 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; 

仿真图片:

https://gyazo.com/ad902a9a8066144692f2672484672b8d

4

1 回答 1

1

好吧,您的代码还不错,但是有一个问题。

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

所以<=直到过程结束才分配分配。所以整个过程的 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';

但这对故障不友好。你应该最好为你的作业计时,就像你已经在做的那样。

于 2017-02-15T10:10:46.883 回答