è¯ãäžæ¥ïŒ åã®èšäºã§ã Altreraã® SoCããŒããããäžãããæ¹æ³ã«ã€ããŠèª¬æããŸããã
ããã»ããµã«ãã£ãŠã³ããŒãå®è¡ããããšãã«ã CPUãšFPGAéã®ã¹ã«ãŒãããã枬å®ããããšã«æ±ºããŸããã
ä»åã¯ããå°ãé²ãã§ãããªããã£ãDMAãFPGAã«å®è£ ããŸãã
誰ãæ°ã«ããŸã-ç«ãžããããã
äžå€é
ååã¯ã EBVã® SoCratesã䜿çšããŸãã ã
ä»åã¯ãç§ãã¡èªèº«ã®éçºã®ããŒãã䜿çšããŸã-åçã«ç€ºãããŠããã®ã¯ããã§ãã
äž»ãªéãã¯ãããŒãã«2 ã®ã¬ãããã€ãŒãµãããã€ã³ã¿ãŒãã§ã€ã¹ããããCPUã«ã§ã¯ãªããFPGAã«æ¥ç¶ãããŠããããšã§ãã
ããã«ãããéåžžã«æè»ãªãã©ãã£ãã¯åŠçãå¯èœã«ãªããŸãã ããã«ãå€æ°ã®ãã³ãã³ãã¯ã¿ã«åºåãããŸãã
ãããããããã®éãã¯ã以äžã®èšäºã§ã®ã¿éèŠã«ãªããŸãã
1ã€ã¯ãFPGAã«NICãå®è£ ããããšã§ããããã«ã¯ããã¡ãããã®ã¬ãããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŸãã å¥ã®æ¹æ³ã§ã¯ãåã³ILI9341ãã£ã¹ãã¬ã€ã®ãã¬ãŒã ãããã¡ãŒãµããŒããFPGAã§èšè¿°ããŸããããã«ã¯æ¡åŒµã«ãŒããå¿ èŠã§ãã
ãŸãã以äžã§èª¬æããã¢ã¯ã·ã§ã³ãå®è¡ããã«ã¯ã SoC Cyclone VãæèŒããããŒããé©ããŠããŸã
ãœãŒã¹ã³ãŒã
èšäºã®éçšã§ãéèŠãªã³ãŒãã®ã¿ã説æããŸãã
ãã¹ãŠã®ãœãŒã¹ã³ãŒãã¯githubã§è¡šç€ºã§ããŸã
詳现
åã®èšäºã§èª¬æããã«ãŒãã«ã®æ§ç¯ãããŒãããŒããŒã®ååŸããã®ä»ã®ã¢ã¯ã·ã§ã³ã®è©³çŽ°ã«ã€ããŠã¯èª¬æããŸããã
ã«ãŒãã«ã«é¢ãã泚æ-ããããææ°ã®ã«ãŒãã«ããŒãžã§ã³3.18ã䜿çšããããšããå§ãããŸãã
git clone git://git.rocketboards.org/linux-socfpga.git git checkout remotes/origin/socfpga-3.18
å®è£ ã«ã€ããŠèãã
DMAã³ã³ãããŒã©ã®éžæ
ãããã£ãŠãç§ãã¡ã®ç®æšã¯ãæ倧垯åå¹ ãšæå°CPUè² è·ã§FPGAããããã»ããµã«ããŒã¿ã転éããããšã§ãã
ããã»ããµãã³ããŒãããªãã·ã§ã³ã¯ããã«æ¶ããŸããDMAã䜿çšããå¿ èŠããããŸãã ãããã誰ãDMAã³ã³ãããŒã©ãŒã®åœ¹å²ãæããããšãã§ããŸããïŒ
SoCã«ã¯ãFPSãŸãã¯HPSã«çµã¿èŸŒãŸããDMA-330ã³ã³ãããŒã©ãŒã®2ã€ã®ãªãã·ã§ã³ããããŸãã
ãããã¯ãŒã¯ã«é¢ããè°è«ããå€æãããšãDMA-330ã®çç£æ§ã¯ããã»ã©é«ããªãã察å¿ãããã©ã€ããŒãå®å šã«ã¯åäœããªãå¯èœæ§ããããŸãã
ãããããã€ããDMA-330ãã埩掻ããããããšããŸãããä»ã§ã¯FPGAãéžæããŸã
ã€ã³ã¿ãŒãã§ãŒã¹ã®éžæ
DMAã³ã³ãããŒã©ã®æ©èœãå®è¡ããã«ã¯ãFPGAããŠã£ã¶ãŒãã§ãªããã°ãªããŸããã ããã¯ã次ã®2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ããããã§å®è£ ã§ããŸãã
- FPGAããHPSïŒ fpga2hps ïŒ
- FPGA-to-HPS SDRAMïŒ fpga2sdram ïŒ
HPSã³ã³ããŒãã³ããšãããã®éã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ãããã¯å³ïŒ
HPSã¢ãŒããã¯ãã£
åãªãã·ã§ã³ã®é·æãšçæãèŠãŠã¿ãŸãããã
fpga2hpsã䜿çšãããšãFPGAã®ãã¹ã¿ãŒãã·ã¹ãã å ã®ã»ãŒãã¹ãŠã®ã¹ã¬ãŒãã«ã¢ã¯ã»ã¹ã§ããŸãã ããã¯ãèšæ¶ãšããŠã ãã§ãªããå€æ§ãªåšèŸºãžã®ããšããããšã§ãã
fpga2sdramã䜿çšãããšãFPSãHPSããææãããDPSã¡ã¢ãªãšé£æºã§ããŸãã ãã®å Žåãã¢ã¯ã»ã¹ã¯RAMã«ãã£ãŠã®ã¿å¶éãããŸãã
fpga2sdramã䜿çšãããšãããå€ãã®åž¯åå¹ ãååŸã§ããŸãã
fpga2hpsã䜿çšãããšã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§äº€æãè¡ãããŸãã FPGAã«è€æ°ã®ãã¹ã¿ãŒãå¿ èŠãªå Žåã¯ã調åãå¿ èŠã§ãã ãã®ãããç¬èªã®ã¢ãžã¥ãŒã«ãäœæããããQsysã䜿çšããŠçæãããã¢ãžã¥ãŒã«ã䜿çšããå¿ èŠããããŸããããããã¯ããªããªãœãŒã¹ãæ¶è²»ããŸãã
äžæ¹ãæ倧6ã€ã®ç¬ç«ããããŒããfpga2sdramã§äœæã§ããDDRã³ã³ãããŒã©ãŒã¯èª¿åã®ãã¹ãŠã®åé¡ã解決ããŸãã
泚ïŒçªå·6ã¯å®å šã«ãæ£çŽãã§ã¯ãããŸãã-6ã€ã®ã³ãã³ãããŒãã4ã€ã®æžã蟌ã¿ããŒãã4ã€ã®èªã¿åãããŒãã䜿çšå¯èœã§ãã
åæã«ã1ã€ã®128ãããã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãæåã®ã³ãã³ãããŒãã2ã€ã®æžã蟌ã¿ããŒãã2ã€ã®èªã¿åãããŒãã䜿çšããå¿ èŠããããŸãã
fpga2hpsãšfpga2sdramã¯ã䜿çšããåã«é©åãªã¬ãžã¹ã¿ã«æžã蟌ãããšã§åæåããå¿ èŠããããŸãã æ®å¿µãªããã fpga2sdramã®å Žåãããã¯FPGAãã¡ãŒã ãŠã§ã¢ã®åŸã§è¡ãå¿ èŠããããŸãããçŸæç¹ã§ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã©ã³ã¶ã¯ã·ã§ã³ãçºçããŠããŸããã å®éã Linuxã䜿çšããå Žåãããã¯UããŒãã§FPGAããã©ãã·ã¥ããå¿ èŠãããããšãæå³ããŸãã 詳现ã¯ãã¡ããã芧ãã ãã ã
fpga2hpsã䜿çšããå ŽåãFPGA ã®ãã¹ã¿ãŒã¯fpga2sdramã䜿çšããå Žåãã¯ãŒãã®ã¢ãã¬ã¹ã§ãããã€ãã¢ãã¬ã¹ã䜿çšããå¿ èŠããããŸãã
詳现ã«ã€ããŠã¯ã Cyclone V Device HandbookãVolume 3ïŒHard Processor System Technical Reference Manualãåç §ããŠãã ãã ã
HPS-FPGAããªããžã®ç¬¬8ç« ããã³11 SDRAMã³ã³ãããŒã©ãŒãµãã·ã¹ãã ã
ãã®ã¿ã¹ã¯ã§ã¯ãäœã䜿çšããããšããåºæ¬çãªéãã¯ãããŸããã ããå€ãã®åž¯åå¹ ãååŸããããšãæåŸ ããŠã fpga2sdramãéžæããŸãããã
DMAã³ã³ãããŒã©ã®å®è£ ãéžæãã
DMAã³ã³ãããŒã©ãŒãFPGAã«å®è£ ããã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠæ©èœãããã決å®ããŸããã
ããããã³ã³ãããŒã©ãŒèªäœãã©ã®ããã«äœæããã®ã§ããããïŒ éããŠãããããŒã«ãã®1〠ãããšãã°ãã®1ã€ã䜿çšã§ããŸããããã¯Qsysãããå©çšã§ããŸãã
ããã¯ãå€ãã®äŸ¿å©ãªæ©èœãåããåªããDMAã³ã³ãããŒã©ãŒã§ãã NICãå®è£ ãããšãããã«æ»ããŸãã
ãããä»ãç§ãã¡ã®ä»äºã«ãšã£ãŠããã®ãããªã³ã³ãããŒã©ãŒã¯äžå¿ èŠãªæ©èœãšäžå¿ èŠãªè€éãã§ãã
åŠç¿ã¿ã¹ã¯ã®å ŽåãDMAã³ã³ãããŒã©ãŒã®æ¬è³ªãéåžžã«ã·ã³ãã«ã§ããããšãç解ããããã«ãFPGAã§ããã€ãã®ã«ãŠã³ã¿ãŒãã¹ã±ããããããšããå§ãããŸãã
ãããã¬ãã«
ãœãããŠã§ã¢åŽãããããã¹ãŠãéåžžã«åçŽã§ããã¡ã¢ãªãå²ãåœãŠããã®ã¡ã¢ãªã®ãã¹ã¢ãã¬ã¹ãååŸããFPGAã§DMAã³ã³ãããŒã©ãæ§æããŠèµ·åãããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŠããŒã¿ãåä¿¡ããã®ãåŸ ã€ãã©ã€ããå¿ èŠã§ãã
ãããŠããããæžããŸãã ãããããã©ã€ããŒããã§ã¯ãªããåãæ©èœãå®è¡ãããŠãŒã¶ãŒã¹ããŒã¹ã®å°ãå¥åŠãªããã°ã©ã ããå§ããŸãã
ããã«ãããã«ãŒãã«ã¬ãã«ã§äœããèšè¿°ããããšãªããFPGAã§DMAã³ã³ãããŒã©ãŒãæäœã§ããŸãã
ããããã¯ã·ã§ã³ãã§ã¯ããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯é垞䜿çšãããŸãããããããã°ã«äŸ¿å©ãªå ŽåããããŸãã
FPGAã®ãã¡ãŒã ãŠã§ã¢ãç°¡åã«ããããã«ãFPGA-> CPUã®æ¹åã«ããŒã¿ã転éããŸãã
å察æ¹åã®ããŒã¿è»¢éã¯ã以äžã§èª¬æãã1ã€ã®ãã¥ã¢ã³ã¹ãé€ããã»ãŒå®å šã«é¡äŒŒããŠããŸãã
CPU-> FPGAã®æ¹åã§ã LCDã®ãã¬ãŒã ãããã¡ã®å®è£ ãåŠçããŸãã
ã ãããèšç»ïŒ
- FPGAã®ãã¡ãŒã ãŠã§ã¢
- ãŠãŒã¶ãŒã¹ããŒã¹ã®ããã°ã©ã
- ã«ãŒãã«ãã©ã€ããŒ
FPGAãã¡ãŒã ãŠã§ã¢ã®å®è£
ææã®Qsysããå§ããŸãããã 次ã®3ã€ã®IPããŒã«ãå¿ èŠã§ãã
- ããã»ããµãŒãšåšèŸºæ©åš->ããŒãããã»ããµãŒã·ã¹ãã -> Arria V / Cyclone VããŒãããã»ããµãŒã·ã¹ãã
- åºæ¬æ©èœ->ããªããžãšã¢ããã¿ãŒ->ã¡ã¢ãªããã-> Avalon-MM Pipeline Bridge
- åºæ¬æ©èœ->ããªããžãšã¢ããã¿ãŒ->ã¯ããã¯->ã¯ããã¯ããªããž
HPSã«ã€ããŠã¯ããã¹ãŠãåã®èšäºãšã»ãŒåãã«ããŠãããŸãã
[ FPGA Interfaces ]ã¿ãã§ã FPGA-to-HPS SDRAMã€ã³ã¿ãŒãã§ã€ã¹ãè¿œå ããå¿ èŠããããŸãã
ã¿ã€ãAvalon-MM Bidirectional ãwidth-128ããããéžæããŸãã
[ FPGAããHPSãžã®å²ã蟌ã¿ãæå¹ã«ãã]ã®æšªã«ãããã§ãã¯ããã¯ã¹ããªã³ã«ããå¿ èŠããããŸãã
ããã«ãããDMAã³ã³ãããŒã©ãŒã¯å²ã蟌ã¿ãä»ããŠãã©ã³ã¶ã¯ã·ã§ã³ã®å®äºãCPUã«ãéç¥ãã§ããŸãã
ãŸãã HPS-FPGAã€ã³ã¿ãŒãã§ã€ã¹ã®å¹ ã¯64ãããã«èšå®ããå¿ èŠããããŸãã ããã¯ãCPUãDMAã³ã³ãããŒã©ãŒãæ§æããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
ãã®å¹ ã¯ä»»æã§ã64ããããèšå®ããã®ã¯ããã®ãããªå¹ ãéžæããããã§ããããã®å€ã«å¯ŸããŠä»¥äžã§èª¬æãããœãŒã¹ã³ãŒããæ§æãããŠããŸãã
ååŸããå¿ èŠããããã®ã¯æ¬¡ã®ãšããã§ãã
FPGAã€ã³ã¿ãŒãã§ãŒã¹
Avalon-MM Bridgeã«ç§»åããŸãã
ãã®ç®ã¯ã³ã³ããŒã¿ãŒãšããŠæ©èœããŸãã HPS-to-FPGAãèªåçæãããQsysã¢ãžã¥ãŒã«ããå€éšã«ãšã¯ã¹ããŒãããå¿ èŠããããŸãã
ãããããããè¡ãã ãã§AXIã€ã³ã¿ãŒãã§ã€ã¹ãåŸãããŸãããããã¯Avalon-MMãããã¯ããã«è€éã§ãã ãããŠã誰ãšãäžç·ã«åããããããŸããã ãã®ã¢ãžã¥ãŒã«ãè¿œå ãããšãQsysã¯AXIãAvalonã«èªåçã«å€æããŸãã ããã€ãã®ãªãœãŒã¹ãå¿ èŠã«ãªããŸãããäœæ¥ããã®ãã¯ããã«äŸ¿å©ã§ãã
次ã®ããã«ã¢ãžã¥ãŒã«ãæ§æããå¿ èŠããããŸãã
Avalon-mmããªããž
æåŸã®ã¢ãžã¥ãŒã«ã«é²ã¿ãŸãã HPSããå€éšã«ããã¯ããšã¯ã¹ããŒãããŠããã®ããã¯ã®DMAã³ã³ãããŒã©ãŒãåæã§ããããã«ããããã«å¿ èŠã§ãã ãã®èšå®ã¯ããªããã£ãã§ã-1ã«çããã·ã¥ã¬ããã®æ°ãæå®ããã ãã§ãã
ãã®åŸããã¹ãŠã®ã¢ãžã¥ãŒã«ãæ¥ç¶ããå¿ èŠããããŸãïŒ[ ãšã¯ã¹ããŒã ]åã®ååã«æ³šæããŠãã ããïŒã
Qsysæ¥ç¶
ãã¡ã€ã«ãä¿åããã³çæããããã«æ®ããŸãã
ããªããã£ãDMAã³ã³ãããŒã©ãå®è£ ãããšããæ¥ãŸããã ã©ã®ããã«èšå®ããŸããïŒ
ã«ã¹ã¿ãã€ãºã«ã¯ãããããå¶åŸ¡ããã³ã¹ããŒã¿ã¹ã¬ãžã¹ã¿ïŒ CSR ïŒã䜿çšããŸã
ãããã¯ãCPUãèªã¿åã/æžã蟌ã¿ïŒå¶åŸ¡ïŒãŸãã¯èªã¿åãå°çšïŒã¹ããŒã¿ã¹ïŒã«äœ¿çšã§ããåºå®ãµã€ãºã®ãããã¯ã§ãã
ãããã®ã¬ãžã¹ã¿ãžã®ã¢ã¯ã»ã¹ã¯ã HPS-to-FPGAãä»ããŠè¡ãããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®å¹ ã¯64ããããªã®ã§ãã¬ãžã¹ã¿ãåãå¹ ã«ããããã³ã³ããŒã¿ãè¿œå ã§ããŸãã
ã¬ãžã¹ã¿ã64ãããã«ããããšã¯éåžžã«é«äŸ¡ã§ãã å®éãéåžžã«å€ãã®å Žåãã¬ãžã¹ã¿å šäœã§ã¯æ°ãããã®ã¿ã䜿çšãããŸãã
ã¬ãžã¹ã¿ã16ãããã«ããããšããå§ãããŸããé«ãããã¯ãŒããå¿ èŠã«ãªãå Žåã¯ã2ã€ãŸãã¯4ã€ã®é£æ¥ããã¬ãžã¹ã¿ã䜿çšããŸãã
çè«çã«ã¯ãQsysã«ãã£ãŠçæãããã³ã³ããŒã¿ãŒã䜿çšããŠã Avalon-MM Bridge IPããŒã«ã«16ãããã®å¹ ãæå®ããããšãã§ããŸããããå®éã«ã¯ãããè¡ãããšãã§ããŸããã§ãã-Qsysã¯åäœäžèœãªã¢ãžã¥ãŒã«ãçæããŸããã 倧äžå€«ãç§ãã¡ã¯ããã䜿çšããŸã:)
avalon_width_adapter.svã¢ãžã¥ãŒã«ã¯ã³ã³ããŒã¿ãŒãšããŠäœ¿çšãããã¬ãžã¹ã¿èªäœã¯regfile_with_be.vã¢ãžã¥ãŒã«ã§å®è£ ãããŸã
ã¬ãžã¹ã¿ã¢ãžã¥ãŒã«ã®ããžãã¯ã¯éåžžã«åçŽã§ããã¢ãã¬ã¹ã«å¿ããŠãç®çã®ã¬ãžã¹ã¿ã®å 容ãèªã¿åããã¹ã«èšå®ããŸãã æžã蟌ã¿ä¿¡å·ãå°çããå Žåãå ¥åããŒã¿ãã¬ãžã¹ã¿ã«ä¿åããŸãã ã¢ãã¬ã¹ã¯ããã€ãçªå·ã§ã¯ãªãã¬ãžã¹ã¿çªå·ãæå®ããŸãã å¶åŸ¡ããã³ã¹ããŒã¿ã¹ã¬ãžã¹ã¿ãžã®åå²æ¹æ³ã¯ãã¢ã»ã³ããªäžã®ãã©ã¡ãŒã¿-ã¢ãã¬ã¹ã®äžäœãããïŒãã®å Žåãã¢ãã¬ã¹ç©ºéã¯å¶åŸ¡ããã³ã¹ããŒã¿ã¹ã¬ãžã¹ã¿éã§åçã«åå²ãããŸãïŒããŸãã¯ãã©ã¡ãŒã¿ã§ç€ºãããã¬ãžã¹ã¿ã®æ°ã«ãã£ãŠèšå®ãããŸãã
DMAã³ã³ãããŒã©ãŒã«çŽæ¥æž¡ããŸãã ç°¡åã«ããããã æäžäœã¢ãžã¥ãŒã«ã«ãããŸã ã
DMAã³ã³ãããŒã©ãŒã§æ§æãããã®ã¯ã3ã€ã®ã«ãŠã³ã¿ãŒãš1çµã®ä¿¡å·ã ãã§ãã
ã³ã³ãããŒã©ãŒãAvalon-MMã€ã³ã¿ãŒãã§ãŒã¹ã«ããŒã¿ãçºè¡ããããšãæãåºãããŠãã ããã 詳现ãªèª¬æã¯ããã«ãããŸãããäžè¬çã«ã¯ããªãã·ã³ãã«ãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
ããŒã¿ãèšé²ããã«ã¯ã次ã®ä¿¡å·ãèšå®ããå¿ èŠããããŸãã
- sdram0_address-ã¢ãã¬ã¹ïŒ fpga2sdramã®å Žåã¯åèªã®ã¢ãã¬ã¹ã§ããå¿ èŠãããããšãæãåºãããŠãã ãã ïŒã
- sdram0_writedata-æžã蟌ã¿çšã®ããŒã¿ã
- sdram0_byteenable-ããŒã¿ã®ã©ã®ãã€ããæžã蟌ãã¹ããã瀺ãä¿¡å·ã ç°¡åã«ããããã«ã 16'hFFFFã«èšå®ããŸã ã
- sdram0_burstcount-ããŒã¹ããå¶åŸ¡ããããã®ä¿¡å·ã ç¹°ãè¿ããŸãããç°¡åã«ããããã«ã1ã«èšå®ããŸãã
- sdram0_write-æžã蟌ã¿ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããã«ã¯ããã®ä¿¡å·ã1ã«èšå®ããå¿ èŠããããŸã
泚æãã¹ãå¯äžã®æ³šæç¹ã¯ã sdram0_waitrequestä¿¡å·ã®ååšã§ãã 1ã®å Žåãããã¯ã¹ã¬ãŒããçŸæç¹ã§ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçã§ããªãããšãæå³ãããã¹ã¿ãŒã¯ãã¹ãŠã®ä¿¡å·ãå€æŽããªãã§ããå¿ èŠããããŸãã sdram0_waitrequestä¿¡å·ã1ã«èšå®ãããæçµçã«DMAã®ã¹ã«ãŒãããã決å®ããæ£ç¢ºãªé »åºŠã
ãã®ããã䜿çšãããã«ãŠã³ã¿ã«ã€ããŠèª¬æããŸãã æåã¯ã¢ãã¬ã¹ã«ãŠã³ã¿ãŒaddr_cntã§ãã DMAãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããããšãCPUã«ãã£ãŠæå®ãããã¢ãã¬ã¹ã«èšå®ãããŸãã åãã©ã³ã¶ã¯ã·ã§ã³ãæåããåŸïŒ sdram0_waitrequestã 1 ã§ãªãå ŽåïŒããã®ã«ãŠã³ã¿ãŒã¯1ãã€å¢å ããŸãã
2çªç®ã¯ãããŒã¿ããšãã¥ã¬ãŒãããããã®data_cntã«ãŠã³ã¿ãŒã§ãã å¿ èŠãªããŒã¿ãããŒã¿ã«æžã蟌ãããšãã§ããŸãã äž»ãªæ¡ä»¶ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®å®äºåŸããœãããŠã§ã¢ãã¡ã¢ãªããèšé²ãããããŒã¿ãšãŸã£ããåãããŒã¿ãèªã¿åãå¿ èŠãããããšã§ãã ãããã£ãŠãåçŽãªã«ãŠã³ã¿ãŒãèšè¿°ããããšã¯ããŸãæ£ç¢ºã§ã¯ãããŸãããããŒã¿ã«ã¯å€ãã®ãŒãããããã¬ã³ãŒãã®æå¹æ§ãæ€èšŒããããšã¯å°é£ã§ãã æ¬äŒŒã©ã³ãã ã·ãŒã±ã³ã¹ãèšè¿°ããã®ãçæ³çã§ãããç°¡åã«ããããã«ãã«ãŠã³ã¿ãŒãšãã®å転å€ã§ååã§ãã
3çªç®ã®ã«ãŠã³ã¿- ãµã€ã¯ã«ã«ãŠã³ã¿cycle_cntã¯ãDMAãã©ã³ã¶ã¯ã·ã§ã³ã®éå§æã«0ã«ãªã»ãããããåãµã€ã¯ã«ã§1ãã€å¢å ããŸãã
DMAãã©ã³ã¶ã¯ã·ã§ã³ã«ããã£ãã¯ããã¯æ°ã調ã¹ãŠã¹ã«ãŒããããèšç®ã§ããããã«ããããã«å¿ èŠã§ãã
åèšãã«ãŠã³ã¿ãŒã«ã€ããŠã¯æ¬¡ã®ã³ãŒããååŸããŸãã
ã«ãŠã³ã¿ãŒã®èª¬æ
// For emulate data logic [63:0] data_cnt; // Current address on SDRAM iface logic [31:0] addr_cnt; // Overall cycles count. logic [31:0] cycle_cnt; // Form pseudo-data always_ff @( posedge clk_w ) if( !test_is_running ) data_cnt <= '0; else if( !sdram0_waitrequest ) if( data_cnt != ( dma_data_size - 1 ) ) data_cnt <= data_cnt + 1; // Increase address if no waitrequest always_ff @( posedge clk_w ) if( run_test_stb ) addr_cnt <= dma_addr; else if( !sdram0_waitrequest ) addr_cnt <= addr_cnt + 1; always_ff @( posedge clk_w ) if( test_is_running_stb ) cycle_cnt <= '0; else if( test_is_running ) cycle_cnt <= cycle_cnt + 1;
ä¿¡å·ã«æ»ããŸãã å¿ èŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
- test_is_runningã¯ãDMAãã©ã³ã¶ã¯ã·ã§ã³ãçŸåšé²è¡äžãã©ããã瀺ãä¿¡å·ã§ãã
- run_test_stb-ã¹ãããŒãä¿¡å·ãCPUãDMAã³ã³ãããŒã©ãŒãèµ·åããæç¹ã§1ã¯ããã¯ã®éã¢ã¯ãã£ã
- test_finished-å¿ èŠãªéã®ããŒã¿ãæžã蟌ãŸããããšã瀺ãä¿¡å·ã ãŸããå²ã蟌ã¿ãéå§ããŸãã
ãããã®ä¿¡å·ã®åœ¢æã¯ç°¡åã§ãã
DMAã³ã³ãããŒã©ãŒãæ§æããã«ã¯äœãå¿ èŠã§ããïŒãããã¯å¶åŸ¡ã¬ãžã¹ã¿ãŒã«ãªããŸãïŒã
- ããŒã¿ãã³ããŒãããããã¡ã¢ãã¬ã¹
- ã¬ã³ãŒãããŒã¿ãµã€ãº
- ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããã·ã°ãã«ãããããããã³ããéžæããŸã
ã¹ããŒã¿ã¹ã¬ãžã¹ã¿ã¯æ¬¡ã®ãšããã§ãã
- DMAã³ã³ãããŒã©ããžãŒä¿¡å·
- ã«ãŠã³ã¿ãŒå€cycle_cnt
ãããã£ãŠãã¬ãžã¹ã¿ã®å®£èšã¯æ¬¡ã®ããã«ãªããŸãã
ç»é²å®£èš
// Control registers `define DMA_CTRL_CR 0 `define DMA_CTRL_CR_RUN_STB 0 `define DMA_ADDR_CR0 1 `define DMA_ADDR_CR1 2 `define DMA_SIZE_CR0 3 `define DMA_SIZE_CR1 4 // Status registers `define DMA_STAT_SR 0 `define DMA_STAT_SR_BUSY 0 `define DMA_CYCLE_CNT_SR0 1 `define DMA_CYCLE_CNT_SR1 2
ãããŠãã¬ãžã¹ã¿ã®ç®çã¯æ¬¡ã®ãšããã§ãã
ã¬ãžã¹ã¿å²ãåœãŠ
// Control from CPU -- bit for start, DMA buffer address and transaction size. assign run_test = cregs_w[`DMA_CTRL_CR][`DMA_CTRL_CR_RUN_STB]; assign dma_addr = { cregs_w[`DMA_ADDR_CR1], cregs_w[`DMA_ADDR_CR0] }; assign dma_data_size = { cregs_w[`DMA_SIZE_CR1], cregs_w[`DMA_SIZE_CR0] }; // Status for CPU -- current state and overall cycles count. assign sregs_w[`DMA_STAT_SR][`DMA_STAT_SR_BUSY] = test_is_running; assign { sregs_w[`DMA_CYCLE_CNT_SR1], sregs_w[`DMA_CYCLE_CNT_SR0] } = cycle_cnt;
ãã¹ãŠããããžã§ã¯ããã³ã³ãã€ã«ã§ããŸãã æåã«ã AnalysisïŒSynthesisãå®è¡ããŸãããã
ãã®åŸã SignalTapãã¡ã€ã«ãäœæããŸããããã䜿çšããŠã FPGAå ã®ä¿¡å·å€ãç£èŠã§ããŸãã
ãããè¡ãã«ã¯ã [ãã¡ã€ã«]-> [æ°èŠ]-> [SignalTap II Logic Analyzer File ]ã«ç§»åãã[OK]ãã¯ãªãã¯ããŸãã
衚瀺ããããŠã£ã³ããŠã§ãå¿ èŠãªä¿¡å·ãè¿œå ããŸãã 次ã®ãããªãã®ãåŸãããã¯ãã§ãã
SignalTapãã¡ã€ã«
ãã¡ã€ã«ãä¿åãããããžã§ã¯ãã«è¿œå ããŠãã¢ã»ã³ããªãå®äºããŸãã
ãã«ããå®äºãããã .rbfãã¡ã€ã«ãååŸããå¿ èŠããããŸãã
quartus_cpf -c etln.sof dma.rbf
ãã¹ãŠããã¡ãŒã ãŠã§ã¢ã®æºåãã§ããŸããã ãœãããŠã§ã¢éšåã«æž¡ããŸãã
泚æïŒ Qsysã®èšå®ãå€æŽããåŸïŒç¹ã«fpga2sdramãæå¹ã«ããåŸïŒã Preloaderãåçæããã³åæ§ç¯ããå¿ èŠãããããšã«æ³šæããŠãã ããã
FPGA githubã§ã¯ãVerilogã³ãŒããå«ããã¡ã€ã«ãšQsysèšå®ãå«ããã¡ã€ã«ã®ã¿ãã¢ããããŒããããããšã«æ³šæããŠãã ããã
ãããžã§ã¯ããã¡ã€ã«ïŒ.qpfã.qsfãªã©ïŒã¯ãæ¬åœã«æçšãªæ å ±ãéãã§ããªããšããäºå®ã®ããã«æ¬ èœããŠããŸãã
ãŠãŒã¶ãŒã¹ããŒã¹ããã°ã©ã ã®å®è£
ãœãããŠã§ã¢åŽããDMAã³ã³ãããŒã©ãŒãæäœããããã«å¿ èŠãªãã®ã¯äœã§ããïŒ
ãŸããDMAã³ã³ãããŒã©ãŒãæ§æããŠå®è¡ã§ããå¿ èŠããããŸãã ãã®ããã«ãåã®èšäºã®memããã°ã©ã ã䜿çšããŸãã
次ã«ãã¡ã¢ãªé åãååŸããå¿ èŠãããããã®ã¢ãã¬ã¹ãDMAã³ã³ãããŒã©ãŒã«æž¡ãããšãã§ããŸãã
ããã§å°ãäœè«ãå¿ èŠã§ãã éåžžããŠãŒã¶ãŒç©ºéå ã®ãã¹ãŠã®ããã»ã¹ãããã³ã«ãŒãã«å ã®ã»ãšãã©ã®ããã»ã¹ã§ãããããããä»®æ³ã¢ãã¬ã¹ã§åäœããŸãã ããããDMAã³ã³ãããŒã©ãŒã¯ç©çã¢ãã¬ã¹ã転éããå¿ èŠããããŸãïŒããæ£ç¢ºã«ã¯ã ãã¹ã¢ãã¬ã¹ã§ããã䜿çšããŠãããã©ââãããã©ãŒã ã§ã¯ç©çã¢ãã¬ã¹ãšåãã§ãïŒã
ãã®ãããªã¿ã¹ã¯ãå®è¡ããã«ãŒãã«ã«ã¯ãä»®æ³ã¢ãã¬ã¹ã§ç©çã¢ãã¬ã¹ïŒãŸãã¯ãã®éïŒãååŸããããã¡ã¢ãªé åãå²ãåœãŠããããããæã2ã€ã®ã¢ãã¬ã¹ãäžåºŠã«ååŸãããã§ããç¹å¥ãªæ©èœã®ã»ããããããŸãã
ãŠãŒã¶ãŒã¹ããŒã¹ã§äœãããïŒ çŽ æŽãããããã»ã¹/ proc / [PID] / pagemapã«ã¯ ããã¹ãŠã®ä»®æ³ããŒãžããããããããã»ã¹ã®ç©çããŒãžãžã®ãããã³ã°ã«é¢ããæ å ±ãå«ãŸããŠããŸãã
ãã®ãã¡ã€ã«ã®åããŒãžã®æ å ±ã¯8ãã€ãã§ãã åæã«ãäžäœ55ãããã«ã¯ãããããç©çããŒãžçªå·-ããŒãžãã¬ãŒã çªå·ïŒ PFN ïŒãå«ãŸããäžäœ9ãããã«ã¯ããŸããŸãªãã©ã°ïŒããŒãžã®ååšãã¹ã¯ãããªã©ïŒãå«ãŸããŸãã詳现ãªèª¬æã¯ã ãããŸãã¯man procã«ãããŸãã
ãããã£ãŠãä»®æ³ã¢ãã¬ã¹ãšããŒãžãµã€ãºããããã°ãä»®æ³ããŒãžã®æ°ãç°¡åã«èšç®ã§ããŸãã ãã®åŸããã¡ã€ã«/ proc / [PID] /ããŒãžããããããå¿ èŠãªãªãã»ããã§8ãã€ããèªã¿åãã ãã§ãäžäœ55ãããã«ç©çããŒãžã®çªå·ããããŸãã ãããŠããããç©çã¢ãã¬ã¹ã«å€æããããšã¯ãã§ã«ç°¡åã§ããããããDMAã³ã³ãããŒã©ãŒã«æžã蟌ã¿ãŸãã
ã¡ã¢ãªé åãããŒãžã®å¢çããå§ãŸãå Žåããã¹ãŠãå°ãç°¡åã«ãªããŸãã
ãããã£ãŠã mallocïŒïŒé¢æ°ã®ä»£ããã«ãåžæã®ãªãã»ãããèšå®ã§ããposix_memalignïŒïŒé¢æ°ã䜿çšããããšããå§ãããŸãã
ãŸããRAMããã¹ã¯ããããããŒã¿ã®ã¢ã³ããŒããé²ãããã«ãmlockïŒïŒé¢æ°ã䜿çšããããšããå§ãããŸãã
äžèšã®ããšã¯phys_addr.cããã°ã©ã ã«ãã£ãŠå®è¡ãããŸã
éèŠãªæ³šæ -ä»®æ³ã¢ãã¬ã¹ç©ºéã§é£ç¶ããããŒãžã¯ãå¿ ãããRAMã§é£ç¶ããããã§ã¯ãããŸããã
ãããã£ãŠããã®æ¹æ³ã§ã¯ãDMAã³ã³ãããŒã©ãŒã«ããããŒãžãµã€ãºãã倧ããããŒã¿ãæžã蟌ãããšã¯ã§ããŸããã
ãã©ã€ããŒãäœæãããšãã«ããã®å¶éãåé¿ã§ããŸãã
äžéãã§ãã¯
ããã§ããã¡ãŒã ãŠã§ã¢ãšãã¹ãããã°ã©ã ã®æºåãã§ããŸãããå°ããã¹ãããŠã¿ãŸãããã
ãã€ããªãSDã«ãŒãã«ã³ããŒãã USB-Blasterãæ¥ç¶ããŠããŒããå®è¡ããŸãã
Linuxãèµ·åããåã«fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ãæå¹ã«ããå¿ èŠãããããšãäžã«æžããŸãã ã ããã¯äºå®ã§ãããåžžã«ãããšã¯éããŸããã
Linuxã§ãã§ã«ã€ã³ã¿ãŒãã§ã€ã¹ãæå¹ã«ããŠãFPGAããã¡ã¢ãªå ã®ããŒã¿ãèªã¿åãããšãããšãã·ã¹ãã ã¯å®å šã«ããªãŒãºããŸãã
ãã ããããŒã¿ã®æžã蟌ã¿ã¯æåããŸãã åœç¶ããã®ãªãã·ã§ã³ã¯æããã«æŠéã·ã¹ãã ã§äœ¿çšãã䟡å€ã¯ãããŸããã以äžã«ã fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ãé©åã«åæåããæ¹æ³ã説æããŸãã ããããäžéãã¹ãã®å Žåãããã¯éåžžã«é©ããŠããŸãã
ãŸããFPGAããã©ãã·ã¥ããŸãã
cat dma.rbf > /dev/fpga0
次ã«ã HPS-FPGAã€ã³ã¿ãŒãã§ã€ã¹ãæå¹ã«ããŸãã
echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
SignalTapãå®è¡ãããšã sdram0_waitrequestä¿¡å·ãåžžã«1ã§ãã³ã°ããŠããããšãããããŸããããã¯ã fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ããªãã«ãªã£ãŠããããã§ãã
ãªã³ã«ããŸãïŒ
./mem.o 0xFFC25080 0x3fff
ã¬ãžã¹ã¿ããã0xFFC25080ã«ãŠããããæžã蟌ããšã fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ã®å¯Ÿå¿ããããŒããå«ãŸããŸãã ã©ã®ããããã©ã®ããŒãã«è²¬ä»»ããããã«é¢ãã説æã¯äžèšã®Handbookã§äžããããŸãã ç°¡åã«ããããã«ããã¹ãŠã®ããŒããæå¹ã«ããå¿ èŠããããŸãïŒåèšã§ãã¬ãžã¹ã¿ã§14ãããã䜿çšãããŸãïŒã
SignalTapã§ãä¿¡å·sdram0_waitrequestã 0ã«çãããªããŸããã
phys_addrãŠãŒãã£ãªãã£ãå®è¡ããŸãã
./phys_addr
ãããã¡ãå²ãåœãŠãŠããã®ç©çã¢ãã¬ã¹ã衚瀺ããŸãã 0x2d593000ã§ãã
fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããšãã¯ãèšèã§å¯ŸåŠããå¿ èŠãããããšãèŠããŠããŸãã
128ãããã®ã¯ãŒãããããããã¯ãŒãã¢ãã¬ã¹ã¯æ¬¡ã®ããã«èšç®ãããŸãã
0x2d593000 / 16 = 0x2d59300
ãã®ã¢ãã¬ã¹ãFPGAã¬ãžã¹ã¿ã«æžã蟌ã¿ãŸãã
./mem.o 0xC0000002 0x2d59300
ã¢ãã¬ã¹ã«ã¯ã1ããã³2ã®çªå·ãä»ããããå¶åŸ¡ã¬ãžã¹ã¿ã䜿çšããŸããåã¢ãã¬ã¹ã¯16ããããŸãã¯2ãã€ãã§ãã HPS-to-FPGAã¯0xC0000000ããå§ãŸããããæåã®å¶åŸ¡ã¬ãžã¹ã¿ã®ãã€ãã¢ãã¬ã¹ã¯0xC0000002ã«ãªããŸã
mem.cãæ£ç¢ºã«ãã€ãã¢ãã¬ã¹ã䜿çšããããšãæãåºãããŠãã ããã
ãã®åŸãDMAãã©ã³ã¶ã¯ã·ã§ã³ã®é·ããå¶åŸ¡ã¬ãžã¹ã¿çªå·3ã«æžã蟌ã¿ãŸããé·ãã¯ããŒãžãµã€ãºãè¶ ããŠã¯ãªãããç§ãã¡ã«ãšã£ãŠã¯4096ãã€ãã§ãã fpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ã®å¹ ã¯128ãããã§ããããã©ã³ã¶ã¯ã·ã§ã³ãµã€ãºãã¯ãŒãã§ç€ºãããã3çªç®ã®ã¬ãžã¹ã¿ã«256ã®æ°å€ãæžã蟌ãå¿ èŠããããŸãã
./mem.o 0xC0000006 256
次ã«ã SignalTapãæ§æããŠãä¿¡å·ã®ãã¬ãã£ããšããžã§test_is_runningããã£ããã£ããDMAã³ã³ãããŒã©ãŒãå®è¡ããŸãã
ãããè¡ãã«ã¯ããŒãã¬ãžã¹ã¿ã®ãŒããããã«æžã蟌ã¿ãæåã«0ïŒååšããªãå ŽåïŒã次ã«1ãæžã蟌ã¿ãŸããåæã«ã mem.oãŠãŒãã£ãªãã£ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã4ãã€ãå®è¡ãããããã¯2ã€ã®ã¬ãžã¹ã¿ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠã泚æããªããšãé£æ¥ããã¬ãžã¹ã¿ã®ããŒã¿ãäžæžããããŸãã
åèšã§ãæåã«0xC0000000ã®ããŒã¿ãèªã¿åãã次ã«ãããæžãçããå¿ èŠããããŸããã ãŒãããããèšå®ãããŠããŸãã
ç§ãã¡ã¯èªã¿ãŸãïŒ
./mem.o 0xC0000000
0x93000000ãèªã¿åããŸãã
ç§ãã¡ã¯æžããŸãïŒ
./mem.o 0xC0000000 0x93000001
ãã®åŸã SignalTapã§æ¬¡ã®ãããªãã®ãååŸããå¿ èŠããããŸãã
SignalTapã®çµæ
ã芧ã®ãšããããã©ã³ã¶ã¯ã·ã§ã³ãçµäºããæç¹ã§ã®cycle_cntã«ãŠã³ã¿ãŒã®å€ã¯3167ã§ãã
垯åå¹ ãèšç®ããŸãããã ç§ã®ãããžã§ã¯ãã®ã¯ããã¯ä¿¡å·ã®åšæ³¢æ°ã¯150 MHzã§ãïŒããåºãç¯å²ã§åšæ³¢æ°ãå€æŽã§ããããã«ããããã«ãHPSã·ã¥ã¬ããã䜿çšããã«ããã«ã€ã³ããŒãããPLLããååŸããŸããããããã®å€æŽã¯ç°¡åã§ãããgithubã«ã¯ãããŸããïŒã
å¹ -128ãããã 3167ãµã€ã¯ã«ä»¥äžã§256ã¯ãŒããéä¿¡ãããŸããã åèšïŒ
128 * 150 / (3167/256) = 1551 /c
æŽæ°ïŒãã®ãããªå°ããªåž¯åå¹ ã¯ãã¿ã€ããã¹ãçµè«ã®è©³çŽ°ã®ããã«åŸãããŸãã
ããŒã¿ãæ£ããèšé²ãããããšã確èªããããã«æ®ã£ãŠããŸãã EnterããŒãæŒããŠãäžæåæ¢ããphys_addrãŠãŒãã£ãªãã£ããåé€ãããŸãã
次ã®ããã¹ãã衚瀺ãããŸãã
Phys_addrã®å®è¡çµæ
0: 0x0 1: 0xffffffffffffffff 2: 0x1 3: 0xfffffffffffffffe ... 507: 0xffffffffffffff02 508: 0xfe 509: 0xffffffffffffff01 510: 0xff 511: 0xffffffffffffff00
ããªããèŠããªãããã¹ãŠãããŸããããŸããã
ããŸããŸãªãã©ã¡ãŒã¿ãŒãè©Šãããšãããã¯ããã¯åšæ³¢æ°ã垯åå¹ ã«ã»ãšãã©åœ±é¿ãäžããªãããšãããããŸããã
25 MHzãš150 MHzã®äž¡æ¹ã§ã»ãŒåããŸãŸã§ãã
ããããfpga2sdramã€ã³ã¿ãŒãã§ã€ã¹ã®å¹ ã¯ãå察ã«ãã»ãŒç·åœ¢ã®äŸåæ§ãäžããŸã-64ããããš128ãããã§ãã¹ããããŸããã256ã®ããã«ãã§ãã¯ããŸããã§ããã
åœç¶ãèšé²ãããããŒã¿ã®éãå°ãªãïŒ4096ãã€ãã®ã¿ïŒãšããäºå®ã«ããã枬å®èª€å·®ã¯éåžžã«å€§ãããªããŸãã
ç¬èªã®ããªããã£ããã©ã€ããŒãèšè¿°ããããšã§ãDMAãã©ã³ã¶ã¯ã·ã§ã³ã®ãµã€ãºãå¢ããããšãã§ããŸãã
ãã©ã€ããŒã®ã¹ãã«
ãã®èšäºã¯ç§ãäºæ³ããŠãããããå°ãå€ãåºãŠããã®ã§ããã®ãã©ã€ããŒã«ã€ããŠéåžžã«ç°¡åã«è©±ããŸãã
ããã«ã次ã®èšäºã§åœŒãšååããå¿ èŠããããŸãã
ããããã³ãŒãã¯èå³ã®ããgithubã«ãããŸã-詳现ãèŠãããšãã§ããŸãã
åºæ¬çãªèãæ¹ã¯åçŽã§ã-ãã©ã€ããŒãèµ·åãããšãã«ãå¿ èŠãªãã©ã³ã¶ã¯ã·ã§ã³ã®ãµã€ãºããã©ã¡ãŒã¿ãŒã§èšå®ããŸãã
ãã©ã€ãã¯ã¡ã¢ãªãå²ãåœãŠããã¹ã¢ãã¬ã¹ãšãã©ã³ã¶ã¯ã·ã§ã³ãµã€ãºãFPGAã«æžã蟌ã¿ãŸãã
ãã©ã€ãã¯ãFPGAãã¡ãŒã ãŠã§ã¢ã§èšå®ããå²ã蟌ã¿ãã³ãã©ãç»é²ããŸãã
ãã®åŸããã©ã€ããŒã¯2ã€ã®charããã€ã¹ãäœæããŸãã
- / dev / etn-ctrl -DMAãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããŸã
- / dev / etn-data-ããŒã¿ãååŸããŸã
ãã¡ã€ã«/ dev / etn-ctrlããèªã¿åããšãDMAãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããŸãã
ãã®åŸãFPGAããå²ã蟌ã¿ãå°çãããŸã§åŒã³åºãã¯ãããã¯ãããŸãã
å²ã蟌ã¿ãå°çãããšãã³ãŒã«ã¯çµäºããŸããããã¯ãããŒã¿ãæžã蟌ãŸãããã¡ã€ã«/ dev / etn-dataããèªã¿åãããšãã§ããããšãæå³ããŸãã
ãã©ã€ããŒã.dtsãã¡ã€ã«ã§æ©èœããã«ã¯ã次ã®è¡ãè¿œå ããŸãã
.dtsã®å€æŽ
fpga { compatible = "mtk,etn"; interrupts = <0x0 0x28 0x1>; };
æåã®è¡ã¯äºææ§ã®ãããã©ã€ããŒãæå®ãã2è¡ç®ã¯FPGAããã®å²ã蟌ã¿ã®æ°ãšã¿ã€ããæå®ããŸãã
4MBãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããå Žåãã¹ã«ãŒãããã¯çŽ
çµè«
FPGAã§ããªããã£ãDMAã³ã³ãããŒã©ãŒãäœæãããã®ã¹ã«ãŒãããã枬å®ããŸããã
æŽæ°ïŒ
å°éã®åž¯åå¹ ã¯ãDDR3èšå®ã®ã¿ã€ããã¹ã«ãããã®ã§ãã
ã€ãŸããPLLã·ã¥ã¬ãããå®éã®25 MHzã§ã¯ãªã125 MHzã«èšå®ããããšããäºå®ã§ãã
ãã®ãããPLLã®ä¹æ°ãšé€æ°ã®æ¯çã¯æ£ããèšç®ãããŸããã§ããã
ãã®çµæãDDR3ã¯èŠå®ã®333 MHzã§ã¯ãªã66 MHzã§åäœããŸããã
æ£ããä¿æ°ãš256ãããã®ã€ã³ã¿ãŒãã§ã€ã¹å¹ ã䜿çšãããšãã¹ã«ãŒãããã¯çŽ16ã17 Gb / sã«ãªããŸããããã¯ãå¹ ã32ãããã§åšæ³¢æ°ã333 MHzã®DDR3ã€ã³ã¿ãŒãã§ã€ã¹ã®çè«äžã®ã¹ã«ãŒãããã«çžåœããŸãã
次ã®èšäºã§è©³ãã説æããŸãã
ãã¡ããã誰ããèå³ãæã£ãŠããå Žåãèšäºã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
- FPGA ã§ã®ILI9341ã®ãã¬ãŒã ãããã¡å®è£
- äœæ¥SGDMAã³ã³ãããŒã©
- SGDMAã³ã³ãããŒã©ã䜿çšããFPGAã§ã®ã®ã¬ããã2ããŒãNICã®å®è£
æåŸã«éãã人ã«æè¬ããŸãïŒ ããã°ã£ãŠã