«Ожидание» такта в процессе VHDL - PullRequest
0 голосов
/ 26 октября 2018

Допустим, есть компонент компонента RAM, как показано ниже

entity RAM is
   port(
      -- other port such as clk, reset, ...
      en: in std_logic;
      addr: in std_logic_vector(7 downto 0);
      dataR: out std_logic_vector(7 downto 0));
end RAM;

Спецификация RAM такова, что когда en = '1', значение, хранящееся в addr, доступно для dataR один такт после.

Пока мой процесс, в котором я использую компонент RAM, выглядит следующим образом:

process(state)
begin
  case(state) is
    -- ...
    when ReadMemory =>
       addr <= "00000000";
       en <= '1';
       next_mem <= dataR;

    -- ...
  end case;
end process;

Этот дизайн не работает, потому что dataR читается в том же тактовом цикле, что и когда установлены addr и en.

Как я могу "подождать" один цикл clck, чтобы прочитать правильное значение из памяти?

1 Ответ

0 голосов
/ 27 октября 2018

Вы используете конечный автомат, поэтому вы можете использовать состояние ожидания

process(state)
begin
    case(state) is
    -- ...
        when ReadMemory =>
            addr <= "00000000";
            en <= '1';

            next_state <= WaitMemory;
        when WaitMemory =>
            next_mem <= dataR;
            next_state <= another_state;
    -- ...
    end case;
end process;

Будьте осторожны, с определенным типом конечного автомата вам может потребоваться подождать 2 часа.Чтобы быть более конкретным, с этим типом FSM:

process(CLK)
begin
    if rising_edge(CLK) then
        state <= next_state;
    end if;
end process;

process(state)
begin
    case(state) is
    -- ...
       -- YOUR FSM with next_state attribution
    -- ...
    end case;
end process;

Вам нужно подождать 1 час.Но с этим:

process(CLK)
begin
    if rising_edge(CLK) then
        case(state) is
        -- ...
           -- YOUR FSM with state attribution
        -- ...
        end case;
    end if;
end process;

Вам придется ждать 2 часа

...