Staat Machines - please help me plek de fout

Z

Zhane

Guest
Code:signaal: std_logic_vector (3 Downto 0);

signaal LED: std_logic_vector;

signaal count: integer: = 0;proces (CLK)

beginnenif (clk'event = true en clk = '1 ') then

state <= nextState;

end if;

einde procesproces (staat, RST, in1, in2, in3)

beginnen

LED <= '0 ';

geval staat

wanneer staat 1 =>

vermogen van <= "0010";

if (in1 = '1 ') then

count <= count 10;

elsif (in2 = '1 ') then

count <= count 5;

elsif (in3 = '1 ') then

count <= count 20;

end if;if (count> 90) dan

LED <= '1 ';

count <= 0;

end if;

wanneer toestand 2 =>

vermogen van <= "0001";

einde geval;end if;
 
Verschillende dingen die ik gemerkt:

1) U moet toevoegen een reset voorwaarde voor uw staat flip-flop, zodat de hardware komt in een bekende staat.Als u een waarde toe te kennen aan een signaal wanneer u aangifte te doen, werkt dit in de simulatie, maar de hardware kan niet overeen.

2) Je hebt nooit instellen nextState variabele in uw staat machine proces.

3) U moet de graaf signaal toe te voegen aan je gevoeligheid lijst in uw staat machine proces.

4) U wilt waarschijnlijk een "wanneer anderen" zaak naar uw staat machine toe te voegen.

5) Dit is een kleine nit.U kunt schrijven rising_edge (clk) als een korte-hand manier van
controleren op de stijgende flank van de CLK.

Radix

 
radix wrote:

Verschillende dingen die ik gemerkt:1) U moet toevoegen een reset voorwaarde voor uw staat flip-flop, zodat de hardware komt in een bekende staat.
Als u een waarde toe te kennen aan een signaal wanneer u aangifte te doen, werkt dit in de simulatie, maar de hardware kan niet overeen.

 
Zhane wrote:radix wrote:

Verschillende dingen die ik gemerkt:1) U moet toevoegen een reset voorwaarde voor uw staat flip-flop, zodat de hardware komt in een bekende staat.
Als u een waarde toe te kennen aan een signaal wanneer u aangifte te doen, werkt dit in de simulatie, maar de hardware kan niet overeen.

 
Quote:Quote:Quote:2) Je hebt nooit instellen nextState variabele in uw staat machine proces.

 
Je moet beseffen dat, tenzij je de zorg, simulaties en hardware nemen niet overeen.Als je digitaal ontwerp je normaal doet het synchroon, die alles van belang betekent het doen bent aan het veranderen in de lock-stap met een klok.

Wat u momenteel gesuggereerd in uw code is strikt combinatorische logica (geen klok).Alles wat je doet met je tellen signaal combinatorische logica die direct is terug te voeren op zichzelf, omdat je geen geklokt elementen.U moet een bereik op uw tellen signaal en dan maakt het deel uit van een geklokte proces, zodat de waarde wordt opgeslagen in registers.

Iets als dit zou kunnen werken voor u:

Code:signaal count: integer bereik 0 tot 127;- FFs voor rekenen waarde

proces (CLK, rstn)

beginnen

if (rstn = '0 ') then

count <= (others => '0 ');

elsif rising_edge (clk) then

- De graaf zal rollover op 0 als het hoger is dan 127

if (in1 = '1 ') then

count <= count 10;

elsif (in2 = '1 ') then

count <= count 5;

elsif (in3 = '1 ') then

count <= count 20;

end if;

end if;

einde proces- FF voor LED waarde

proces (CLK, rstn)

beginnen

if (rstn = '0 ') then

LED <= '0 ';

elsif rising_edge (clk) then

- Houdt de LED-signaal hoog na tel hits 91. LED is ingesteld op 1 wanneer

- Telling is tussen 91 en 127.

if (count> 90) dan

LED <= '1 ';

anders

LED <= '0 ';

end if;

end if;

einde proces

 
Zhane wrote:

in dit voorbeeld, heb ik nooit van plan het gebruik van de 1e proces.
gewoon alleen wilt zien hoe de 2e proces werkt uit wanneer in1/in2/in3 heeft iets.
maar het gebeurt dat het blijft retriggering ondanks in1/in2/in3 worden verhoogd hoog en hield daar, ...
en RST en staat blijft ongewijzigd.

 
tkbits wrote:

Een proces is effectief een eeuwige lus.
Als er geen feedback, het proces lijkt op te treden als een "execute eenmaal" proces.
Echter, als je feedback hebt (een signaal verschijnt op beide zijden van dezelfde opdracht), zal de hardware niet "execute once" in de afwezigheid van kloksnelheid.

 
Je hebt feedback met

count <= count 5;

Dit komt omdat een adder is niet een sequentiële schakeling - de adder is combinatievormen, gebouwd met AND, OR en NOT logica, en geen registers.

Dit is het geval met de originele post, waar de teller toename is in een proces dat niet een clk'event of rising_edge / falling_edge conditie hebben.

Zet de toename onder een klok staat, zoals u hebt gedaan, en dat combinatievormen feedback verwijdert, omdat een register wordt afgeleid.

 

Welcome to EDABoard.com

Sponsor

Back
Top