我正在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;
应该处于繁忙状态,但是在所施加的每个波周期中,它应该很快进入空闲状态并回到繁忙状态。
我正在放置一个方波,...。
我假设您正在放置IN方波。我也缺少代码的I / O端口部分,并假设d
是您的输入信号。
由于方波的变化与设计的其余部分无关,因此您必须在输入端使用同步级。否则会出现设置和保持时间错误。通常,两级同步器(两个级联寄存器)就足够了。