基于SoPC和NIOS Ⅱ的SD卡文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
SD卡中的數(shù)據(jù)是以塊為單位進(jìn)行存儲(chǔ)的,如果在硬件層面對(duì)其進(jìn)行操作,則不僅要非常了解SD卡的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),還要對(duì)FAT系統(tǒng)有深刻的理解,然后用復(fù)雜的時(shí)序狀態(tài)機(jī)對(duì)其扇區(qū)進(jìn)行初始化和讀取控制,對(duì)硬件直接進(jìn)行操作可以節(jié)省FPGA資源。為了更有效地組織和管理SD卡中的數(shù)據(jù),必須采用文件的格式進(jìn)行組織數(shù)據(jù),這就要求在SD卡中內(nèi)嵌文件系統(tǒng)[1]。而隨著FPGA的高速發(fā)展,以AlteraNIOSⅡ和Xilinx的MicroBlaze為代表的軟核處理器以其高可定制性、與ARM相比相同價(jià)格下的高性能得到廣泛的應(yīng)用。
本文引用地址:http://cafeforensic.com/article/189683.htm本文正是利用其豐富的外設(shè)和接口定制構(gòu)建SD卡的FAT文件系統(tǒng)。
1 接口和控制器的設(shè)計(jì)
1.1 接口的配置
SD卡有SD模式和SPI模式2種,SPI是一種高速、同步、全雙工的通信總線(xiàn),只占用4根信號(hào)線(xiàn),節(jié)約芯片的管腳,有利于PCB的布局。前者速度較快,后者比較方便我們采用后者SPI與FPGA進(jìn)行通信,它由4個(gè)信號(hào)組成,分別是CS(片選信號(hào))、MOSI(主機(jī)到SD卡)、MISO(SD卡到主機(jī))、SCLK(主機(jī)和SD卡的同步時(shí)鐘),以主從方式工作,本文中SPI為主機(jī),SD卡是從機(jī),處于單主單從模式。在由NIOSⅡ軟核處理器控制的Avalon總線(xiàn)[2-3]下可以方便地與SD卡進(jìn)行對(duì)接。Avalon總線(xiàn)是一種將片上處理器和外設(shè)連接成片上可編程(SoPC)的一種簡(jiǎn)單總線(xiàn)結(jié)構(gòu),它規(guī)定了主從設(shè)備之間的結(jié)構(gòu)方式及其通信方式,通過(guò)使用SoPC Builder可以很方便地將自定義外設(shè)和其他組件組合起來(lái),生成按照組件例化的系統(tǒng)模塊,并自動(dòng)生成內(nèi)部總線(xiàn)邏輯,自動(dòng)完成外設(shè)和存儲(chǔ)器的地址映射、中斷控制和總線(xiàn)控制。圖1所示為設(shè)備之間的連接示意圖,NIOSⅡ處理器和外設(shè)SD卡控制器的通過(guò)Avalon總線(xiàn)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交換和溝通,SD卡控制器控制著外部SD卡存儲(chǔ)介質(zhì)。
1.2 控制器的設(shè)計(jì)
SD卡控制器[4]是FPGA和SD卡之間進(jìn)行通信的翻譯官,主要實(shí)現(xiàn)3大功能:(1)復(fù)位和初始化SD卡。控制器按照SD卡總線(xiàn)協(xié)議產(chǎn)生控制時(shí)序?qū)ζ溥M(jìn)行復(fù)位和初始化。
(2)讀寫(xiě)SD卡??刂破魍ㄟ^(guò)CMD線(xiàn)發(fā)送讀或者寫(xiě)的命令以及SD卡扇區(qū)地址,確認(rèn)收到正確的響應(yīng)后,通過(guò)DAT線(xiàn)進(jìn)行讀和寫(xiě)操作(分別涉及串并轉(zhuǎn)換和并串轉(zhuǎn)換),一次傳輸一個(gè)扇區(qū)的數(shù)據(jù)(512B),傳輸完畢后將就緒信號(hào)置為有效。
(3)設(shè)置SD卡。通過(guò)CMD線(xiàn)發(fā)送命令和參數(shù),不發(fā)送或接受數(shù)據(jù)。
圖1設(shè)備連接示意圖
1.3 SoPC中的硬件搭建
SoPC(SystemonaProgrammableChip),即可編程片上系統(tǒng),用可編程邏輯把整個(gè)系統(tǒng)放到一塊硅片上,是一種特殊的嵌入式系統(tǒng),可以編程的片上系統(tǒng)(SOC)[5]。
借助于AlteraSoPC方便的組件定制、硬件組裝和它的靈活的設(shè)計(jì)方式,不用一個(gè)個(gè)親自用硬件語(yǔ)言去實(shí)現(xiàn)各個(gè)組件,只需要在SoPC里定制,最后結(jié)果如圖2所示,因?yàn)镾D卡的工作頻率最高為25MHz,與FPGA自身的時(shí)鐘頻率不一定一樣,所以要加上clock_crossing用于協(xié)調(diào)2個(gè)不同的時(shí)鐘域。onchip_memory是片內(nèi)存儲(chǔ)器,用于儲(chǔ)存程序運(yùn)行的代碼或者堆棧之類(lèi)的變量。timer和sysid用來(lái)協(xié)調(diào)這些組件良好運(yùn)作,例如SoPCBuilder會(huì)使用SystemID為每個(gè)系統(tǒng)提供識(shí)別符號(hào),NIOSⅡEDS可以用此防止使用者燒錄與硬件信息不符合的sof文件。Timer是內(nèi)部時(shí)鐘定時(shí)。如果丟失這兩個(gè)組件,會(huì)導(dǎo)致最后的軟件運(yùn)行出現(xiàn)錯(cuò)誤。
圖2SoPC組件定制
其中sd_wp_n是SD卡寫(xiě)保護(hù)信號(hào)線(xiàn),由于默認(rèn)激活SD卡所以片選信號(hào)沒(méi)加。altpll是鎖相環(huán),用來(lái)調(diào)節(jié)穩(wěn)定所需的時(shí)鐘信號(hào),DE2系列的開(kāi)發(fā)板上都有1到2個(gè)鎖相環(huán)。jtag_uart用來(lái)調(diào)試、打印數(shù)據(jù)到控制臺(tái),驗(yàn)證讀取寫(xiě)入的數(shù)據(jù)是否相同。
評(píng)論