【发布时间】:2018-05-18 11:42:42
【问题描述】:
我是 vhdl 的初学者。我创建了一个 000010 序列的识别器自动机 (Moore) 来访问电梯。识别全序列后,在X1状态电梯门打开,两个LED灯亮,X2和X3在5秒后门关闭,10秒后,电梯到达所需楼层。 用Modelsim模拟一切,没有错误。
我的问题是想要重置所有变量(然后返回到初始状态 X0)以防万一,例如,您处于任何状态。例如,在 X1 中,变量“esito”、led1 和 led2 应该返回 0。
由于无法在第一个过程中重置这些变量(重置条件 = 1),因为我会遇到错误“无法解析网络的多个常量驱动程序”(两者都使用相同的变量进程),我想问一下我在下面的代码中采用的解决方案是否正确(在对插入的序列执行控制之前重置X0中的变量)。
我希望我已经清楚了,你可以帮助我。
这是代码:
library IEEE;
use IEEE.std_logic_1164.all;
entity riconoscitore is
port(
simbolo:inout std_logic_vector(5 downto 0);
clock,esito,reset:inout std_logic;
led1,led2:out std_logic
);
end riconoscitore;
architecture myriconosc of riconoscitore is
type state_values is
(X0,X1,X2,X3);
signal current_st,next_st:state_values;
signal timer:std_logic;
begin
process(clock,reset)
begin
if(reset='1') then
current_st<=X0;
elsif(rising_edge(clock))then
current_st<=next_st;
end if;
end process;
process(current_st,simbolo,timer,reset)
begin
next_st<=X0;
case current_st is
when X0 =>
esito<='0';
led1<='0';
led2<='0';
reset<='0';
timer<='0';
simbolo<=('U','U','U','U','U','U');
if(simbolo="000010")then
next_st<=X1;
else
next_st<=X0;
end if;
when X1 =>
esito<='1';
led1<='1';
led2<='1';
timer<= transport '1' after 5 sec;
next_st<=X2;
when X2=>
led1<='0';
if(timer='1') then
next_st<=X3;
reset<= transport '1' after 10 sec;
else next_st<=X2;
end if;
when X3=>
if (reset='1') then
next_st<=X0;
esito<='U';
reset<='U';
timer<='U';
simbolo<=('U','U','U','U','U','U');
led2<='0';
else
next_st<=X3;
end if;
end case;
end process;
end myriconosc;
【问题讨论】: