在 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';
但这不是故障友好的。您最好像您已经在做的那样为您的作业打卡。
虽然我已经完成了数字逻辑的大学课程,但我是 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';
但这不是故障友好的。您最好像您已经在做的那样为您的作业打卡。