Я строю монитор канала в VHDL, который имеет три состояния.Это не входит в правильные состояния.
Я создаю монитор канала для сетевого оборудования.Это на плате DE0-Nano-SoC.Я бегу на 100 МГц.Монитор имеет три состояния;Холостой, занятый и столкновение.Я помещаю прямоугольную волну с рабочим циклом 75% и частотой 600 Гц (должна быть больше 1,1 мс в высоту и меньше низкой), и она должна быть занята и мигать в режиме ожидания и обратно.Тем не менее, он остается в Занят.
Я должен добавить, что когда я действительно заставляю его фактически изменять состояния, на очень низкой частоте, он переходит между занятым, коллизионным и бездействующим.Стоит только быть занятым и бездействующим.при использовании коэффициента заполнения 50% при 450 Гц он работает правильно и проходит между всеми состояниями
begin
process(clk, reset)
variable count : integer;
begin
if (reset = '1') then
state <= IDLE;
count := 0;
q <= '1';
elsif rising_edge(clk) then
q <= d;
case state is
when IDLE =>
mon <= "001";
if (d = '1') then
state <= IDLE;
elsif (d = '0') then
count := 0;
watch <= '0';
state <= BUSY;
end if;
when BUSY =>
mon <= "010";
if (d = not watch) then
count := 0; --have to reset the count in case it was already in busy
watch <= not watch; --since d changed, switch this variable
state <= BUSY;
--stay in busy
else --if d did not change
if (count = milla) then --at the 1.11 ms mark
count := 0; --reset the count when leaving busy
if (watch = '0') then
state <= COLLISION;
else --high goes to idle
state <= IDLE;
end if;
else --stay in busy
count := count + 1; --if it did not change, increase the count
state <= BUSY;
end if;
end if;
when COLLISION =>
mon <= "100";
if (d = '1') then --if it goes high in collision
count := 0;
watch <= '1';
state <= BUSY;
else
state <= COLLISION;
end if;
end case;
end if;
end process;
Он должен быть занят, но быстро переходить в режим ожидания и обратно в состояние занятости в каждом цикле примененной волны.