automatas problema

J

janlee

Guest
Parašiau valstybės aparatas kažką panašaus į tai:
-
procesas (CLK, rst_n)
pradėti
jei rst_n = '0 ', tada
current_state <= S0;
elsif clk'event ir CLK = "1", tada
current_state <= next_state;
- Perjungti kai tiek pagal valstybės
...
end if;
pabaigos procesą;

procesas (CLK)
pradėti
atveju current_state yra
kai S0 =>
jei "kai sugalvoti", tada
next_state <= s1;
end if;
kai S1 =>
jei "kai sugalvoti", tada
next_state <= s2;
end if;
kai s2 =>
jei "kai sugalvoti", tada
next_state <= s3;
end if;
kai kiti =>
next_state <= S0;
pabaigos atveju;
pabaigos procesą;

Problema yra ta valstybės mašina kartais veikia gerai, kartais ji pereina į nežinomos būklės.Aš naudoju altera signalas bakstelėkite II atsekti visų valstybės S0 ~ s3.when automatas negerai, S0 ~ S3 visi "0", tai yra dabartinės padėties nėra S0 ~ S3.Buvau labai sumišęs dabar.

<img src="http://www.edaboard.com/images/smiles/icon_cry.gif" alt="Crying or Very sad" border="0" />Ar kas nors ten gali duoti man pasiūlymus ir kodavimo stilių apie valstybės aparatas.
Daugelis appreciations!
Paskutinį kartą redagavo janlee apie 31 spalis 2006 6:38; Redaguota 1 kartą iš viso

 
Jūs valstybė 1 (S1), šėrimo atgal S1 - turėtų būti kita valstybė, priskiriamas S2.Įrankiai nebus įgyvendinti valstybės mašina, bet negali išspręsti visų narių.

 
Dėl kodavimo stiliaus, jis visada gera idėja pažymėti savo procesus, reikšmingas pavardes.

Antrasis procesas apima CLK jos jautrumas sąrašą, bet CLK nenaudojama jokiu būdu kurti next_state.Tai ne visai klaida, bet, greičiausiai, bus sukurti bent įspėjimą.

Kadangi next_state yra Combinatorial, ir ji yra naudojama tik pirmojoje procesas, tai gali būti gera idėja, kad naujos valstybės kintamasis, kuris yra apibrėžiamas per pirmąjį procesą.Ten tikrai nėra tinkama priežastis atskleisti next_state už proceso taikymo sritį, pirma, tai yra mašina iš esmės savo valstybės.

 
Siekiant įgyvendinti valstybės mašinos, jums reikia dviejų procesų.

Pirmasis iš jų yra eilės procesas, tai reiškia, ji turi būti jautrūs laikrodis ir atkurti kraštų.

Antroji yra kombinacyjnych vienas (manau, kad reikia persvarstyti tai).Būdamas combiantional, tai reiškia, jis turėtų būti senstive visiems signalus galite patikrinti jos viduje (pvz. some_invent signalas).

Kitas funkcijas šio kombinacyjnych procesas turi perjungti signalus pagal valstybės (ne eilės vieną).Jei norite išsaugoti šių bitų signalų kai registre, tada jums reikia "ginti" vėliava signalus toggled į kombinacyjnych procesą, patikrinkite, ar vienas iš jų signlas į eilės, jei jos yra 1 tada perjungti registro bitai.

Tikiuosi, kad tai padės jums.
Sėkmės

 
Pirmiausia, ačiū už jūsų pakartojimo.

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Labai laimingas" border="0" />Šį kartą aš po mano kodas here.I nori naudotis PCI9054 kontroliuoti savo FPGA ir kitų peripherals.So turiu konvertuoti PCI9054 sinchroninio signalus asinchroninis signalų, kaip wr_n, rd_n, ack_n ir tt
Problema yra kodas kartais elgiasi gerai, kada jis daro sistemą į avariją.Kaip aš galiu padaryti?

<img src="http://www.edaboard.com/images/smiles/icon_cry.gif" alt="Crying or Very sad" border="0" />Kodas:biblioteka IEEE;

naudoti ieee.std_logic_1164.all;

naudoti ieee.std_logic_unsigned.all;

naudoti ieee.std_logic_arith.all;subjektas PCI9054_IF yra

uostą (

RST_N: į std_logic;

LCLK: į std_logic;

LHOLD: į std_logic;

ADS_N: į std_logic;

BLAST_N: į std_logic;

LWDRD_N: į std_logic;

LA: į std_logic_vector (31 downto 2);

LD: Inout std_logic_vector (31 downto 0);

LHOLDA: iš std_logic;

READY_N: iš std_logic;

ACK_n: į std_logic;

WR_n: iš std_logic;

RD_n: iš std_logic);

pabaigos PCI9054_IF;Architektūra RTL iš PCI9054_IF yra

tipo STATE_TYPE yra (nėra, start, Waitstate, pask);

signalas CURRENT_STATE, NEXT_STATE: STATE_TYPE;

signalas iaddr: std_logic_vector (31 downto 2);pradėti

- Skirti vietos autobusas prašymu

procesas (LCLK)

pradėti

if (LCLK'event ir LCLK = '1 '), tada

jei LHOLD = '1 'vėliau

LHOLDA <= LHOLD;

kitas

LHOLDA <= '0 ';

end if;

end if;

pabaigos procesą;- Valstybinė mašinų Perėjimas

procesas (LCLK)

pradėti

jei RST_n = '0 ', tada

CURRENT_STATE <= IDLE;

elsif (LCLK'event ir LCLK = '1 '), tada

CURRENT_STATE <= NEXT_STATE;jei CURRENT_STATE = IDLE ir ADS_N = '0 ', tada

iaddr <= LA;

end if;end if;

pabaigos procesą;- Valstybinė mašinų

procesas (CURRENT_STATE, ADS_N, LWDRD_N, BLAST_N)

pradėtiatveju CURRENT_STATE yra

kai IDLE =>

RD_n <= '1 ';

WR_n <= '1 ';

READY_n <= '1 ';

jei ADS_N = '0 ', tada

NEXT_STATE <= pradžios;

kitas

NEXT_STATE <= IDLE;

end if;kai start =>

RD_n <= '1 ';

WR_n <= '1 ';

READY_n <= '1 ';

jei BLAST_N = '0 ', tada

NEXT_STATE <= Waitstate;

kitas

NEXT_STATE <= pradžios;

end if;kai Waitstate =>

RD_n <= LWDRD_N;

WR_n <= ne LWDRD_N;jei iaddr (31 downto 4) = B "0010_0000_0000_0000_1001_0000_0000", tada

jei ACK_n = '0 ', tada

NEXT_STATE <= Paskutinis;

READY_n <= '0 ';

kitas

NEXT_STATE <= Waitstate;

end if;

kitas

NEXT_STATE <= Paskutinis;

READY_n <= '0 ';

end if;kai PASKUTINĖS =>

RD_n <= '1 ';

WR_n <= '1 ';

READY_n <= '1 ';

jei ADS_N = "1" ir BLAST_N = '1 'vėliau

NEXT_STATE <= IDLE;

elsif ADS_N = '0 ', tada

NEXT_STATE <= pradžios;

kitas

NEXT_STATE <= Paskutinis;

end if;kai kiti =>

RD_n <= '1 ';

WR_n <= '1 ';

READY_n <= '1 ';

NEXT_STATE <= IDLE;

pabaigos atveju;

pabaigos procesą;pabaigos RTL;

 
Kas yra undescribed valstybės "NOP" iš CURRENT_STATE?

 
Patikrinkite UR ACK_n signalas, kuris jums yra geting iš UR periferiniai įrenginiai turi būti
teigė bent vienas LCLK ciklą; UR naudojant šį signalą kurti REARY_n signalas
combinatorily, kuri turi būti teigiama, už 1 LCLK ciklas!
Hope this helps!Parašytas po 13 minučių:UR balzganas statemachine veikia LCLK kurių ACK_n signalas yra asinchroninis
ir aš manau, thats ur problema.Gaukite ACK_n signalas sinchronizuojamas su LCLK pirmas
prieš naudojant jį valstybės aparatas!Taip pat ACK_n trūksta proceso jautrumas sąrašą?

 
Ačiū už yasser_shoukry & nand_gates 's pagalbos.Norėdami yasser_shoukry, aš norėčiau jūsų kodavimo styles.Just kaip ir sakė, perjungti visus proceso signalą kombinacyjnych, ir jei ir nori, kad signalas būtų įregistravo galite naudoti DfF į eilės procesas.

Norėdami nand_gates, kai aš ginti WR_n arba RD_n, aš laukti ACK_n būti teigiama dėl didėjančių krašto LCLK, ir dėl kito auga krašto aš įregistravo READY_n iš vidaus signalas iready_n, manau, kad lygiai taip pat, kaip ur pakartojimo.

Šį kartą aš po mano pakeistą kodą čia.

Linijų komentatorius "naują skyrių" yra pakeistas part.It yra siaubingai negerai su ready_n elgesį, aš ne visas Waitstate sąlygas.

Dabar veikia puikiai: D
Kodas:biblioteka IEEE;

naudoti ieee.std_logic_1164.all;

naudoti ieee.std_logic_unsigned.all;

naudoti ieee.std_logic_arith.all;subjektas PCI9054_IF yra

uostą (

RST_N: į std_logic;

LCLK: į std_logic;

LHOLD: į std_logic;

ADS_N: į std_logic;

BLAST_N: į std_logic;

LWDRD_N: į std_logic;

LA: į std_logic_vector (31 downto 2);

LD: Inout std_logic_vector (31 downto 0);

LHOLDA: iš std_logic;

READY_N: iš std_logic;

ACK_n: į std_logic;

WR_n: iš std_logic;

RD_n: iš std_logic);

pabaigos PCI9054_IF;Architektūra RTL iš PCI9054_IF yra

tipo STATE_TYPE yra (nėra, start, Waitstate, pask);

signalas CURRENT_STATE, NEXT_STATE: STATE_TYPE;

signalas iready_n: std_logic;signalas iwr_n, ird_n: std_logic;

signalas iaddr: std_logic_vector (31 downto 2);pradėti-

- Skirti vietos autobusas prašymu

procesas (LCLK)

pradėti

if (LCLK'event ir LCLK = '1 '), tada

jei LHOLD = '1 'vėliau

LHOLDA <= LHOLD;

kitas

LHOLDA <= '0 ';

end if;

end if;

pabaigos procesą;- Valstybinė mašinų Perėjimas

procesas (LCLK)

pradėti

jei RST_n = '0 ', tada

CURRENT_STATE <= IDLE;

elsif (LCLK'event ir LCLK = '1 '), tada

CURRENT_STATE <= NEXT_STATE;jei CURRENT_STATE = IDLE ir ADS_N = '0 ', tada

iaddr <= LA;

end if;READY_n <= iready_n - naują skyriųend if;

pabaigos procesą;- Valstybinė mašinų

procesas (CURRENT_STATE, ADS_N, LWDRD_N, BLAST_N, ACK_n)

pradėti

NEXT_STATE <= CURRENT_STATE;

atveju CURRENT_STATE yra

kai IDLE =>

RD_n <= '1 ';

WR_n <= '1 ';

iready_n <= '1 ';

jei ADS_N = '0 ', tada

NEXT_STATE <= pradžios;

kitas

NEXT_STATE <= IDLE;

end if;kai start =>

RD_n <= '1 ';

WR_n <= '1 ';

iready_n <= '1 ';

jei BLAST_N = '0 ', tada

NEXT_STATE <= Waitstate;

kitas

NEXT_STATE <= pradžios;

end if;kai Waitstate =>

RD_n <= LWDRD_N;

WR_n <= ne LWDRD_N;jei iaddr (31 downto 4) = B "0010_0000_0000_0000_1001_0000_0000", tada

jei ACK_n = '0 ', tada

NEXT_STATE <= Paskutinis;

iready_n <= '0 ';

kitas

NEXT_STATE <= Waitstate;

iready_n <= "1" - naują skyrių

end if;

kitas

NEXT_STATE <= Paskutinis;

iready_n <= '0 ';

end if;kai PASKUTINĖS =>

RD_n <= '1 ';

WR_n <= '1 ';

iready_n <= '1 ';

jei ADS_N = "1" ir BLAST_N = '1 'vėliau

NEXT_STATE <= IDLE;

elsif ADS_N = '0 ', tada

NEXT_STATE <= pradžios;

kitas

NEXT_STATE <= Paskutinis;

end if;kai kiti =>

RD_n <= '1 ';

WR_n <= '1 ';

iready_n <= '1 ';

NEXT_STATE <= IDLE;

pabaigos atveju;

pabaigos procesą;pabaigos RTL;

 

Welcome to EDABoard.com

Sponsor

Back
Top