<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于FPGA和LAN91C111的嵌入式以太網(wǎng)接口設(shè)計(jì)

          基于FPGA和LAN91C111的嵌入式以太網(wǎng)接口設(shè)計(jì)

          作者: 時(shí)間:2011-03-29 來源:網(wǎng)絡(luò) 收藏

          1.3 硬件連接
          芯片EP2C35中嵌入了32位的NIOS II處理器。由于是專為系統(tǒng)的,因而其外圍電路相對比較簡單。圖2所示是其硬件連接圖,圖中的地址線、數(shù)據(jù)線、控制線分別與相連。由于采用的是16位數(shù)據(jù)傳輸方式,因此只用到數(shù)據(jù)總線的低16位??刂凭€中的AEN為片選信號,INTR0為外部中斷信號,WR為讀寫信號,BE0-BE1為字節(jié)選擇端。中的ADS、LCLK、CYCLE、W/R、RDYR-TN信號應(yīng)均加一個(gè)1kΩ的上拉電阻。TG10o-S050N2是的變壓濾波器。TX+、TX-、RX+、RX-分別與的TPO+、TPO-、TPI+、YPI-相連。TG100-S050N2的CMT端也應(yīng)接一個(gè)1kΩ的上拉電阻。RJ45的TD+、TD-、RD+、RD-分別與TG100-S050N2的TD4+、TD-、RD+、RD-相連。在TG100-S050N2的TCT和RCT亦應(yīng)分別接一個(gè)75Ω的電阻和1nF的濾波電容。這樣即可在控制線的作用下完成與LAN91C111之間的數(shù)據(jù)通信。

          本文引用地址:http://www.ex-cimer.com/article/150920.htm

          b.JPG



          2 軟件
          ALTERA公司提供的硬件抽象層(HAL)中封裝了系統(tǒng)中硬件的相關(guān)細(xì)節(jié)和驅(qū)動程序,用戶可在HAL的基礎(chǔ)上方便地開發(fā)存儲等應(yīng)用程序。
          NIOSⅡIDE環(huán)境中集成有μCOS II和LWIP,其中LWIP必須在μCOS的支持下使用。μC/OSⅡ是一種免費(fèi)公開源代碼,結(jié)構(gòu)小巧,而且具有可剝奪
          實(shí)時(shí)內(nèi)核的操作系統(tǒng),它可移植、可裁剪,最多可管理64個(gè)任務(wù),其每個(gè)任務(wù)都擁有自己獨(dú)立的堆棧,大部分源碼可使用ANSI C語言編寫,整個(gè)軟件部分可在NIOS II IDE開發(fā)環(huán)境下完成。由于程序的內(nèi)容較多,本文著重介紹LAN91C111的初始化、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)三個(gè)部分的軟件設(shè)計(jì)方法。
          2.1 初始化
          ALTERA提供有LWIP的NIOS II端口,其源代碼包含在NIOS II開發(fā)工具包中。LWIP可為NIOS II處理器提供對連接棧的快速、開源
          地訪問。ALTERA的LWIP端口包括套接字API封裝,提供有標(biāo)準(zhǔn)的、文檔說明齊全的套接字API。LWIP協(xié)議棧的主要是標(biāo)準(zhǔn)的套接字
          除了套接字以外,還可調(diào)用lwip_stack_init()函數(shù)和lwip_devices_init()函數(shù)來對堆棧和驅(qū)動程序初始化。通過HAL系統(tǒng)代碼可調(diào)用
          init_done_func()、get_mac_addr()和get_ip_addr()函數(shù)來設(shè)置MAC地址和IP地址。為了初始化堆棧,在調(diào)用OSStart啟動μC/OS II調(diào)度程序之前應(yīng)調(diào)用函數(shù)lwip_stack_init(),其原型為voidlwip_stack_init( int thread_prio, void(*init_done_func)(void*),void*arg)。堆棧初始化后,還必須調(diào)用函數(shù)init_done_func(),而該函數(shù)必須調(diào)用函數(shù)lwip_devices_init()。利用函數(shù)lwip_devices_init()可以對在system.h中定義的所有已安裝的設(shè)備驅(qū)動程序進(jìn)行注冊,若返回一個(gè)非0值則表示注冊成功。注冊成功后,TCP/IP棧即可使用,之后便可在程序中創(chuàng)建任務(wù)。該函數(shù)的參數(shù)是接收線程的優(yōu)先級。LWIP系統(tǒng)碼在設(shè)備初始化過程中,可通過lwip_devices_init()函數(shù)調(diào)用函數(shù)get_mac_addr()和get_ip_addr()。用戶通過編寫這些函數(shù),可在系統(tǒng)中將MAC和IP地址存放在任意位置,從而代替在設(shè)備驅(qū)動程序中固定位置的硬編碼,并增加系統(tǒng)的靈活性。設(shè)計(jì)時(shí),可以將MAC地址存放在Flash存儲器中,也可以將MAC地址存放在片上內(nèi)嵌的存儲器中。當(dāng)所有的初始化都準(zhǔn)備好后即可調(diào)用OSStart()以啟動RTOS進(jìn)行任務(wù)調(diào)度。這個(gè)過程需要設(shè)置以太網(wǎng)目的地址、以太網(wǎng)源地址、協(xié)議類型,然后再按照所設(shè)置的協(xié)議類型來設(shè)置數(shù)據(jù)包。
          2.2 數(shù)據(jù)的發(fā)送和接收
          數(shù)據(jù)的接收和發(fā)送可采用中斷方式。中斷服務(wù)程序通過檢查LAN91C111的中斷狀態(tài)寄存器來判斷是發(fā)送中斷請求還是接收中斷請求。初始化完成后,即可創(chuàng)建任務(wù),建立套接字,綁定端口,綁定完之后,再監(jiān)聽端口。當(dāng)LAN91C111接收到數(shù)據(jù)包時(shí),可由EPH模塊察看此數(shù)據(jù)包的目的地址,若為本網(wǎng)卡的MAC地址或廣播地址或多播地址,則把此數(shù)據(jù)包傳送到LAN91C111的RAM中,并向處理器發(fā)送中斷,由處理器進(jìn)行數(shù)據(jù)處理。由于采用的是TCP/IP協(xié)議,接收數(shù)據(jù)應(yīng)調(diào)用read()函數(shù)來接收建立連接的套接字中的數(shù)據(jù),并將其放入緩沖區(qū)。發(fā)送過程則是由FPGA將數(shù)據(jù)傳送到LAN91C111,再由LAN91C111將接收到的數(shù)據(jù)封裝成數(shù)據(jù)包,并檢測網(wǎng)絡(luò),當(dāng)沒有數(shù)據(jù)傳輸時(shí),再將數(shù)據(jù)包傳輸?shù)骄W(wǎng)絡(luò)中,并向處理器發(fā)送中斷信號,以表示數(shù)據(jù)傳送完畢。發(fā)送數(shù)據(jù)時(shí)通過調(diào)用write()函數(shù)可將要發(fā)送的數(shù)據(jù)發(fā)送到指定連接的目的地址。

          3 結(jié)束語
          本文的整個(gè)設(shè)計(jì)使用了邏輯單元(LE)5314個(gè),占用EP2C35F484芯片內(nèi)部資源的16%,這充分體現(xiàn)了FPGA資源的豐富性。在傳統(tǒng)設(shè)計(jì)中,通常選用單片機(jī)和低速網(wǎng)卡的設(shè)計(jì)方案,這在實(shí)際應(yīng)用中,網(wǎng)絡(luò)速度相對較慢,而本設(shè)計(jì)中選用高速的以太網(wǎng)控制芯片LAN91C111和高速的FPGA,極大地提高了系統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)處理能力,并可滿足網(wǎng)絡(luò)數(shù)據(jù)采集的需求。另外,FPGA的NIOSⅡ方案,還可根據(jù)實(shí)際需要添加不同IP,這也體現(xiàn)了SOPC的靈活性與可裁減性。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();