Как установить значение в модулеEN - VHDL

-4

У меня этот код:

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", он изменяется на "001" после первого восходящего_задания (CLK)) Счетчик возрастает, когда rising_edge(CLK) и OutENABLE обновляет каждое событие CLK. (Теперь, в этом коде, счетчик растет вверх, когда raise_edge (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, но когда я его синтезирую или скомпилирую и снова смоделирую, он не работает.

Мой вопрос:

    Что не так со вторым кодом и как я могу это исправить?

    Если я не могу исправить второй код, как я могу изменить первый код для работы, как мне нужно?

спросил(а) 2015-04-29T13:34:00+03:00 5 лет, 5 месяцев назад
0
57

Что не так со вторым кодом и как я могу это исправить?

Ваш инструмент синтеза суетливо связан с тем, как связаны линии синхронизации и сброса. Вы должны использовать такую структуру, как:

        if ModuleRESET = '0' then
...
elsif rising_edge(CLK) then

или инструмент синтеза не может распознавать линии синхронизации и сброса.

Если я не могу исправить второй код, как я могу изменить первый код для работы, как мне нужно?

Вам нужно переместить "OutENABLE" за пределы первого процесса и в собственный процесс. Из того, что вы сказали, OutENABLE не должен быть регистром - он должен быть комбинаторной функцией Counter, ModuleRESET и ModuleENABLE. Попробуй это.

    process (CLK, ModuleRESET)
begin
if ModuleRESET = '0' then
Counter <= 0;
elsif rising_edge(CLK) then
if ModuleENABLE = '1' then
Counter <= Counter + 1;
case Counter is
when 1350 =>
Counter <= 0;
when others =>
null;
end case;
end if;
end if;
end process;

process (Counter, ModuleRESET, ModuleEnable)
begin
OutENABLE <= "000";
if ModuleRESET = '1' and ModuleENABLE = '1' then
case Counter is
when 0 .. 449 =>
OutENABLE <= "001";
when 450 .. 899 =>
OutENABLE <= "010";
when 900 .. 1349 =>
OutENABLE <= "100";
when others =>
OutENABLE <= "001";
end case;
end if;
end process;

ответил(а) 2015-04-29T13:47:00+03:00 5 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема