跳入不应该使用的状态

问题描述 投票:-1回答:1

我正在vhdl中构建具有三个状态的通道监视器。它没有进入正确的状态。

我正在为网络硬件创建频道监视器。这是在DE0-Nano-SoC板上。我正在运行100Mhz时钟。监视器具有三种状态;空闲,忙碌和碰撞。我要放置一个占空比为75%,频率为600Hz(应大于1.1毫秒且小于低频的方波)的方波,该方波应处于“忙碌”状态并闪烁到“空闲”并返回。但是,它保持忙碌状态。

我应该补充一点,当我确实要以非常低的频率改变状态时,它会在繁忙,碰撞和空闲之间跳跃。它只能是忙碌和闲置。当使用50%占空比时,在450 Hz时,它可以正常工作并且在所有状态之间切换]

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;

应该处于繁忙状态,但是在所施加的每个波周期中,它应该很快进入空闲状态并回到繁忙状态。

vhdl state timing
1个回答
-1
投票

我正在放置一个方波,...。

我假设您正在放置IN方波。我也缺少代码的I / O端口部分,并假设d是您的输入信号。

由于方波的变化与设计的其余部分无关,因此您必须在输入端使用同步级。否则会出现设置和保持时间错误。通常,两级同步器(两个级联寄存器)就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.