唐 星 張春雷 陳 龍 趙成龍 張 冀 瞿佳偉
(四川大學(xué) 制造科學(xué)與工程學(xué)院 成都610065)
在嵌入式系統(tǒng)中,F(xiàn)PGA上電時(shí),需要從外部加載配置文件,該過(guò)程被稱為程序加載。在多數(shù)應(yīng)用中,F(xiàn)PGA通過(guò)主動(dòng)讀取的方式從外部存儲(chǔ)器加載程序,該方式只能加載固定的配置,不便于升級(jí)更新,且需要額外的存儲(chǔ)器件才能實(shí)現(xiàn)[1]。本文設(shè)計(jì)了一種對(duì)FPGA芯片進(jìn)行程序加載的接口,通過(guò)Cortex-A8微處理器對(duì)FPGA進(jìn)行配置,不需要單獨(dú)的存儲(chǔ)器,使用微處理器通用 IO模擬接口時(shí)序?qū)崿F(xiàn),配置靈活,不占用專用接口資源,可以在線升級(jí)FPGA固件。
本設(shè)計(jì)選用的FPGA是Spartan-6 XC6SLX16,該芯片正常工作時(shí)配置數(shù)據(jù)保存在SRAM單元中,該單元也被稱為配置存儲(chǔ)器(Configuration RAM)。由于SRAM是易失性存儲(chǔ)器,掉電之后必須重新配置[2]。配置信息通過(guò)特定的配置方式加載到芯片里,SPARTAN6 FPGA支持多種配置方式,包括:JTAG配置模式、Master Serial主動(dòng)串行(Serial/SPI)配置模式(x1、x2 and x4)、Slave Serial被動(dòng)串行配置模式、Master SelectMAP主動(dòng)并行模式(x8 and x16)、Slave SelectMAP被動(dòng)并行模式(x8 and x16)[3]。
主動(dòng)和被動(dòng)的區(qū)別在于數(shù)據(jù)采樣的時(shí)鐘來(lái)源:由FPGA輸出時(shí)鐘到存儲(chǔ)器,屬于主動(dòng)模式,由外部器件給 FPGA提供時(shí)鐘,屬于被動(dòng)模式。XC6SLX16通過(guò)兩個(gè)模式配置寄存器M[1:0]來(lái)確定其使用的模式,該寄存器的值在芯片初始化后通過(guò)對(duì) M1、M0兩個(gè)管腳采樣進(jìn)行確定。本設(shè)計(jì)采用FPGA的串行從模式進(jìn)行配置,對(duì)應(yīng)的M1、M0引腳均為高電平。開(kāi)始配置時(shí),微處理器把Program_B引腳電平由高拉低并持續(xù)超過(guò) 500ns,強(qiáng)制XC6SLX16進(jìn)入配置模式,清除片內(nèi) SRAM,Program_B引腳電平變高以后,XC6SLX16將INT和 DONE引腳清零,當(dāng)SRAM清除完畢且 M1,M0引腳采樣完成后,XC6SLX16將INT引腳電平拉高,微控制器此時(shí)可以開(kāi)始通過(guò)CCLK和D0引腳發(fā)送配置數(shù)據(jù),XC6SLX16在每個(gè)CCLK上升沿時(shí)采樣1bit配置數(shù)據(jù)并寫入芯片,如果中途出現(xiàn)校驗(yàn)錯(cuò)誤,INT腳將變低報(bào)錯(cuò),當(dāng)配置成功完成后,XC6SLX16將DONE信號(hào)拉高,通知微控制器配置成功。Spartan 6 FPGA串行從模式配置過(guò)程的時(shí)序如圖1所示。
圖1 Spartan 6 FPGA串行從模式配置接口時(shí)序
本設(shè)計(jì)選用的微處理器是基于Cortex-A8內(nèi)核的處理器 AM3352,工作頻率為 600MHz,具有NEON/SIMD協(xié)處理器,支持Linux,WinCE操作系統(tǒng),具有豐富的外設(shè)接口[4]。FPGA配置接口使用5個(gè)GPIO實(shí)現(xiàn),F(xiàn)PGA與固件配置相關(guān)的5個(gè)引腳都接到AM3352的GPIO上,F(xiàn)PGA_INT信號(hào)用于標(biāo)識(shí) SRAM 清除完畢,可以開(kāi)始傳輸數(shù)據(jù),F(xiàn)PGA_PROGRAM 信號(hào)用于啟動(dòng)配置流程,F(xiàn)PGA_DONE信號(hào)用于標(biāo)識(shí)配置過(guò)程成功完成,AM3352通過(guò)這個(gè)引腳的信號(hào)判斷配置是否成功,F(xiàn)PGA_CCLK信號(hào)為AM3352輸出到FPGA的時(shí)鐘信號(hào),每個(gè)上升沿時(shí),F(xiàn)PGA從FPGA_D0引腳上采集1bit配置數(shù)據(jù)。接口硬件原理如圖2所示。
圖2 配置接口硬件原理圖
配置接口的軟件在運(yùn)行于AM3352上的Linux中實(shí)現(xiàn),接口軟件分為字符設(shè)備驅(qū)動(dòng)和應(yīng)用程序兩部分。字符設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)配置 IO的初始化和讀寫以及數(shù)據(jù)寫入的接口,應(yīng)用程序通過(guò)調(diào)用驅(qū)動(dòng)接口實(shí)現(xiàn)配置流程[5],軟件模塊構(gòu)架如圖3所示。
圖3 軟件模塊構(gòu)架
驅(qū)動(dòng)模塊的核心功能是對(duì)用來(lái)配置FPGA的5個(gè)GPIO管腳進(jìn)行控制,包括引腳的初始化,IO狀態(tài)的讀取和控制,時(shí)鐘和數(shù)據(jù)的發(fā)送。根據(jù)AM3352數(shù)據(jù)手冊(cè)提供的寄存器表,利用Linux 3.2內(nèi)核中提供的API函數(shù),完成此驅(qū)動(dòng)程序的編寫,其中模塊加載函數(shù) fpga_config_init()使用 ioremap()函數(shù)完成GPIO置位和清位寄存器的映射,以保證在內(nèi)核中能通過(guò)虛擬內(nèi)存地址正確地訪問(wèn)到硬件寄存器,接著初始化各個(gè)IO為正確的上下拉和輸入輸出模式,其中 INT、DONE信號(hào)為上拉輸入模式,PROGRAM_B、CCLK、D0為輸出模式。通過(guò)register_chrdev()注冊(cè)該接口的 file_operations結(jié)構(gòu)體并返回得到驅(qū)動(dòng)程序的主設(shè)備號(hào),通過(guò)class_create()和device_create()接口創(chuàng)建設(shè)備,設(shè)備名稱為 fpga_config,當(dāng)驅(qū)動(dòng)被加載后,Linux文件系統(tǒng)的/dev目錄下就會(huì)出現(xiàn)該設(shè)備。fpga_config_ioctl()接口用于完成對(duì)輸出引腳的操作,包括 PROGRAM_B腳、CCLK腳、D0腳。fpga_config_read()接口用于讀取INT、和DONE腳的電平,通過(guò)該接口判斷 FPGA當(dāng)前的狀態(tài)。fpga_config_write()用于AM3352向FPGA寫入配置數(shù)據(jù),其中將應(yīng)用程序傳入的數(shù)據(jù)按位賦予D0引腳,然后操作CCLK引腳生成時(shí)鐘信號(hào),F(xiàn)PGA在CCLK信號(hào)上升沿讀取1bit數(shù)據(jù),為了加快發(fā)送的速率,此處對(duì)CCLK和D0腳直接使用寄存器操作設(shè)置高低電平,gpio3SetData和 gpio3ClearData分別為GPIO3的置位寄存器和清位寄存器指針,當(dāng)向gpio3SetData指向的地址寫值時(shí),該值有效位(為1)對(duì)應(yīng)的引腳被置高,其余引腳保持不變,當(dāng)向gpio3ClearData指向的地址寫值時(shí),該值有效位(為1)對(duì)應(yīng)的引腳被置低,其余引腳保持不變[6]。寫入配置數(shù)據(jù)部分的驅(qū)動(dòng)示例代碼如下:
//直接操作寄存器以加快速度
應(yīng)用程序部分通過(guò)調(diào)用 open()函數(shù)打開(kāi)配置接口設(shè)備,通過(guò) ioctl()函數(shù)拉低 PROGRAM_B引腳1ms后再拉高來(lái)開(kāi)啟配置,1ms后調(diào)用read()讀取引腳狀態(tài),檢測(cè)INT腳是否為高電平,若為高,則開(kāi)始調(diào)用write()函數(shù),將從文件系統(tǒng)讀取的配置數(shù)據(jù)通過(guò)配置接口寫入FPGA,寫入完成后,通過(guò)read()函數(shù)讀取DONE信號(hào)狀態(tài),判斷配置是否成功。若INT不為高或者DONE信號(hào)不為高,則認(rèn)為FPGA配置失敗并打印錯(cuò)誤信息。
本實(shí)驗(yàn)平臺(tái)為一款嵌入式多軸運(yùn)動(dòng)控制器,該控制器基于ARM+FPGA架構(gòu),運(yùn)行Linux3.2系統(tǒng),具有四軸脈沖方向輸出,最大輸出脈沖頻率為2MHz。運(yùn)行Linux系統(tǒng)的AM3352負(fù)責(zé)實(shí)現(xiàn)運(yùn)動(dòng)控制,讀取加工文件,主從USB、網(wǎng)絡(luò)、串口等功能,F(xiàn)PGA負(fù)責(zé)發(fā)送脈沖控制電機(jī)驅(qū)動(dòng)器以及IO口操作,AM3352通過(guò)GPMC接口和FPGA進(jìn)行數(shù)據(jù)交換,使用本文設(shè)計(jì)的配置接口進(jìn)行FPGA的配置,其系統(tǒng)框圖如圖4所示。
圖4 實(shí)驗(yàn)平臺(tái)系統(tǒng)框圖
完成以上代碼編寫后,編寫 makefile,編譯內(nèi)核模塊為 fpga_config.ko和應(yīng)用程序 fpga_loader,編譯器為 arm-linux-gnueabihf-gcc,操作系統(tǒng)為Ubuntu 12.04.5 32位??刂破魃螸inux系統(tǒng)啟動(dòng)后,通過(guò) insmod命令加載 fpga_config.ko模塊,配置FPGA開(kāi)發(fā)工具ISE生成二進(jìn)制配置文件fpga.bin[7],使用./fpga_loader /firmware/fpga.bin命令加載配置文件,通過(guò)200MHz邏輯分析儀采集加載過(guò)程的波形如圖5所示。
圖5 配置過(guò)程波形
分析波形可得總配置時(shí)間為0.46s,CCLK時(shí)鐘最大頻率8.33MHz,本設(shè)計(jì)使用的FPGA速度等級(jí)為2C,串行從模式下該等級(jí)最大外部輸入時(shí)鐘為80MHz[3],該頻率高于配置過(guò)程最大時(shí)鐘頻率。通過(guò)應(yīng)用程序打印的信息,可知配置及加載成功。
通過(guò)AM3352的GPIO模擬FPGA配置接口時(shí)序,實(shí)現(xiàn)了在線配置FPGA的功能,省去了常見(jiàn)的外接FLASH芯片的成本。這種配置方式實(shí)現(xiàn)靈活,不占用微控制器專用接口資源,方便對(duì)FPGA固件進(jìn)行升級(jí)和更新操作,達(dá)到了設(shè)計(jì)要求。