ÕªÒª£ºÏÖÓеÄÒ£²â½ÓÊÕ»úΪPCI½Ó¿Ú£¬Ðè°²×°ÔÚ¹¤¿Ø»úÉÏʹÓã¬ÎªÊµÏÖÉ豸СÐÍ»¯¡¢±ãЯ»¯£¬Éè¼ÆʵÏÖÁËСÐÍÍøÂç½Ó¿ÚÒ£²â½âµ÷Ä£¿é£¬¿ÉÅäºÏ´øÓÐÍø¿ÚµÄ¼ÆËã»úʹÓᣲÉÓÃFPGA½øÐÐÒ£²âÊý¾ÝµÄ֡ͬ²½ÓëIRIG—BʱÂë½âµ÷£¬½«½ÓÊÕµ½µÄÒ£²âÊý¾ÝÌí¼ÓʱÂëºó·¢Ë͸øARM´¦ÀíÆ÷ÖеÄLinuxϵͳ£¬²¢±àдLinux 2.6ϵÄFPGAÇý¶¯³ÌÐò£¬ÊµÏÖFPGAÊý¾ÝµÄ¶ÁÈ¡£¬È»ºóͨ¹ýÍø¿¨ÒÔTCP/IP¸ñʽ·¢¸øÖ÷»ú£¬Ö÷»úʵÏÖÊý¾Ý´æ´¢ÓëÏÔʾ¡£
ÒÔÌ«Íø½Ó¿ÚͨÐÅËٶȿ죬´«Êä¿É¿¿£¬Ê¹ÓúÍÅäÖ÷½±ã£¬¶ÔÓÚ20 Mb/sÒÔϵÄÂëËÙÂÊ£¬100 Mb/sµÄÍø¿¨¿ÉÒÔ½øÐ⻶ª°üת·¢£¬²ÉÓÃTCP°ü¸ñʽ»¹¿ÉʹÉ豸СÐÍ»¯£¬±ãÓÚÊý¾ÝµÄת·¢£¬Òò´ËÓбØÒªÀ©Õ¹É豸µÄÒÔÌ«Íø¹¦ÄÜ¡£
1 ÕûÌåÄ£¿éÉè¼Æ
1.1 ϵͳÉè¼Æ
ϵͳÉè¼Æ¿òͼÈçͼ1Ëùʾ¡£ÆäÖУ¬²É±àÆ÷»ò½ÓÊÕ»ú½âµ÷Êä³öµÄPCMÐźż°Ê±ÖÓÊäÈëµ½FPGAÖнøÐÐ֡ͬ²½£¬IRIG—BÂëÐÅÏ¢Ò²Ë͵½FPGAÖнøÐнâµ÷£¬µÃµ½Ê±¼äÐÅÏ¢¡£Êý¾ÝÓëʱ¼äÒ»Æð´æÈëSRAMƹÅÒ»º³åÇøÖУ¬´ïµ½Ò»¶¨´óСºó£¬FPGAÏòARM´¦ÀíÆ÷·¢Æ÷Öжϣ¬ARMÖÐÔËÐеÄLinuxϵͳ£¬½«Êý¾ÝÈ¡×ߣ¬½øÐÐTCP/IP´ò°ü£¬·¢Ë͸ø½ÓÊÕ¼ÆËã»ú¡£
ÔÚÉ豸¿ªÊ¼¹¤×÷Ç°£¬ÐèÒªÔÚ¼ÆËã»ú¶Ë½øÐвÎÊýÉèÖ㬼ÆËã»úTCP/IP°ü½«²ÎÊý·¢Ë͸øARM´¦ÀíÆ÷£¬ÓÉARM´¦ÀíÆ÷ת·¢¸øFPGA¡£Ö¡Í¬²½Æ÷µÄÉè¼ÆÖУ¬ÂëËÙÂÊΪ100b/s¡«10Mb/s£¬Ö¡³¤Îª4¡«4096Word£¬Ö¡Í¬²½Âë×éΪ4¡«32£¬ARMÍø¿¨Îª100Mb/s¡£
1.2 Ó²¼þʵÏÖ
PCB²ÉÓÃ6²ã½á¹¹£¬ÏàÁÚ²¼Ï߲㣬ˮƽ´¹Ö±½»²æ£¬µç·²ãÓëµçÔ´²ãµ¥¶À·Ö¿ª£¬ÌṩÁ¼ºÃµÄµç´Å¼æÈÝÌØÐÔ¡£
1.2.1 FPGA
FPGAÑ¡ÔñEP1C12£¬ÎªÊµÏÖƹÅÒ»º³å½á¹¹£¬²ÉÓÃSRAMΪIS61LV25616¡£ÊäÈëÐźÅʹÓÃSMAÏßÀÂÁ¬½Ó£¬ÔÚ´«Êä¹ý³ÌÖлáÒýÈëË¥¼õ£¬ÐźÅÊäÈëÊä³öÒ׳öÏÖ×迹²»Æ¥ÅäµÄÇé¿ö£¬Ñ¡ÓÃAD8556¹¹³ÉÉäËæÆ÷£¬¶ÔÊäÈëÐźŽøÐÐÆ¥Å䣬ͬʱҲÔö´óÄ£ÄâÔ´µÄÊä³öÄÜÁ¦¡£
1.2.2 ARM
Ôڴ˲ÉÓÃS3C2440£¬ÄÚºËΪARM920T£¬×î¸ßƵÂÊΪ400MHz£¬´øMMUÖ§³Ö²Ù×÷ϵͳ¡£ÄÚ´æ²ÉÓÃ2×32MBµÄSDRAM£¬´æ´¢²ÉÓÃ128MB NAND FLASH£¬Íø¿¨²ÉÓÃDM9000A¡£
1.2.3 ARMÓëFPGAµÄ½Ó¿ÚÁ¬½Ó
ÕâÀï²ÉÓÃ×ÜÏß½Ó¿Ú£¬½«FPGA×÷Ϊһ¸ö´æ´¢É豸¹ÒÔÚARMµÄ´æ´¢Æ÷×ÜÏßÉÏ£¬Èçͼ2Ëùʾ¡£
FPGAÔÚARMÖÐÆðʼµØַΪ0x18000000£¬ÒÔ4B¶ÔÆ룬ռÓÃ0x80¸öµØÖ·£¬µØÖ··¶Î§Îª0x18000000¡«Ox1800007C£¬ÖжÏΪEINT0¡£
ÔÚFPGAÄÚ²¿²ÉÓöÁ/дָÕëÀ´Ä£ÄâFIFO£¬ÓÃÒ»¸öµØÖ·À´¶ÁÈ¡FPGAÊý¾Ý£¬ÆäÓàµØÖ·ÓÃÓÚÅäÖÃ֡ͬ²½Æ÷ÓëÄ£ÄâÔ´µÄ²ÎÊý¡£
2 ֡ͬ²½ÓëBÂë½âµ÷
FPGAÍê³ÉPCMÊý¾ÝµÄ֡ͬ²½ºÍ½âµ÷BÂ룬дÈ뵽ƹÅÒSRAM»º³åÇøÖУ¬ÊµÏÖÈçͼ3Ëùʾ¡£
2.1 ֡ͬ²½Ä£¿é
֡ͬ²½Æ÷¸ù¾Ý֡ͬ²½Âë×éµÄÏà¹ØÐÔºÍÖÜÆÚÐÔ£¬¾¹ýÏà¹ØÔËË㽫ͬ²½Âë´ÓPCM´®ÐÐÁ÷ÖÐʶ±ð³öÀ´£¬ÔÀí¿òͼÈçͼ4Ëùʾ¡£
PCMÊý¾Ý°´Ê±ÖÓ½øÐд®/²¢×ª»»£¬Óë±¾µØ֡ͬ²½Âë½øÐÐͬ»òÔËËãºóÔÙÓëÉÏÆÁ±Î룬ÓÉÈ«¼ÓÍøÂ罫Ïà¹ØÔËËã½á¹û°´Î»Ïà¼Óͳ¼Æ½á¹ûÖÐ1µÄ¸öÊý£¬´óÓÚÃÅÏÞÖµÔò±íʾ¿ÉÄܽÓÊÕµ½ÁË֡ͬ²½Âë¡£
Ϊ±ÜÃâÐ龯ºÍ©¼ì£¬Ê¹Ö¡Í¬²½Æ÷Îȶ¨¿É¿¿¹¤×÷£¬²ÉÓÃËÑË÷¡¢Ð£ºË¡¢Ëø¶¨Èý̬Âß¼¡£
ϵͳ¿ªÊ¼Ê±´¦ÓÚËÑË÷̬£¬·ûºÏÏà¹ØÆ÷Êä³ö£¬ÓÉËÑË÷̬תÈëУºË̬¡£ÔÚÔ¤ÆÚ¼ì²â´°¿ÚÄÚûÓÐÖ¡Â룬´ÓУºË·µ»Øµ½ËÑË÷̬¡£Á¬Ðøͨ¹ýУºËÊýᣬ½øÈëËø¶¨Ì¬¡£Îª±ÜÃâ֡ͬ²½ÂëµÄ©¼ì£¬Á¬Ðø©¼ì³¬¹ý±£»¤Ö¡Êýβ£¬Ö¡Í¬²½²Å·µ»ØËÑË÷̬£¬·ñÔò±£³ÖÔÚËø¶¨Ì¬£¬Ö¡Âö³åÓɱ¾µØ²úÉú¡£
2.2 IRIG—BÂë½âµ÷
IRIGʱ¼äÐòÁÐÂëÊÇÒ»ÖÖ´®ÐÐÂ룬¹²ÓÐ3ÖÖÂëÔª£¬Èçͼ5Ëùʾ¡£
PÂëÔªÊÇλÖÃÂëÔª£¬Á¬Ðø2¸öPÂëΪһ֡µÄ¿ªÊ¼£¬µÚ1¸öPÂëÔª¶¨ÒåΪP0£¬µÚ2¸öPÂëԪΪÃëÂö³åpps£¬ÉÏÉýÑØΪ¸ÃÃëµÄ׼ʱ¿Ì£¬Ê±¼äÐÅÏ¢ÒÔBCDÂëÒÀ´Î·Ö²¼ÔÚÆäºóµÄÂëÔªÖС£½âµ÷ʱÏȽøÐÐppsµÄÌáÈ¡£¬ÔÙ½øÐÐÃë¡¢·Ö¡¢Ê±¡¢ÌìµÄÐÅÏ¢ÌáÈ¡£¬ÆäÁ÷³ÌÈçͼ6Ëùʾ¡£
ʱÖÓƵÂÊΪ1MHz£¬ÓüÆÊýÆ÷¶ÔÊäÈëÐźŵÄÂö¿í½øÐмÆÊý¡£8ms£¬5ms£¬2msÂö¿í¼ÆÊýΪ8000£¬5000£¬2000¡£ÊäÈëBÂëµÄÂö¿í»á»ìÓиÉÈÅ£¬¾§ÕñʱÖÓÒ²´æÔÚÒ»¶¨µÄÎó²î£¬¼ÆÊýÆ÷µÄ¼ÆʱÅбðÓ¦¸¡¶¯Ò»¸ö·¶Î§£¬ÉèÖÃÃÅÏÞΪÂö¿íµÄ85%¡«115%£¬µ±Âú×ãÒ»¶¨·¶Î§µÄÊýֵʱ£¬·Ö±ðÊä³öPÂ룬0Â룬1ÂëÐźš£
FPGAÖеÄʱÂë²úÉú“Ì죺ʱ£º·Ö£ºÃ룺ºÁÃ룺΢Ãë”ÐÅÏ¢¡£½âµ÷³öBÂëʱ£¬FPGA¸üÐÂÄÚ²¿Ê±¼ä£¬BÂëÖв»º¬ºÁÃëÓë΢ÃëÐÅÏ¢£¬ÓÉFPGA¸ù¾ÝÃëÂö³åÐÅÏ¢µÄ׼ʱ¿ÌÀ´Éú³É¡£
3 FPGAÇý¶¯³ÌÐò¿ª·¢
ÔÚLinuxÖУ¬ËùÓеÄÓ²¼þÉ豸¶¼Ïñ³£¹æÎļþÒ»Ñù½øÐдò¿ª¡¢¹Ø±ÕºÍ¶Á/д¡£°ÑFPGAµ±×÷×Ö·ûÉ豸½øÐÐÉè¼Æ£¬Çý¶¯ÓÉÉ豸¼ÓÔØÓëжÔØ£¬ÒÔ¼°Îļþ²Ù×÷file_operation½á¹¹ÌåÖгÉÔ±º¯Êý×é³É¡£
3.1 ¼ÓÔØÓëжÔÔÉ豸Çý¶¯
FPGAÉ豸Çý¶¯³ÌÐò³õʼ»¯Á÷³ÌΪ¶¯Ì¬»ñµÃÖ÷É豸ºÅ¡¢×Ö·ûÉ豸ע²áºÍÉêÇëÖжϣ»Ð¶ÔØÁ÷³ÌΪעÏúÉ豸£¬ÊÍ·ÅÉ豸±àºÅ¡£
¶¨ÒåÒ»¸öÉ豸½á¹¹ÌåÀ´±íʾFPGA£¬ÈçÏ£º
µ±Óû§³ÌÐò¶ÁFPGAÉ豸ʱ£¬Êý¾Ý»¹Î´×¼±¸ºÃ£¬´ËʱÇý¶¯³ÌÐòÓ¦¸Ã×èÈû¸Ã½ø³Ì£¬½«ÆäÖÃÈë˯Ãß״ֱ̬µ½Ìõ¼þÂú×ã¡£´ËʱÐèÒª³õʼ»¯Ò»¸öµÈ´ý¶ÓÁÐÍ·£¬¶Ô¶Á½ø³ÌµÄÐÝÃߺͻ½ÐÑʱʹÓãº
ÔÚжÔغ¯ÊýÖУ¬É¾³ýÒ»¸öcdev£¬Íê³É×Ö·ûÉ豸µÄ×¢Ïú£¬È»ºóÊÍ·ÅÉ豸±àºÅ£º
3.2 Îļþ½Ó¿Ú²Ù×÷
LinuxΪËùÓеÄÉ豸Îļþ¶¼ÌṩÁËͳһµÄ²Ù×÷º¯Êý£¬FPGAÉ豸Çý¶¯¡£file_operations°üº¬´ò¿ªº¯fpga_open¡¢¶Áº¯Êýfpga_read¡¢ÉèÖòÎÊýº¯Êýfpga_ioctlºÍ¹Ø±ÕÉ豸º¯Êýfpga_release¡£
3.2.1 ´ò¿ªÓë¹Ø±ÕFPGAÉ豸
ÔÚ´ò¿ªÉ豸Óë¹Ø±ÕÉ豸ʱ»áµ÷ÓÃopenº¯ÊýÓëreleaseº¯Êý£¬ÔÚopenº¯ÊýÖУ¬Òª¶ÔÉ豸½øÐÐI/OÄÚ´æ×ÊÔ´Ó³Éä¼°ÖжÏÉêÇë¡£
É豸Çý¶¯³ÌÐòÖУ¬Ðèͨ¹ýÄÚ´æ¹ÜÀíµ¥ÔªMMU½«É豸µÄÐéÄâµØÖ·Ó³Éäµ½ÎïÀíµØÖ·¡£¸ù¾ÝFPGAÔÚS3C2440ÖеÄÎïÀíµØÖ·£¬¶¨ÒåÈçϺ꣺
ʹÓÃioremap()¶ÔFPGAµÄI/OÄÚ´æ×ÊÔ´½øÐÐÓ³É䣬°ÑÎïÀíÄÚ´æµØÖ·Ó³ÉäΪһ¸öÄÚºËÖ¸Õ룺
Êý¾Ý½»»»²ÉÓÃÖжϣ¬ÐèÏÈÉèÖÃÓ²¼þÖжϷ½Ê½£¬È»ºóÏòϵͳע²áÖжϺ¯Êý£¬ÊµÏÖÈçÏ£º
FPGAÁ¬½ÓÔÚARMµÄEINT0ÉÏ£¬isr_fpgaΪÖжϴ¦Àíº¯ÊýÖ¸Õë¡£µ±¹Ø±ÕFPGAÉ豸ʱ£¬ÐèÊÍ·ÅI/OÄڴ棬ÊÍ·ÅÖжϣº
3.2.2 Çý¶¯³ÌÐò¿ØÖƽӿÚIoctl
IoctlÓÃÀ´ÉèÖÃFPGAÖÐ֡ͬ²½Æ÷ºÍÄ£ÄâÔ´µÄ²ÎÊý£¬²¿·ÖÉèÖÃÃüÁîÈç±í1Ëùʾ¡£
ÔÚ´Ë£¬²ÉÓÃͳһµÄÃüÁîÂ뷽ʽ£¬°üº¬»ÃÊý¡¢ÐòÊý¡¢´«Êä·½Ïò¡¢Êý¾Ý³¤¶È£¬Ê¹Óúê_IO()£¬_IOR()£¬_IOW()ºÍIOWR()¸¨ÖúÉú³É£¬ÈçÃüÁî0ÉèÖÃÈçÏ£º
ÔÚIoctlÖУ¬²ÉÓÃswiteh(cmd)À´ÊµÏÖ¶ÔFPGA²ÎÊýµÄÉèÖü°FPGA״̬µÄ¶ÁÈ¡¡£
3.2.3 ÖжϺ¯Êý¼°¶Áº¯Êý
µ±FPGA²úÉúÖжÏʱ£¬¸ù¾Ý»º³åÇøµÄ´óС£¬ÖжϺ¯ÊýÑ»·¶ÔFPGAÓ³ÉäºóµÄµØÖ·¶ÁÈ¡Êý¾Ý¡£ARMÓëFPGA½Ó¿ÚΪ16λ£¬Ê¹ÓÃinw¶ÁÈ¡£¬Êý¾Ý´æ·ÅÔÚÇý¶¯³ÌÐòµÄ»º³åÇøÖУº
Ó¦ÓóÌÐò¶ÁÈ¡Êý¾Ýʱ£¬µ÷ÓÃreadº¯Êý£¬²ÎÊýbufferΪÓû§¿Õ¼ä»º³åÇøµÄÖ¸Õ룬ÀûÓÃcopy_to_userº¯Êý½«Êý¾Ý´ÓÄں˿ռ俽±´µ½Óû§¿Õ¼ä£¬µ±É豸ÖÐÔÝʱûÓÐÊý¾Ýʱ£¬¶Á½ø³ÌÓ¦µ±±»ÐÝÃߣº
flagΪһ¸ö±ê־룬µ±flag±»ÖжϺ¯ÊýÉèÖÃΪ1ʱ±íʾÉ豸ÖÐÓÐÊý¾Ý£¬´Ëʱ¶Á½ø³Ì¿É±»»»ÐÑ¡£
3.2.4 Óû§³ÌÐò¼°²âÊÔ
É豸Çý¶¯ÊµÏÖºó£¬Ðè±àдÏàÓ¦µÄÓû§³ÌÐòÀ´½øÐвâÊÔÇý¶¯³ÌÐòºÍʵÏÖÊý¾ÝµÄÍøÂçת·¢¡£ÔÚÓû§³ÌÐòÖУ¬¶Á/дFPGAÉ豸ʹÓÃÓëÆÕͨÎļþÒ»ÑùµÄ²Ù×÷º¯Êý¡£ÒÆÖ²LinuxʱÅäÖúÃÍø¿¨µÄµØÖ·£¬È»ºóʹÓÃSocket±à³ÌʵÏÖÊý¾ÝµÄTCP/IPת·¢£¬ÓÃÒ£²âÈí¼þ½ÓÊÕµ½µÄÊý¾Ý²âÊÔÈçͼ7Ëùʾ¡£
ͨ¹ý²âÊÔ¿ÉÒÔ¿´µ½£¬Í¬²½ÂëFDB18450±»Õýȷʶ±ð£¬IRIG-B½âÂëΪµ±Ç°Ê±¼ä¡£
4 ½áÓï
ÔÚ´Ë£¬»ùÓÚFPGAÓëARM½øÐÐÒ£²âÊý¾ÝµÄ֡ͬ²½Ò£²âÊý¾ÝµÄÍøÂçת·¢£¬³ä·ÖµØÀûÓÃÁËFPGAÓëARM¸÷×ÔµÄÌص㣬Ëü¿ÉʹFPGA+ARMÔÚÊý¾Ý½ÓÊÕ´¦ÀíÖеõ½¹ã·ºÓ¦Óá£
×÷ÕߣºÍõ¶¬¶¬ ÀîÓî Õű£Ïé Öйú¿Õ¿Õµ¼µ¯Ñо¿Ôº À´Ô´£º¡¶ÏÖ´úµç×Ó¼¼Êõ¡·2011ÄêµÚ16ÆÚ