Kysymys:
FPGA: n liittäminen ulkoiseen siruun ja ajoitusrajoitukset
Vinay Madapura
2017-09-28 20:12:43 UTC
view on stackexchange narkive permalink

Olen suunnitellut järjestelmän, joka käyttää Artix-7 FPGA: ta mukautetulla levyllä. Tavoitteena on siirtää 32-bittinen data ulkoiselle sirulle, jonka tietoväylä on inout -portti. Ensinnäkin pieni tausta:

Ulkoista sirua ohjaa 100 MHz: n kello, jonka FPGA muodostaa, kutsumme sitä nimellä o_clk . FPGA muodostaa tämän kellon MMCM: n kautta muistiliitäntän generaattorissa (MIG IP) käyttäen 200 MHz: n differentiaalijärjestelmän kelloa. o_clk on kytketty takaisin FPGA: n lähtöön ja se annetaan toiselle pallolle tulokellona, ​​kutsumme sitä nimellä i_clk .

Ulkoinen siru vastaanottaa o_clk ja näkee tietoja tämän kellon nousevasta reunasta. Kuitenkin, kun ulkoinen siru lähettää tietoja takaisin FPGA: lle, FPGA näkee nämä tiedot silmukoituna takaisin i_clk -näytöllä. Tämän tekemisen idea on, että voimme käsitellä viestintää synkronisena lähteenä molempiin suuntiin (muista, että se on inout -portti). Jotain alla olevaa:

  FPGA - > EC on synkronoitu FPGA: n kanssa, koska FPGA luo kellon
EC - > FPGA on synkronoitu EC: n kanssa, koska FPGA saa ulkoisen kellon (käytännössä EY: ltä)
 

Tämän mallin rajoittamiseksi olen käyttänyt i_clk -näppäintä asettamaan viiveitä io_data -toiminnolle ja rajoittanut tuotoksen sama io_data -väylä. Olen varmistanut, että käytän edelleen lähetettyä kelloa ( create_generated_clock ) (käyttäen ODDR2: ta) rajoitukselle set_output_delay .

Tässä ovat rajoitukseni:

  create_clock -period 10.000 -name i_clk -waveform {0.000 5.000} [get_ports i_clk]
set_clock_groups -name loopback_grp -asynchronous -group [get_clocks i_clk] -group [get_clocks o_clk]

set_input_delay -clock i_fx3_pclk -max 8.000 [get_ports io_fx3_fdata]
set_input_delay -clock i_clk -min 2.000 [get_ports io_data]

set_output_delay -clock o_clk -max 2.000 [get_ports io_data]
set_output_delay -clock o_clk -min -0.500 [get_ports io_data]
 

Järjestelmä näyttää toimivan kunnolla, kun käytän sitä laitteistolla, mutta minulla on silti epäilyksiä, koska olen edelleen amatööri FPGA-kehittäjä ja tämä on ensimmäinen iso FPGA-suunnitteluni.

Kysymykseni ovat:

  1. Olenko suunnitellut hyvän järjestelmän?
  2. Onko oikein kohdella tiedonsiirtoa EY: stä -> FPGA: sta lähdekoodina?(Toinen suunta on lähdesynkronointi, koska FPGA tarjoaa kellon, jos en ole väärässä.!)
  3. Ovatko rajoitukseni oikein?
Näiden rajoitusten mukaan `i_clk` on asynkroninen` o_clk`: n kanssa.Tarkoititko tätä?Jos haluat tehdä niistä synkronisia, sinun on määritettävä ne samassa kelloryhmässä.Esimerkiksi `-group [get_clocks" i_clk o_clk "]`.
Jos tiedät kellon / datan jäljitysetäisyydet FPGA: n ja ulkoisen laitteen välillä, sinun pitäisi pystyä käsittelemään järjestelmää järjestelmän synkronisena rajapintana.Toisin sanoen palautetulla datalla on ennustettavissa oleva ajoitusmalli suhteessa o_clk.Siinä tapauksessa ei olisi mitään syytä käyttää i_clk: tä, vain rajoittaa suhteellista syötetietoa suhteessa o_clk ja kello sisään o_clk: llä ja ehkä käyttää IDELAY-aikoja ajoittamiseen.Jos jäljityspituutta ei tunneta (kello / data kulkee kaapelin pituuden läpi, jota ei tiedetä suunnitteluhetkellä), sinun on kohdeltava i_clk: tä asynkronisena.
@ahmedus, kyllä, tein sen tarkoituksella, koska `i_clk` on kytketty takaisin laitteistoon, eikä se tiedä, että molemmat kellot ovat yhteydessä toisiinsa.Pitäisikö minun tehdä niistä synkronisia suunnittelun kannalta?
Tapaukset on selitetty hyvin @user2913869's: n kommentissa.Pian se riippuu siitä, onko ulkoinen viive tiedossa.
Onko sinulla lisätietoja kohdelaitteestasi?Jotkin laitteet tukevat natiivisti lähdekohtaista toimintaa.Lisäksi haluat ehdottomasti asettaa kellot liittyviksi, koska niiden välillä ei tietenkään ole taajuusvirhettä.
Kellon taaksepäin taululla ei saavuteta paljoa, jos se on vain pallo-pallo-yhteys.Ihannetapauksessa voit käärittää jäljet takaisin i_clk: een niin, että sen pituus on 2x toisen sirun datajälkien pituus.Tämä jäljittelee kellon / datan viivettä toiselle sirulle ja datan viivettä takaisin FPGA: lle.
üks vastaus:
hacktastical
2019-07-04 10:41:18 UTC
view on stackexchange narkive permalink

Pohjimmiltaan yrität luoda viivästetyn kellon kaappaamaan syötteesi ja antamaan siten enemmän palautusaikojen asennusaikaa.Palautussignaalien käsitteleminen lähdekoodina heidän kanssaan lentävän kellon kanssa vaikuttaa loogiselta, mutta sitä ei ole niin hyvin hallittu: paluukellosignaalin eheys lisää uuden muuttujan ajastukseesi.

Voit käyttää sen sijaan vaihesiirrettyä kelloa, joka sieppaa syötteen.Tätä on paljon paremmin hallittu ja käsitelty täysin FPGA: n sisällä.

Turvallinen vaihesiirto on vähintään kaukosäätimen laitteen lähdön pitoaika plus paras tapa (nopein) laskettu edestakainen lentoaika, joka syötetään set_output_delay -min -arvona (syötetään negatiivisenanumero pitoaikaa varten.)



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...