Программа VHDL не устанавливает вывод - PullRequest
0 голосов
/ 11 апреля 2019

Это мой код VHDL:

entity Operation is
  port (
    clk16: in std_logic; // 16 MHz input clock
    start_cmd: inout std_logic; // open drain line. When CPLD sees it is pulled low, it keeps pulling it low till the operation is finished
    clk_out: buffer std_logic; // output clock derived from clk16
  );
end Operation;

architecture a of Operation is
  type T_STATE is (STOPPED, STARTING, ....another states....);
  signal state: T_STATE := STOPPED;

begin
  process (clk16, clk_out)
  begin

    if rising_edge(clk16) then
      clk_out <= not clk_out; -- create clk_out clock
    end if;

    if rising_edge(clk_out) then
       case state is
         when STOPPED =>
           if start_cmd = '0' then
             state <= STARTING;
             start_cmd <= '0' -- sometimes this doesn't happen
           end if;

         when STARTING =>
-- code continues here.... after the operation is finished, start_cmd <= 'Z' is "executed"

У меня есть сигнал start_cmd, подключенный к моему CPLD.Это сигнал с открытым стоком, который также подключен к другому устройству.Когда другое устройство хочет, чтобы CPLD начал какую-либо операцию, он сбрасывает start_cmd на низкий уровень.Когда CPLD видит, что start_cmd находится на низком уровне, он также понижает линию.Через некоторое время другое устройство освобождает линию.Когда операция по CPLD завершена, CPLD освобождает строку.Поскольку сейчас никто не тянет линию вниз, линия идет высоко.Затем другое устройство знает, что операция CPLD завершена.

Проблема заключается в том, что иногда (10%) start_cmd <= '0' не «выполняется», поэтому сигнал start_cmd возвращается в высокий уровень, когда другое устройство перестает тянуть значение start_cmd низким.Затем другое устройство обнаруживает ложное «операция завершена». </p>

Можете ли вы увидеть какую-либо проблему, почему start_cmd <= '0' иногда «не выполняется»? </p>

Я отладил свое устройство с помощью осциллографа и могуобратите внимание, что такая ситуация возникает, когда другое устройство сбрасывает start_cmd на низкий уровень точно по нарастающему фронту clk_out.

Этот VHDL реализован на MAX V CPLD с использованием Quartus Prime.

1 Ответ

0 голосов
/ 12 апреля 2019

Во-первых - я думаю, что вы всегда должны инициализировать ввод с 'Z' при запуске

Добавить новое состояние INIT в T_STATE

type T_STATE is (INIT,STOPPED, STARTING, ....another states....);

и инициализировать состояние до INIT

signal state: T_STATE := INIT;

case state is
  when INIT =>
   start_cmd <= 'Z';
   state <= STOPPED;
  when STOPPED =>
  :

Во-вторых, я не уверен насчет требования буфера clk_out. Я не думаю, что это необходимо, если нет конкретной причины. Кажется, все, что вам нужно, это

if falling_edge(clk16) then
    case state is
      :
...