Это мой код 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.