【发布时间】:2015-04-29 10:34:37
【问题描述】:
我有这个代码:
library IEEE;
use IEEE.std_logic_1164.all;
entity Controller is
port (
CLK : in std_logic;
OutENABLE : out std_logic_vector (2 downto 0);
ModuleRESET : in std_logic;
ModuleENABLE : in std_logic
);
end Controller;
architecture Controller_archi of Controller is
signal Counter : integer range 0 to 4200 := 0;
begin
process (CLK, ModuleRESET)
begin
if ModuleRESET = '0' then
OutENABLE <= (others => '0');
Counter <= 0;
elsif rising_edge(CLK) then
if ModuleENABLE = '1' then
Counter <= Counter + 1;
case Counter is
when 0 =>
OutENABLE <= "001";
when 450 =>
OutENABLE <= "010";
when 900 =>
OutENABLE <= "100";
when 1350 =>
OutENABLE <= "001";
Counter <= 0;
when others =>
end case;
else
OutENABLE <= "000";
end if;
end if;
end process;
end Controller_archi;
但它并没有像我需要的那样工作。
我需要什么:
- 当
ModuleENABLE立即变为“1”时OutENABLE变为“001”而不是一开始rising_edge(CLK)(现在,在这段代码中,如果 ModuleENABLE 变为“1”,则 OutENABLE 不会从“000 " 到 "001",在第一个上升沿(CLK) 后变为 "001") - 当
rising_edge(CLK)和OutENABLE时计数器上升,它会在每个CLK事件中更新。 (现在,在此代码中,计数器在上升沿(CLK)时上升,但 OutENABLE 在上升沿(CLK)时更新,而不是在 CLK 上升和下降时更新)
所以我修改了代码来做到这一点:
library IEEE;
use IEEE.std_logic_1164.all;
entity Controller is
port (
CLK : in std_logic;
OutENABLE : out std_logic_vector (2 downto 0);
ModuleRESET : in std_logic;
ModuleENABLE : in std_logic
);
end Controller;
architecture Controller_archi of Controller is
signal Counter : integer range 0 to 4200 := 0;
begin
process (CLK, ModuleENABLE, ModuleRESET)
begin
if ModuleRESET = '0' then
OutENABLE <= (others => '0');
Counter <= 0;
elsif ModuleENABLE = '1' then
if rising_edge(CLK) then
Counter <= Counter + 1;
end if;
case Counter is
when 0 =>
OutENABLE <= "001";
when 450 =>
OutENABLE <= "010";
when 900 =>
OutENABLE <= "100";
when 1350 =>
OutENABLE <= "001";
Counter <= 0;
when others =>
end case;
else
Counter <= 0;
OutENABLE <= "000";
end if;
end process;
end Controller_archi;
现在代码像我在 ModelSim 中需要的那样工作,但是当我合成它或编译它并再次模拟时它不起作用。
我的问题是:
第二个代码有什么问题以及如何解决?
如果我无法修复第二个代码,我如何修改第一个代码以按我的需要工作?
【问题讨论】: