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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于NiosII的SOPC中EEPROM Controller Core的設計

          基于NiosII的SOPC中EEPROM Controller Core的設計

          ——
          作者:麥 胤 柳沁 時間:2007-08-16 來源:電子產品世界 收藏

          摘  要:介紹了如何在基于中設計 Core,用Verilog HDL實現(xiàn)其硬件部分,編寫了相關驅動程序和應用層軟件,構建了基于。并以AT24C02為例,在Altera的Stratix1S10的FPGA上實現(xiàn)了通過 對其進行讀寫,試驗結果正確。

          關鍵詞  Core; Verilog硬件描述語言

          1  引言

          由于FPGA的出現(xiàn),使得我們不需要承擔較大風險和較高的流片費用將小規(guī)模的或處于研發(fā)階段的芯片制成ASIC芯片了。而基于FPGA的SOC——SOPC(可編程片上系統(tǒng)),由于其可編程性,按照用戶特定需要構建的SOPC是一個在某種程度上替代SOC的較好方案。Altera公司為其FPGA開發(fā)了第二代軟核處理器NiosII,同時開發(fā)了用以構建基于NiosII處理器的SOPC Builder,使得用戶可以通過自定義邏輯的方法方便地開發(fā)基于NiosII的SOPC系統(tǒng)。SOPC Builder集成在EDA工具QuartusII中,提供了NiosII處理器及一些常用外設接口,如DMA控制器, SDRAM控制器,SPI接口以及鎖相環(huán)PLL等等,對于一些庫中沒有提供的模塊用戶可以自己定義添加。在實際應用中,具有I2C接口的EEPROM有著廣泛的運用,本文就是在基于NiosII的SOPC中設計了一個EEPROM controller core,用Verilog HDL描述硬件邏輯部分,同時編寫相關驅動,下載到Stratix系列的 FPGA中實現(xiàn)了對片外EEPROM AT24C02的讀寫。 

          2 基于NiosII的Controller Core

          SOPC中的各模塊通過Altera公司開發(fā)的Avalon總線互連。任何一個掛接在Avalon總線上的模塊都必須符合Avalon總線規(guī)范,即包含特定的信號類型clk,reset,chipselect,write,writedata等,并滿足一定建立保持時間和等待周期的讀寫模式。一個典型模塊的Controller Core由硬件和驅動軟件兩部分構成。

          2.1硬件構成

          基于NiosII的Controller Core是用于構建SOPC的基本組件,它由HDL語言描述其硬件邏輯,一個典型的Controller Core由task logic(行為模塊),register  file(寄存器),interface(總線接口)三部分組成,它們在邏輯上的關聯(lián)關系如圖1所示:

          圖1

          interface是頂層模塊,與Avalon總線的直接接口;register file:通信模塊,對模塊內部寄存器讀寫的通道;task logic:行為模塊,實現(xiàn)模塊邏輯功能的核心部分。Avalon總線通過頂層接口模塊對寄存器進行操作,從而實現(xiàn)對行為模塊的訪問和控制。

          2.2 驅動軟件  
           
          驅動軟件是系統(tǒng)提供給上層應用程序訪問底層硬件的通道,由一些特定名稱的文件夾和C文件組成,其典型結構和功能如下:
          (1)    inc/_regs.h頭文件是最底層的也是唯一的硬件接口,定義了與Controller Core相關的數(shù)據(jù)結構、常量和函數(shù)原形等。
          (2)    hal/inc/_routines.h頭文件包含了實現(xiàn)驅動功能的函數(shù)聲明等相關信息。
          (3)    hal/src/_routines.c示例程序包含了具體實現(xiàn)驅動功能的子函數(shù),用于指導軟件開發(fā)人員使用該Controller Core。 

          3  EEPROM工作原理

          二線制EEPROM AT24C02是一種采用I2C接口的串行可電擦除可編程只讀存儲器。因其接線簡單且對數(shù)據(jù)修改具有足夠的靈活性,故得到了廣泛的應用。

          3.1 I2C總線規(guī)范

          I2C總線是由數(shù)據(jù)線SDA和時鐘線SCL構成,可發(fā)送和接收數(shù)據(jù)。I2C總線在傳輸數(shù)據(jù)的過程中共有三種基本類型信號,它們分別是開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數(shù)據(jù)。應答信號:接收端在接收到8位數(shù)據(jù)后,需向發(fā)送端發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。

          3.2 二線制EEPROM工作原理

          基于NiosII的SOPC通過EEPROM Controller Core可對其進行讀寫操作,讀寫規(guī)則要遵循EEPROM的時序要求。

          (1)    EEPROM的寫操作 

          如圖2所示,EEPROM Controller發(fā)出“啟動”信號后,緊接著發(fā)送4位I2C總線特征碼1010,和3位芯片地址碼xxx以及寫狀態(tài)位R/W=0。待接收到片外器件的應答信號ACK后,控制器將跟著發(fā)送EEPROM存儲單元地址和要寫入的數(shù)據(jù)。EEPROM每收到一個字節(jié)的數(shù)據(jù),都要發(fā)送一個ACK應答信號返回給主機。隨后主機發(fā)送停止信號,對EEPROM寫一個字節(jié)的操作完成。

          (2)    EEPROM的讀操作 

          如圖3所示,EEPROM的讀操作包括寫地址和讀數(shù)據(jù)兩步??刂破魇紫劝l(fā)送一個“啟動”信號和控制字節(jié)(包括器件地址和讀寫狀態(tài)位R/W=0)到EEPROM,通過寫操作設置EEPROM存儲單元地址。接著控制器再發(fā)送一個“啟動”信號和控制字節(jié)(此時R/W=1),啟動讀操作,EEPROM收到信息后將指定單元的數(shù)據(jù)到發(fā)送到SDA線上,控制器收到數(shù)據(jù)后返回一個NACK信號給EEPROM,隨后發(fā)送停止信號。

          4  EEPROM Controller Core的設計

          4. 1 硬件部分的設計


          (1)    task logic的設計
          本設計的task logic行為模塊是基于NiosII的EEPROM Controller邏輯功能的核心部分,要實現(xiàn)通過NiosII系統(tǒng)對EEPROM進行讀寫,就要按照I2C總線規(guī)范及EEPROM的讀寫要求來設計Controller Core。有限狀態(tài)機是時序電路設計中經(jīng)常采用的方式,是許多數(shù)字電路設計的核心。所以,我們采用狀態(tài)機來實現(xiàn)控制器的核心邏輯部分。根據(jù)串行EEPROM的讀寫操作時序可知,用5個狀態(tài)時鐘可以完成寫操作,用7個狀態(tài)時鐘可以完成讀操作。讀寫狀態(tài)中有幾個狀態(tài)是一致的,用一個嵌套的狀態(tài)機即可。狀態(tài)轉移圖如圖4所示。

          圖4

          (2)    register file的設計
          register file實際上是NiosII處理器通過軟件對硬件進行訪問和控制的通道,它由一系列寄存器組成,并規(guī)定了如何對其進行讀寫。Register file中的寄存器是根據(jù)task logic中需要完成的特定邏輯功能來設定的,task logic中的數(shù)據(jù)通過register file中的寄存器傳輸。本次設計中,register file中設定了控制字、地址及數(shù)據(jù)存儲器ctrl_reg,addr_reg,wr_reg,讀取數(shù)據(jù)存儲器rd_reg,其寬度都為8位。

          (3)    Interface的設計
          Interface接口模塊是與Avalon總線接口的一個top頂層模塊,主要功能是對task logic模塊和register file模塊進行例化和封裝,使其輸入輸出信號完全符合Avalon總線信號規(guī)范,和外接模塊的信號規(guī)范。本設計中,與Avalon總線接口的信號是:clk, resetn, avalon_chip_select, address, read, write, write_data, read_data;與外接EEPROM接口的信號是:sda, scl。

          如圖5是EEPROM Controller Core硬件部分設計的modelsim仿真圖,根據(jù)器件規(guī)則,模擬Avalon總線端連續(xù)寫控制字、地址及數(shù)據(jù)寄存器,Controller模塊根據(jù)所寫的內容將數(shù)據(jù)發(fā)送到SDA線上,實現(xiàn)對EEPROM的讀寫。

          圖5

          4. 2 軟件部分的設計

          EEPROM controller core的硬件部分設計好后,還需要編寫相關的驅動程序才能添加到SOPC中使用。其驅動設計如下:
          (1)inc中的altera_avalon_ eeprom _regs.h頭文件根據(jù)NiosII提供的系統(tǒng)讀寫函數(shù), 定義了讀寫寄存器的函數(shù)原型,如下所示:
          #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中定義的基本函數(shù)進行調用,編寫了實現(xiàn)對EEPROM任意地址讀寫數(shù)據(jù)的函數(shù),其中寫函數(shù)的代碼如下:

          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語言描述的文件和驅動軟件添加如圖6所示,并根據(jù)Avalon總線傳輸規(guī)范設置相關的信號線及傳輸參數(shù)。完成后就可將Controller Core添加到SOPC工程,并將其編譯下載到FPGA器件中。

          圖6

          同時,在NiosII IDE環(huán)境中,我們可以編寫用戶應用程序,使用自己添加的器件了。在此,我們調用altera_avalon_eeprom_routines.c定義的函數(shù)編寫了簡單的測試程序,對EEPROM的目標地址寫入數(shù)據(jù)并從該地址將數(shù)據(jù)讀出,在console控制臺中讀出結果正確。

          6  結語

          本文設計了基于NiosII的EEPROM Controller Core,設計包括了HDL語言描述的硬件部分和軟件驅動程序,并將Controller Core添加到SOPC Builder的庫中,最后下載到Stratix1S10的 FPGA上,通過讀寫函數(shù)對其進行了驗證。同時,本次設計也為開發(fā)其它基于SOPC的Controller Core提供了一個范例。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
          鎖相環(huán)相關文章:鎖相環(huán)原理


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();