Прыжки в состояния, что это не должно - PullRequest
0 голосов
/ 25 сентября 2019

Я строю монитор канала в 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;

Он должен быть занят, но быстро переходить в режим ожидания и обратно в состояние занятости в каждом цикле примененной волны.

1 Ответ

0 голосов
/ 26 сентября 2019

Я ставлю прямоугольную волну, которая ....

Я предполагаю, что вы выставляете IN прямоугольную волну.Я также пропускаю часть кода порта ввода / вывода и предполагаю, что d является вашим входным сигналом.

Поскольку прямоугольная волна изменяется независимо от остальной части проекта, вы должны использовать этап синхронизациина ваш вклад.В противном случае у вас будут ошибки установки и удержания времени.Обычно достаточно двухступенчатого синхронизатора (двух каскадных регистров).

...