基于NiosII的SOPC中EEPROM Controller Core的設計
摘 要:介紹了如何在基于NiosII的SOPC中設計EEPROM的Controller Core,用Verilog HDL實(shí)現其硬件部分,編寫(xiě)了相關(guān)驅動(dòng)程序和應用層軟件,構建了基于NiosII的SOPC。并以AT24C02為例,在A(yíng)ltera的Stratix1S10的FPGA上實(shí)現了通過(guò)EEPROM Controller對其進(jìn)行讀寫(xiě),試驗結果正確。
關(guān)鍵詞:NiosII; SOPC; EEPROM Controller Core; Verilog硬件描述語(yǔ)言
1 引言
由于FPGA的出現,使得我們不需要承擔較大風(fēng)險和較高的流片費用將小規模的或處于研發(fā)階段的芯片制成ASIC芯片了。而基于FPGA的SOC——SOPC(可編程片上系統),由于其可編程性,按照用戶(hù)特定需要構建的SOPC是一個(gè)在某種程度上替代SOC的較好方案。Altera公司為其FPGA開(kāi)發(fā)了第二代軟核嵌入式處理器NiosII,同時(shí)開(kāi)發(fā)了用以構建基于NiosII處理器的SOPC Builder,使得用戶(hù)可以通過(guò)自定義邏輯的方法方便地開(kāi)發(fā)基于NiosII的SOPC系統。SOPC Builder集成在EDA工具QuartusII中,提供了NiosII處理器及一些常用外設接口,如DMA控制器, SDRAM控制器,SPI接口以及鎖相環(huán)PLL等等,對于一些庫中沒(méi)有提供的模塊用戶(hù)可以自己定義添加。在實(shí)際應用中,具有I2C接口的EEPROM有著(zhù)廣泛的運用,本文就是在基于NiosII的SOPC中設計了一個(gè)EEPROM controller core,用Verilog HDL描述硬件邏輯部分,同時(shí)編寫(xiě)相關(guān)驅動(dòng),下載到Stratix系列的 FPGA中實(shí)現了對片外EEPROM AT24C02的讀寫(xiě)。
2 基于NiosII的Controller Core
SOPC中的各模塊通過(guò)Altera公司開(kāi)發(fā)的Avalon總線(xiàn)互連。任何一個(gè)掛接在A(yíng)valon總線(xiàn)上的模塊都必須符合Avalon總線(xiàn)規范,即包含特定的信號類(lèi)型clk,reset,chipselect,write,writedata等,并滿(mǎn)足一定建立保持時(shí)間和等待周期的讀寫(xiě)模式。一個(gè)典型模塊的Controller Core由硬件和驅動(dòng)軟件兩部分構成。
2.1硬件構成
基于NiosII的Controller Core是用于構建SOPC的基本組件,它由HDL語(yǔ)言描述其硬件邏輯,一個(gè)典型的Controller Core由task logic(行為模塊),register file(寄存器),interface(總線(xiàn)接口)三部分組成,它們在邏輯上的關(guān)聯(lián)關(guān)系如圖1所示:
圖1
interface是頂層模塊,與Avalon總線(xiàn)的直接接口;register file:通信模塊,對模塊內部寄存器讀寫(xiě)的通道;task logic:行為模塊,實(shí)現模塊邏輯功能的核心部分。Avalon總線(xiàn)通過(guò)頂層接口模塊對寄存器進(jìn)行操作,從而實(shí)現對行為模塊的訪(fǎng)問(wèn)和控制。
2.2 驅動(dòng)軟件
驅動(dòng)軟件是系統提供給上層應用程序訪(fǎng)問(wèn)底層硬件的通道,由一些特定名稱(chēng)的文件夾和C文件組成,其典型結構和功能如下:
(1) inc/_regs.h頭文件是最底層的也是唯一的硬件接口,定義了與Controller Core相關(guān)的數據結構、常量和函數原形等。
(2) hal/inc/_routines.h頭文件包含了實(shí)現驅動(dòng)功能的函數聲明等相關(guān)信息。
(3) hal/src/_routines.c示例程序包含了具體實(shí)現驅動(dòng)功能的子函數,用于指導軟件開(kāi)發(fā)人員使用該Controller Core。
3 EEPROM工作原理
二線(xiàn)制EEPROM AT24C02是一種采用I2C接口的串行可電擦除可編程只讀存儲器。因其接線(xiàn)簡(jiǎn)單且對數據修改具有足夠的靈活性,故得到了廣泛的應用。
3.1 I2C總線(xiàn)規范
I2C總線(xiàn)是由數據線(xiàn)SDA和時(shí)鐘線(xiàn)SCL構成,可發(fā)送和接收數據。I2C總線(xiàn)在傳輸數據的過(guò)程中共有三種基本類(lèi)型信號,它們分別是開(kāi)始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,開(kāi)始傳送數據。結束信號:SCL為高電平時(shí),SDA由低電平向高電平跳變,結束傳送數據。應答信號:接收端在接收到8位數據后,需向發(fā)送端發(fā)出特定的低電平脈沖,表示已收到數據。
3.2 二線(xiàn)制EEPROM工作原理
基于NiosII的SOPC通過(guò)EEPROM Controller Core可對其進(jìn)行讀寫(xiě)操作,讀寫(xiě)規則要遵循EEPROM的時(shí)序要求。
(1) EEPROM的寫(xiě)操作
如圖2所示,EEPROM Controller發(fā)出“啟動(dòng)”信號后,緊接著(zhù)發(fā)送4位I2C總線(xiàn)特征碼1010,和3位芯片地址碼xxx以及寫(xiě)狀態(tài)位R/W=0。待接收到片外器件的應答信號ACK后,控制器將跟著(zhù)發(fā)送EEPROM存儲單元地址和要寫(xiě)入的數據。EEPROM每收到一個(gè)字節的數據,都要發(fā)送一個(gè)ACK應答信號返回給主機。隨后主機發(fā)送停止信號,對EEPROM寫(xiě)一個(gè)字節的操作完成。
(2) EEPROM的讀操作
如圖3所示,EEPROM的讀操作包括寫(xiě)地址和讀數據兩步??刂破魇紫劝l(fā)送一個(gè)“啟動(dòng)”信號和控制字節(包括器件地址和讀寫(xiě)狀態(tài)位R/W=0)到EEPROM,通過(guò)寫(xiě)操作設置EEPROM存儲單元地址。接著(zhù)控制器再發(fā)送一個(gè)“啟動(dòng)”信號和控制字節(此時(shí)R/W=1),啟動(dòng)讀操作,EEPROM收到信息后將指定單元的數據到發(fā)送到SDA線(xiàn)上,控制器收到數據后返回一個(gè)NACK信號給EEPROM,隨后發(fā)送停止信號。
4 EEPROM Controller Core的設計
4. 1 硬件部分的設計
(1) task logic的設計
本設計的task logic行為模塊是基于NiosII的EEPROM Controller邏輯功能的核心部分,要實(shí)現通過(guò)NiosII系統對EEPROM進(jìn)行讀寫(xiě),就要按照I2C總線(xiàn)規范及EEPROM的讀寫(xiě)要求來(lái)設計Controller Core。有限狀態(tài)機是時(shí)序電路設計中經(jīng)常采用的方式,是許多數字電路設計的核心。所以,我們采用狀態(tài)機來(lái)實(shí)現控制器的核心邏輯部分。根據串行EEPROM的讀寫(xiě)操作時(shí)序可知,用5個(gè)狀態(tài)時(shí)鐘可以完成寫(xiě)操作,用7個(gè)狀態(tài)時(shí)鐘可以完成讀操作。讀寫(xiě)狀態(tài)中有幾個(gè)狀態(tài)是一致的,用一個(gè)嵌套的狀態(tài)機即可。狀態(tài)轉移圖如圖4所示。
圖4
(2) register file的設計
register file實(shí)際上是NiosII處理器通過(guò)軟件對硬件進(jìn)行訪(fǎng)問(wèn)和控制的通道,它由一系列寄存器組成,并規定了如何對其進(jìn)行讀寫(xiě)。Register file中的寄存器是根據task logic中需要完成的特定邏輯功能來(lái)設定的,task logic中的數據通過(guò)register file中的寄存器傳輸。本次設計中,register file中設定了控制字、地址及數據存儲器ctrl_reg,addr_reg,wr_reg,讀取數據存儲器rd_reg,其寬度都為8位。
(3) Interface的設計
Interface接口模塊是與Avalon總線(xiàn)接口的一個(gè)top頂層模塊,主要功能是對task logic模塊和register file模塊進(jìn)行例化和封裝,使其輸入輸出信號完全符合Avalon總線(xiàn)信號規范,和外接模塊的信號規范。本設計中,與Avalon總線(xiàn)接口的信號是:clk, resetn, avalon_chip_select, address, read, write, write_data, read_data;與外接EEPROM接口的信號是:sda, scl。
如圖5是EEPROM Controller Core硬件部分設計的modelsim仿真圖,根據器件規則,模擬Avalon總線(xiàn)端連續寫(xiě)控制字、地址及數據寄存器,Controller模塊根據所寫(xiě)的內容將數據發(fā)送到SDA線(xiàn)上,實(shí)現對EEPROM的讀寫(xiě)。
圖5
4. 2 軟件部分的設計
EEPROM controller core的硬件部分設計好后,還需要編寫(xiě)相關(guān)的驅動(dòng)程序才能添加到SOPC中使用。其驅動(dòng)設計如下:
(1)inc中的altera_avalon_ eeprom _regs.h頭文件根據NiosII提供的系統讀寫(xiě)函數, 定義了讀寫(xiě)寄存器的函數原型,如下所示:
#define IOWR_ALTERA_AVALON_EEPROM_CTRL_WRITE(base, data) IOWR(base, 0, data)
#define IORD_ALTERA_AVALON_EEPROM_DATA_READ(base) IORD(base, 4)
(2)src中的altera_avalon_eeprom_routines.c文件,對altera_avalon_eeprom_regs.h中定義的基本函數進(jìn)行調用,編寫(xiě)了實(shí)現對EEPROM任意地址讀寫(xiě)數據的函數,其中寫(xiě)函數的代碼如下:
void altera_avalon_eeprom_write(unsigned int address,alt_u8 ctrl_write,alt_u8 addr_write,alt_u8 data_write)
{
IOWR_ALTERA_AVALON_EEPROM_CTRL_WRITE(address, ctrl_write);
IOWR_ALTERA_AVALON_EEPROM_ADDR_WRITE(address, addr_write);
IOWR_ALTERA_AVALON_EEPROM_DATA_WRITE(address, data_write);
}
5 EEPROM Controller Core的添加
首先,用SOPC Builder中的new component edit添加設計好的Controller Core,將HDL語(yǔ)言描述的文件和驅動(dòng)軟件添加如圖6所示,并根據Avalon總線(xiàn)傳輸規范設置相關(guān)的信號線(xiàn)及傳輸參數。完成后就可將Controller Core添加到SOPC工程,并將其編譯下載到FPGA器件中。
圖6
同時(shí),在NiosII IDE環(huán)境中,我們可以編寫(xiě)用戶(hù)應用程序,使用自己添加的器件了。在此,我們調用altera_avalon_eeprom_routines.c定義的函數編寫(xiě)了簡(jiǎn)單的測試程序,對EEPROM的目標地址寫(xiě)入數據并從該地址將數據讀出,在console控制臺中讀出結果正確。
6 結語(yǔ)
本文設計了基于NiosII的EEPROM Controller Core,設計包括了HDL語(yǔ)言描述的硬件部分和軟件驅動(dòng)程序,并將Controller Core添加到SOPC Builder的庫中,最后下載到Stratix1S10的 FPGA上,通過(guò)讀寫(xiě)函數對其進(jìn)行了驗證。同時(shí),本次設計也為開(kāi)發(fā)其它基于SOPC的Controller Core提供了一個(gè)范例。
評論