helpen, basiskennis VHDL state machine met Nexus 2

N

nicklas_a74

Guest
Hoi
Ik heb de VHDL-code hieronder.Het beoogde gebruik is om een state machine.
dat begint vanaf 0.Wanneer gebruik ik de schakelaar en een exploitant moet het opslaan van de switch
waarde en de exploitant en ga naar toestand 1.En als ik druk gelijk moet slaan een nieuwe
switch waarde en afhankelijk van welke operator ik heb gebruikt berekenen resultaten, enz.
Maar toen ik het op mijn Nexus 2 boord het Doest werken zoals de bedoeling was.
Please help me met correcties in de code hieronder.

proces (staat, operand, gelijke, switch, clk)
variabele tal1, tal2: std_logic_vector (7 downto 0);
variabele resultaat: std_logic_vector (15 downto 0);
variabele temp_operand: std_logic_vector (2 downto 0);

beginnen

indien rising_edge (clk)
then
geval staat is

wanneer S0 => als operand / = "000", dan
temp_operand: = operandlengte;
dispx (7 downto 0) <= switch (7 downto 0);
dispx (15 downto 8) <= "11101110";
tal1: = switch (7 downto 0);
staat <= s1;

anders
dispx (7 downto 0) <= switch (7 downto 0);
dispx (15 downto 8) <= "11101110";
end if;

wanneer s1 => als gelijke ='1 ', dan
tal2: = switch (7 downto 0);

geval is temp_operand

wanneer "100" => resultaat: = ( "00000000" & tal1) tal2;
dispx <= resultaat;
staat <= S2;

wanneer "010" => resultaat: = ( "00000000" & tal1)-tal2;
dispx <= resultaat;
staat <= S2;

wanneer anderen => resultaat: = tal1 * tal2;
dispx <= resultaat;
staat <= S2;
einde zaak;

anders
dispx (7 downto 0) <= switch (7 downto 0);
dispx (15 downto 8) <= "11101110";
end if;wanneer s2 => als switch / = tal2 vervolgens
staat <= S0;
anders
staat <= S2;
dispx <= resultaat;
end if;

wanneer anderen => staat <= S0;
einde zaak;
end if;
einde proces;

 
HI,

Voor alle digitale ontwerp op het eerste gezicht het
doesnt werk dan moet je controleren om de macht, als boord krijgt juist de macht en is macht goed verdeeld over alle comaponant?

Als deze in orde is, controleer dan voor CLK en reset.Als uw ontwerp krijgt clk en reset correct?

controleren door het toewijzen van clk en reset te hebben geleid of gpio (in geval van gpio contact op met CRO of geleid mechenism of een ander ding wat je voelt beter).

Als dit ook goed komt, dan is er probleem in uw ontwerp-code.

om te controleren waar is probleem in state machine .....
Het eerste wat je moet nemen om een volledige en parallelle geval staat ment.is er d volledige zaak?en is er Defaul zaak?deze zijn nodig om te voorkomen dat uit vergrendeling en ongewenste toestand.

nog steeds probleem is er dan heb je te simuleren en debuggen op die manier.zorg over simulatie en synthese misbihavior

HTH,
--
Shitansh Vaghela

 
Bedankt voor de beantwoording
Ik heb de macht en dus sinds mijn code wordt uitgevoerd, maar niet correct.Ik vind het
binnen de staat de beschrijving van het probleem is.Ik gebruik geen aanstoot, omdat mijn code
moeten zorgen voor "ongewenste" staten en "push" naar de stand S0 als uitgangspunt
toestand.Maar ik kan niet "zien" waar het probleem ligt in de code die ik heb geschreven.

Dat
is waarom ik gevraagd voor specifieke opmerkingen met betrekking tot mijn code.

 
HI,

Helaas heb ik geen ervaring met VHDL thats waarom ik heb u richting.indien dit in verilog vervolgens perheps Ik kan je helpen.

Als door-converter kunt u me code in Verilog daarna zal ik zien.rightnow heel drukke anders die ik al deed.Toegevoegd na 6 minuten:Een ander suggetion,

Probeer om uw FSM met twee blokken een voor sequentiële en een voor combinatievormen en ook meke apart blok voor de output logik deze manier kunt u debuggen meer.

HTH
--
Shitansh Vaghela

 
Check out this one!

Code:

proces (clk)

variabele tal1, tal2: std_logic_vector (7 downto 0);

variabele resultaat: std_logic_vector (15 downto 0);

variabele temp_operand: std_logic_vector (2 downto 0);

beginnenindien rising_edge (clk) then

geval staat is

wanneer S0 =>

indien operandlengte / = "000", dan

temp_operand: = operandlengte;

dispx (7 downto 0) <= switch (7 downto 0);

dispx (15 downto 8) <= "11101110";

tal1: = switch (7 downto 0);

staat <= s1;

anders

dispx (7 downto 0) <= switch (7 downto 0);

dispx (15 downto 8) <= "11101110";

end if;wanneer s1 =>

indien gelijk ='1 ', dan

tal2: = switch (7 downto 0);

geval is temp_operand

wanneer "100" =>

resultaat: = ( "00000000" & tal1) tal2;

wanneer "010" =>

resultaat: = ( "00000000" & tal1) - tal2;

wanneer anderen =>

resultaat: = tal1 * tal2;

einde zaak;

dispx <= resultaat;

staat <= S2;

anders

dispx (7 downto 0) <= switch (7 downto 0);

dispx (15 downto 8) <= "11101110";

end if;wanneer s2 =>

als switch / = tal2 vervolgens

staat <= S0;

anders

staat <= S2;

dispx <= resultaat;

end if;wanneer anderen =>

staat <= S0;

einde zaak;

end if;

einde proces;
 
De code nog dont werk toen ik haar bitfile aan de Nexus 2 boord.De schakelaar is verbonden met de knoppen B18, D18 en E18 om te kiezen , - of * als operand.De gelijke moet de knop H13 op het bord.Het display geeft de waarden van de schakelaars G18 tot R17, correct.Maar nadat ik zeggen druk op " " en daarna het tweede getal in en druk op de knop voor "gelijk aan" het dosent werk.Het dosent tonen de waarde.Cant "zien" wat is er mis met de code?
Elke verdere suggesties?

 
Het probleem zou kunnen zijn ...
U bent met behulp van de drukknoppen B18, D18 en E18 zonder debouncing.
Afrekenen dit ...
http://www.fpga4fun.com/Debouncer2.html

Hoop dat dit helpt!

 

Welcome to EDABoard.com

Sponsor

Back
Top