Fórum témák

» Több friss téma
Fórum » CPLD, FPGA - Miértek, hogyanok
Lapozás: OK   40 / 49
(#) Balázs válasza aticska hozzászólására (») Jún 10, 2016 /
 
Ha esetleg Pajti2 tanácsa valamiért nem járható út, és mindenképpen frissítened kell az FPGA konfigurációt is, akkor ajánlom figyelmedbe a Xilinx FPGA-k MultiBoot névre keresztelt megoldását. Ekkor a memóriában több konfiguráció is tárolható. Először mindig az alapértelmezettet tölti be, ennek lehet esetedben "bootloader" szerepe. Feltételvizsgálat után elágazhatsz, hogy frissíteni akarsz-e, vagy betölteni a tényleges konfigot. Hátránya, hogy megdobja az indulási időt, nem tudom, hogy ez ebben az alkalmazásban megengedhető-e...
(#) killbill válasza aticska hozzászólására (») Jún 10, 2016 / 1
 
Ha RAM bazisu FPGA-rol van szo (pl. Xilinx-ek), akkor a konfiguraciot a processzor is adhatja az FPGA-nak, nem feltetlenul kell a config flash-t az FPGA-ra kotni. Amikor az FPGA boot-ol, akkor szepen a processzor atnyomja neki a configot es kesz. A frissites meg egyertelmu.
(#) icserny hozzászólása Jún 10, 2016 /
 
Ma érkezett meg az Altera MAX II (EPM240T100C5N ) kártyám, USB Blasterrel és a szükséges kábelekkel együtt. Ennyi pénzért szinte ajándék volt.

CPLD-vel most ismerkedőknek tanulásra nagyon tudom ajánlani. Nekem tetszik, hogy van rajta néhány gomb, LED sor, 7-szegmens kijelző és egy csipogó. Az ingyenes Altera Quartus Prime Lite Edition jó hozzá, abban van az USB Blaster drivere is.
A hozzászólás módosítva: Jún 10, 2016
(#) dark81 válasza icserny hozzászólására (») Jún 20, 2016 /
 
Szia! Én is foglalkozom ezzel a CPLD-vel, valóban jó választás fejlesztéshez, de vigyázz mert csak 100-szor lehet újraprogramozni! Használd a ModelSim-et a kód kipróbálásához.
(#) gabi20 hozzászólása Júl 10, 2016 /
 
Sziasztok
Több kapcsolási rajzban láttam, hogy FPGA mellé be van építve valamilyen külső nagysebességű párhuzamos RAM. Kérdésem hogy ez a memória elengedhetetlen az FPGA működéséhez, vagy ez teljesen általános felhasználásra van beépítve... Pontosan mire szolgál ez a memória?
A hozzászólás módosítva: Júl 10, 2016
(#) gtk hozzászólása Júl 10, 2016 /
 
Eppen az elozo hozzaszolasokban irtak le a valaszt
Tovabba a nagysebessegu RAMot arra hasznalod amire akarod.
A hozzászólás módosítva: Júl 10, 2016
(#) gabi20 válasza gtk hozzászólására (») Júl 10, 2016 /
 
Értem köszi csak nem voltam benne biztos
(#) gabi20 hozzászólása Aug 22, 2016 /
 
Sziasztok megérkezett az FPGA panelom (DLP-HS-FPGA2) Elég drága volt de nem kell hozzá külön programozó, USB porton keresztül lehet programozni, táplálni. Van hozzá ingyenesen letölthető demo konfig fájl, plusz PC program amin keresztül például IO portokat lehet kapcsolgatni. Xilinx spartan XC3S400A FPGA van beépítve. Ez mind működik, csak fejlesztőkörnyezetet nem tudom ,hogy milyet töltsek le hozzá. VHDL-ben szeretnék dolgozni. Esetleg tudtok valamilyen ingyenesen letölthetőt ajánlani hozzá?

DSC00003.JPG
    
(#) Balázs válasza gabi20 hozzászólására (») Aug 22, 2016 / 1
 
(#) pajti2 válasza gabi20 hozzászólására (») Aug 22, 2016 / 1
 
Xilinx ISE Design Suite 14.7

Az oldalt egy kicsit letekered, a középső mezőben találni fogsz 4x 2 gigás file-okat, azokat szedd le. Regisztrálnod kell hozzá. Majd ne ijedj meg, sokáig települ. Megnéztem nálam az install mappát 17.2 giga, 19120 mappa, 239550 file.
(#) gabi20 hozzászólása Aug 22, 2016 /
 
Köszönöm a segítséget, még ma megpróbálom letölteni.
(#) holex hozzászólása Dec 3, 2016 /
 
Írtam verilogban egy összeadót. Kap egy órajelet, két egybites bemenetet és van egy kétbites kimenete. Ha "rendesen" bekötöm a kimenetén a két bitet, akkor a szimulációban "lassan" fut fel a jel, ahogy az a valódi hardverben is elvárható. Ellenben ha csak az LSB-t, akkor azonnali a változás. Ez mitől van?
Az összeadó bemenetei n1 és n2, kimenete out2, szimuláció mellékletben.

sim1.JPG
    
(#) zenetom válasza pajti2 hozzászólására (») Dec 3, 2016 /
 
Ja, én is lestem, mikor felraktam, felveszi a versenyt az Android IDE/SDK-val, az sem piskóta.
(#) killbill válasza holex hozzászólására (») Dec 4, 2016 /
 
A Verilog forras valoszinuleg segitene a problema megerteseben. Meg a "rendesen" es a "lassan fut fel a jel" kifejezesek sem vilagosak szamomra.
(#) holex hozzászólása Dec 4, 2016 /
 
  1. module adder(input clk, n1, n2, output reg [1:0] sum);
  2.   initial begin
  3.     sum = 0;
  4.   end
  5.   always@(posedge clk)
  6.     sum <= n1+n2;
  7. endmodule
  8.  
  9. module adder2(input clk, n1, input [1:0] n2, output reg [1:0] sum);
  10.   initial begin
  11.     sum = 0;
  12.   end  
  13.   always@(posedge clk)
  14.     sum <= n1+n2;
  15. endmodule
  16.  
  17. module addertest();
  18.     reg clk;
  19.     reg n1,n2;
  20.     wire [1:0] sum;
  21.     wire [1:0] out;
  22.     wire  out2; //ha ezt lecserelem wire [1:0] out2-re, akkor lesz valtozas
  23.     adder adder1(clk,n1,n2,sum);
  24.     adder2 addertwo(clk,n1,sum,out);
  25.     adder adderone(clk,n1,n2,out2);
  26.     always@(clk)
  27.     begin
  28.         #1 clk <= ~clk;
  29.     end
  30.    
  31.     initial begin
  32.        clk <= 0;
  33.        n1 <= 0;
  34.        n2 <= 1;
  35.        #1;
  36.        n1 <= 1;
  37.        #4;
  38.        n1 <= 0;
  39.        #10;
  40.        $finish;
  41.     end
  42. endmodule


A gyors meg a lassú felfutás alatt pedig azt értem, ami a szimuláción is látszik: az egyik esetben azonnal megváltozik az érték (függőleges vonal a waveform-on), a másik esetben meg van egy beállási idő.
(#) Andr3wJ válasza holex hozzászólására (») Dec 4, 2016 /
 
Szerintem semmi gond nincs ott. Amit te lassú felfutásnak gondolsz az csak a rajzi jele annak hogy ott több bit szerepel, ha a bal oldali bekarikázott részben kinyitod az adott értéket külön külön látod a bitek jelformáit.
A hozzászólás módosítva: Dec 4, 2016

sim1.JPG
    
(#) holex válasza Andr3wJ hozzászólására (») Dec 4, 2016 /
 
Értem, köszönöm. Ebben az esetben viszont valami más nem világos. Amikor megjön az órajel felfutó éle és ezzel egy időben változik meg a bemenetek értéke is, akkor az eredmény az előző vagy az új bemeneti értékek összege lesz?

Tehát: n2 = 1. Megjön az első órajel, ezzel egy időben n1 = 1. Ekkor a sum = 2 lesz, amiből az következik, hogy már az új értékeket adta össze. Ezt a logikát követve, ha az out-ot nézzük, ami az n1 és a sum összege, 3-ra kellene, hogy beálljon. De nem 3-ra áll be, hanem 1-re, és majd csak a következő felfutó élnél lesz 3. Olyan, mintha az n1-nek már az új értékét látná, a sumnak viszont az előző értékét. Most akkor hogy is van ez? Nem igazán kapisgálom. Köszönöm a segítséget előre is.

sim.JPG
    
(#) Andr3wJ válasza holex hozzászólására (») Dec 4, 2016 /
 
Az a baj hogy a verilogot nem látom át, VHDL-ben is irtó gyenge a tudásom.

VHDL-ben van egy olyan tulajdonság hogy egy jelhez(signal) csak delta-késleltetlés után lehet értéket hozzárendelni, változó(variable) meg azonnal felveszi az értéket. Ez okozhat késést de nem tudom verilogban van e ilyen.
(#) killbill válasza holex hozzászólására (») Dec 4, 2016 /
 
A regisztered az orajel felfutasakor felveszi azt az erteket, ami a bemeneten van. Tehat, ha
  1. always @ (posedge clk) begin
  2.   a <= b + 1;
  3.   c <= a + 1;
  4. end
eseten, ha az orajel felfutasa elott 'b' erteke 0 es 'a' erteke is 0, akkor az orajel utan 'a' 1 lesz, es 'c' is 1 lesz, mivel a felfuto el pillanataban az 'a' erteke meg 0 volt. Ezert a 'c' regiszter bemeneten 0 + 1 ertek volt. Aztan a felfuto el utan egy kis idovel mar 1 + 1 lesz a 'c' regiszter bemeneten, de csak egy kis ido elteltevel. Ez a HW valos kesleltetese. Ha ez nem igy lenne, akkor nem lehetne shift regisztert csinalni, es nagyjabol nem letezne digitalis elektronika. Ez a lenyege a szinkron logikaknak: minden regiszter teljesen egyszerre valt. CPLD, FPGA vilagban ez eleg jellemzo. Persze ehhez az is hozzatartozik, hogy a regiszterek orajele egymashoz kepest nem terhet el idoben, ezert van ezekben a chip-ekben orajel eloszto halozat, ami garantalja, hogy az egesz chip teruleten mindenut egyszerre jelenjen meg az orajel. Egy CPLD vagy FPGA eseten nagyjab 1...8 ilyen dedikalt orajel halozat szokott lenni.
(#) holex válasza killbill hozzászólására (») Dec 4, 2016 /
 
Igen, számomra is így lenne a logikus. De akkor a 11:36-kor írt hozzászólásomban a képen, hogy lehet, hogy sum értéke azonnal 2-re vált (1 ns-nál), pedig nem volt ott a jel az órajel felfutása előtt? Ezzel szemben viszont az out pont a leírásod szerint működik, és csak a következő felfutó élnél, 3 ns-nál veszi fel az új értéket.
(#) killbill válasza holex hozzászólására (») Dec 4, 2016 /
 
Mert a szimulacioban ez a kesleltetes maskepp van. A valosaban, ha egy regiszter bemenete egyutt valtozik az orajellel, egesz pontosan, ha setup es hold time-on belul valtozik, akkor nem lehet tudni, hogy a regiszter milyen erteket fog felvenni. Nalad az n1 erteke egyszerre valt a clk-val, es ezert a szimulacio ugy tekinti, hogy mar az orajel felfutasa elott 1-ben volt. A valosagban ennek az eredmenye bizonytalan mukodes lenne. Az elvezerelt tarolokra megadnak egy setup es hold time-ot, ami azt jelenti, hogy a bemenet az orajel aktiv ele elott setup idovel mar stabil kell legyen, es az orajel aktiv ele utan meg hold ideig stabil kell maradjon. Ha ezt az idozitesi kreiteriumot nem tartod be, akkor olyan is elofordulhat, es elo is fordul, hogy a tarolo felvesz valamilyen erteket, aztan kicsit kesobb atbillen masra. Ez komoly problema tud lenne aszinkron jelek fogadasanal, de szerencsere vannak ra megoldasok.
(#) holex válasza killbill hozzászólására (») Dec 4, 2016 /
 
"Nalad az n1 erteke egyszerre valt a clk-val, es ezert a szimulacio ugy tekinti, hogy mar az orajel felfutasa elott 1-ben volt"

Oké, én ezt értem, de akkor az out esetén miért nem így működik? Az miért nem vált 1 ns-nál 3-ra (n1+sum), miért csak 3 ns-nál? Az nem világos, hogy miért nem ugyanaz a logika érvényesül mindkét esetben.
(#) killbill válasza holex hozzászólására (») Dec 4, 2016 /
 
Mert 1ns-nál, az orajel felfutasanak pillanataban az n1 = 1, n2 = 1, a sum viszont még 0. Az orajel lefutasakor ezekkel az ertekekkel szamol ki mindent, es tolti be az uj ertekeket a regiszterekbe egyszerre (ettol szinkron).

Ezert 1ns-nal a sum n1 + n2 lesz, ami 2, az out viszont n1 + sum, azaz 1 + 0, ami 1; A kovetkezo orajelnel mar sum = 2, n1 = 1, tehat akkor mar 3 lesz az out.

Told el az orajelet es az n1 allitasanak idejet egymastol idoben es akkor jobban fogod latni, hogy mi tortenik. Eleg, ha a clk-t 2ns-onkent lepteted.
(#) holex válasza killbill hozzászólására (») Dec 4, 2016 /
 
Áá, megvilágosodtam Köszönöm szépen a magyarázatot. Már egy hete ezen kattog az agyam, hogy miért nem úgy csinálja, ahogy én gondolom.
(#) Balázs válasza holex hozzászólására (») Dec 11, 2016 /
 
Plusz adalék, ha még érdekel: az órajellel egyszerre változó jelek ütemezését nem konstans késleltetésekkel érdemes megoldani a szimulációban. Vagy ha ragaszkodsz hozzá, akkor told el egy kicsit az élváltásokat, ahogy Killbill javasolta. De van egy elegánsabb megoldás, az @ jel használata a testbenchben. Itt egy példa:
  1. @(negedge Bus2IP_Clk) codec_mclk=0;

Ha így oldod meg, akkor a szimuláció eredménye meg fog felelni a valóságnak, tehát az órajellel egyszerre változó jelek mintavételezése csak a következő ütemben fog érvényesülni.
(#) holex válasza Balázs hozzászólására (») Dec 12, 2016 /
 
Szia! Köszönöm, ez tényleg egy sokkal elegánsabb megoldásnak tűnik. Csak egy bajom van vele: nem tudom megcsinálni. Vagyis megcsináltam, csak nem működik. Sajnos még nem rég kezdtem el Verilogozni. Át tudnád esetleg írni a testbenchemet erre a formára?

  1. module addertest();
  2.     reg clk;
  3.     reg n1,n2;
  4.     wire [1:0] sum;
  5.     wire [1:0] out;
  6.     wire  out2; //ha ezt lecserelem wire [1:0] out2-re, akkor lesz valtozas
  7.     adder adder1(clk,n1,n2,sum);
  8.     adder2 addertwo(clk,n1,sum,out);
  9.     adder adderone(clk,n1,n2,out2);
  10.     always@(clk)
  11.     begin
  12.         #1 clk <= ~clk;
  13.     end
  14.    
  15.     initial begin
  16.        clk = 0;
  17.        n1 = 0;
  18.        n2 = 1;
  19.        #1;
  20.        n1 = 1;
  21.        #4;
  22.        n1 = 0;
  23.        #10;
  24.        $finish;
  25.     end
  26. endmodule


Köszönöm!
A hozzászólás módosítva: Dec 12, 2016
(#) holex válasza holex hozzászólására (») Dec 12, 2016 /
 
Oké, azt hiszem jó lesz, csak blokkoló helyett nem blokkoló utasításokat kell használnom (ezt mondjuk nem értem miért, szinte az összes netes példában blokkolót használnak).
(#) Balázs válasza holex hozzászólására (») Dec 13, 2016 /
 
Azt én sem értem, szimulációban én is sima egyenlőségjeleket szoktam írni. Ezt a kódot most másoltam ki egy régi projektemből. Lefuttat egy jelet, vár két órajelnyit, majd felfuttatja:
  1. @(negedge Bus2IP_Clk) codec_mclk=0;
  2. @(negedge Bus2IP_Clk);
  3. @(negedge Bus2IP_Clk);
  4. @(negedge Bus2IP_Clk) codec_mclk=1;
(#) SBahadurD hozzászólása Dec 14, 2016 /
 
Sziasztok!

FPGA-n való implementációra milyen medián kereső algoritmust ajánlotok?

Vivado HLS-ben kell implementálni, szóval C-ben lehet programozni, de jó lenne olyan algoritmus, amit azért könnyen tud a szintézer FPGA-ra implementálni.
9 db. 13 bites számnak kéne a mediánját kiválasztani.

Mondjuk valamilyen HDL-en megírva milyen algoritmust, módszert választanátok?

Köszi!
(#) pajti2 válasza SBahadurD hozzászólására (») Dec 15, 2016 /
 
Szia!

A "könnyen tud implementálni" lefordítva -> "temérdek sok erőforrás, amit pocsékolhatsz"

Melyik magra kellene ráférnie annak az összeadó & osztónak? Azok a 13 bites számok legalább egész formában vannak ábrázolva, vagy lebegőpontosak ?
Következő: »»   40 / 49
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem