摘 要:SPI 總線接口是Motorola 公司提出的一種全雙工的同步串行外設通信接口,用于連接微處理器和各種外圍設備??删幊唐舷到y(tǒng)是Altera 公司提出的一種靈活、高效的SoC 解決方案,SoPC 模塊間的互聯(lián)使用了Avalon 交換式總線?;贏valon 交換式總線接口規(guī)范,利用Verilog HDL 硬件描述語言實現(xiàn)SPI 總線接口的硬件設計,編寫SPI 接口模塊在NIOS Ⅱ系統(tǒng)中的驅動程序。在Modelsim 中對SPI 接口的硬件設計進行功能和時序仿真;在FPGA 開發(fā)板上構建了實際的NIOS Ⅱ系統(tǒng),驗證SPI 接口的SoPC模塊;仿真和驗證結果正確,滿足設計要求。
關鍵詞:可編程片上系統(tǒng);串行外設接口;Verilog 硬件描述語言;FPGA;NIOS Ⅱ
中圖分類號:TN402;TP302 文獻標識碼:B 文章編號:1004-373X(2008)02-013-04
Design and Implement of SoPC Modular for SPI Bus Interface
LIAO Binbin,ZHANG Fuhong,SHANG Junna
(School of Communication Engineering,Hangzhou Dianzi University,Hangzhou,310018,China)
Abstract:Serial peripheral interface bus is a synchronous serial data link standard designed by Motorola which operates in full duplex mode,it allows communication between micro processor and peripheral devices.SoPC (System on Programmable Chip) is a kind of flexible and high performance SoC solution designed by Altera.The SoPC system interconnect fabric is Avalon switch fabric.The SPI interface based on Avalon switch fabric using Verilog HDL (Hardware Description Language) is designed and implemented.And then a device driver of SPI interface modular for NIOS Ⅱ system is written.The function and timing simulation in Modelsim are also presented.A prototype NIOS Ⅱ system on FPGA development board is built to verify this modular.Results of simulation and verification satisfy the design requirement.
Keywords:system on programmable chip;serial peripheral interface;Verilog HDL;FPGA;NIOS Ⅱ
1 引 言
可編程片上系統(tǒng)(System on Programmable Chip,SoPC)是Altera公司提出的一種靈活、高效的SoC解決方案,是一種特殊的嵌入式微處理器系統(tǒng),他是將軟件和硬件集成到單個可編程邏輯器件平臺中,同時獲得軟件的靈活性以及硬件的高性能優(yōu)勢,并且他是可編程系統(tǒng),具有靈活的設計方式,可裁減、可擴充、可升級,并具備軟硬件在系統(tǒng)可編程的功能。
SPI總線接口(Serial Peripheral Interface)是Motorola公司提出的一種全雙工的同步串行外設通信接口,用于連接微處理器和各種外圍設備,是一種3線總線結構,接口信號線少,實現(xiàn)簡單,應用非常廣泛。
本文給出的是通過Verilog HDL硬件描述語言實現(xiàn)SPI總線的SoPC模塊設計,并編寫該模塊在NIOS Ⅱ系統(tǒng)中的驅動程序。
2 SPI 總線接口與Avalon交換式總線簡介
2.1 SPI總線接口
SPI總線接口最早由Motorola公司提出,他是一種全雙工的同步串行外設通信接口,用于連接微處理器和各種外圍設備。SPI接口一般由4根信號線組成,1根串行時鐘線(SCLK)、2根數(shù)據(jù)線主機輸入/從機輸出線(MISO)和主機輸出/從機輸入線(MOSI),還有一根是低電平有效的從機選擇線(SS)。
SPI接口總線上的數(shù)據(jù)傳送是通過串行時鐘SCLK進行同步。SCLK信號由SPI主機端產(chǎn)生,通過串行時鐘線(SCLK)傳到SPI從機,從而實現(xiàn)串行數(shù)據(jù)的同步傳送。MISO和MOSI的功能取決于其是作為主機還是從機。當作為主機時,MISO是輸入,MOSI是輸出,作為從機時剛好相反。其應用通常是一個SPI主機連接一個或多個SPI從機。
SPI接口的數(shù)據(jù)傳輸有4種不同的傳輸模式,由SPI控制寄存器中CPOL和CPHA位來選擇當前傳輸模式,如表1所示。
2.2 Avalon交換式總線
Avalon交換式總線是由Altera開發(fā)的一種專用的內(nèi)部連線技術,是SoPC Builder的專用互聯(lián)技術。Avalon交換式總線由SoPC Builder自動生成,是一種最理想的用于系統(tǒng)處理器和外設之間的內(nèi)聯(lián)總線。每當一個新的組件被添加到系統(tǒng)中或某個外設的優(yōu)先級被改變,就會生成一個新的、最佳的交換式總線結構。整個過程都由SoPC Builder自動完成,所以用戶可以很容易地修改系統(tǒng)以提高性能或增加系統(tǒng)功能。
Avalon交換式總線使用最少的邏輯資源來支持數(shù)據(jù)總線的復用、地址譯碼、等待周期的產(chǎn)生、外設的地址對齊、中斷優(yōu)先級的指定以及高級的交換式總線傳輸。
Avalon交換式總線接口靈活,用戶只需使用系統(tǒng)所需的信號來進行數(shù)據(jù)傳輸。Avalon交換式總線定義的內(nèi)聯(lián)線策略使得任何一個Avalon總線上的主設備都可以與任何一個從設備建立連接。Avalon交換式總線還支持大范圍的系統(tǒng)結構,包括單個的,多個的主設備系統(tǒng),還具有在外設之間通過不同路徑進行無縫的數(shù)據(jù)傳輸能力。
為了適應SoPC系統(tǒng)外設的開發(fā),Altera制定了Avalon總線接口規(guī)范,Avalon總線接口規(guī)范用于規(guī)范外設的設計使其符合SoPC系統(tǒng)的設計要求,提高設計的可復用性,大大提高系統(tǒng)設計效率。
3 SPI總線接口設計與Verilog實現(xiàn)
3.1 SPI總線接口設計
本文設計的SPI接口模塊為SPI主機部分,主要用于FPGA基帶處理開發(fā)板和射頻板之間的通信連接,以實現(xiàn)在FPGA中控制射頻板的工作模式和參數(shù)設置。其應用框圖如圖2所示。
在FPGA中實現(xiàn)的是SPI主機模塊。射頻板上有2個SPI從機,其數(shù)據(jù)寬度、傳輸模式等都不同,這就需要SPI主機部分能夠根據(jù)不同的從機選擇設置不同的傳輸參數(shù),主要的參數(shù)有數(shù)據(jù)寬度、傳輸模式、傳輸速率、數(shù)據(jù)傳輸方向(MSB先傳還是LSB先傳)。因為所設計的SPI接口模塊需要在SoPC系統(tǒng)中使用,其接口信號必須滿足Avalon交換式總線接口規(guī)范,表2所示為所設計的SPI接口模塊的接口信號。其中CLK為系統(tǒng)時鐘信號;reset_n為低電平有效的復位信號,使系統(tǒng)復位到一個確定的初始狀態(tài);CS為片選信號;address為輸入地址線,用來選擇SPI接口模塊內(nèi)部的寄存器;read和write為讀寫使能信號輸入;read_data和write_data為32位讀寫數(shù)據(jù);byte_enable為字節(jié)使能信號輸入;interrupt為中斷請求信號輸出;sclk為串行時鐘信號輸出;mosi和miso分別為主機輸出從機輸入、從機輸出主機輸入的串行數(shù)據(jù)線;ss為從機選擇信號輸出,可與8個從機相連。
本文中設計的SPI接口模塊使用Avalon總線和其他模塊之間實現(xiàn)互連。其功能結構如圖3所示。
SPI任務邏輯:實現(xiàn)SPI數(shù)據(jù)的傳輸控制;
SPI寄存器文件:SPI寄存器文件提供了任務邏輯和外界交換數(shù)據(jù)的途徑,根據(jù)寄存器文件,用戶就可以通過Avalon接口使用基地址+地址偏移量的方式來訪問SPI接口模塊的內(nèi)部寄存器;
控制寄存器:用來對SPI接口模塊電路進行配置的,可以設置數(shù)據(jù)寬度、串行時鐘的極性和相位、以及傳輸速率;
狀態(tài)寄存器:包含發(fā)送完成或者系統(tǒng)出錯的標志位;
從選擇寄存器:選擇需要同主機進行通信的從機;
波特率寄存器:決定串行時鐘SCLK的速率;
接收數(shù)據(jù)寄存器:接收數(shù)據(jù)寄存器;
發(fā)送數(shù)據(jù)寄存器:發(fā)送數(shù)據(jù)寄存器;
Avalon接口:Avalon接口為寄存器文件提供一個標準的Avalon前端,使用Avalon標準的接口信號來訪問寄存器文件。
3.2 SPI接口模塊的Verilog實現(xiàn)
Verilog HDL是一種硬件描述語言,他可以用來進行各種級別的邏輯設計,可以用來進行數(shù)字邏輯系統(tǒng)的仿真驗證、時序分析和邏輯綜合等,應用十分廣泛。本文使用Verilog設計SPI接口模塊。分析SPI接口模塊的功能之后,本文使用有限狀態(tài)機實現(xiàn)SPI接口模塊的傳輸控制,有如下5個狀態(tài):idle,start,sample_data,change_data,stop。狀態(tài)轉換圖如圖4所示。
idle:SPI接口模塊處于空閑狀態(tài),不進行任何操作;
start:數(shù)據(jù)傳輸開始,用于在數(shù)據(jù)傳輸之前對SPI接口模塊進行配置,設置狀態(tài)寄存器等;
sample_data:對MISO信號線上接收的數(shù)據(jù)進行采樣鎖存;
change_data:改變MOSI信號線上的數(shù)據(jù);
stop:數(shù)據(jù)傳輸完成狀態(tài),用于在數(shù)據(jù)傳輸完成之后設置狀態(tài)寄存器等。
有限狀態(tài)機的狀態(tài)編碼主要有5種編碼方式,順序編碼、格雷碼編碼、獨熱編碼(one-hot)、隨機編碼和自動編碼。本文使用獨熱編碼,其每1個狀態(tài)需要1個觸發(fā)器,狀態(tài)數(shù)等于觸發(fā)器的數(shù)目,非常適合在寄存器資源豐富的FPGA器件中使用,并且采用獨熱編碼的狀態(tài)機速度非??欤O計簡單。
3.3 SPI接口模塊的驅動設計
本文設計的SPI接口的SoPC模塊,需要能夠在NIOS Ⅱ軟核處理器上運行,因此需要編寫SPI接口模塊在NIOS Ⅱ上的驅動程序。
NIOS Ⅱ上的應用程序是通過HAL系統(tǒng)庫來訪問底層系統(tǒng)硬件的。HAL系統(tǒng)庫是一個輕量級的運行環(huán)境,HAL API包含了ANSI C 標準庫,應用開發(fā)人員可以用熟悉的C標準庫函數(shù)訪問設備和文件;他使NIOS Ⅱ中的設備像Unix系統(tǒng)設備一樣具有相對一致的開發(fā)接口,同時也提供了Unix風格的庫函數(shù),其使用方式和習慣類似于UNIX(Linux)系統(tǒng),設備訪問接口一致。這種體系使應用開發(fā)人員和設備驅動開發(fā)人員可以分工合作,提高開發(fā)效率,同時降低應用開發(fā)難度。
SoPC Builder和NIOS Ⅱ IDE之間緊密集成,在SoPC Builder生成硬件系統(tǒng)以后,NIOS Ⅱ IDE能夠自動生成對應的HAL系統(tǒng)庫,更新硬件系統(tǒng)設置以后,NIOS Ⅱ IDE能自動更新HAL的驅動設置。在創(chuàng)建軟件項目的時候,NIOS Ⅱ IDE自動生成并管理HAL系統(tǒng)庫。
SPI接口模塊驅動程序是基于HAL系統(tǒng)庫,其主要功能是SPI接口模塊的初始化、傳輸速率選擇、控制寄存器設置、從機選擇,以及數(shù)據(jù)發(fā)送和接收,分別由Avalon_SPI_Init,Avalon_SPI_Set_Buadrate,Avalon_SPI_Set_Control,Avalon_SPI_Select_Slave,Avalon_SPI_Transmit這5個函數(shù)來實現(xiàn)。為方便移植,驅動程序用C語言編寫,使用Altera提供的IOWR和IORD接口函數(shù)來訪問SPI接口模塊內(nèi)部寄存器,不同寄存器通過基地址+地址偏移量的方式尋址。
4 仿真分析與驗證
將SPI接口模塊用Verilog HDL設計好之后,需要進行仿真來驗證設計。首先進行功能仿真,在Modelsim中對Verilog設計文件進行編譯、調試,修改設計文件直到功能仿真結果正確。一次SPI傳輸?shù)墓δ芊抡娼Y果如圖5所示。其中傳輸速率為f/8;f為系統(tǒng)時鐘頻率;數(shù)據(jù)寬度為8 b,LSB先傳,CPOL=1,CPHA=1,SPI主機發(fā)送的數(shù)據(jù)為0X8A,SPI從機發(fā)送的數(shù)據(jù)為0X3A。從功能仿真結果可以看到模塊邏輯功能正確。
功能仿真通過之后,需要進行時序仿真,驗證設計的時序要求是否滿足。將Verilog HDL設計文件用Quartus Ⅱ編譯,布局布線后生成比較精確的時延信息文件,并將此文件添加到Modelsim中進行時序仿真,改進設計使仿真結果正確并滿足時序要求。一次SPI傳輸?shù)臅r序仿真結果如圖6所示。其中傳輸速率為f/8,f為系統(tǒng)時鐘頻率,數(shù)據(jù)寬度為8 b,LSB先傳,CPOL=1,CPHA=1,SPI主機發(fā)送的數(shù)據(jù)為0X8A,SPI從機發(fā)送的數(shù)據(jù)為0X3A。從圖6中可以看出時序仿真結果正確。
當功能仿真和時序仿真通過后,根據(jù)硬件設計文件和軟件驅動程序,在SoPC Builder中定制一個基于Avalon交換式總線的用戶自定義外設Myspi,Myspi的接口信號如表2所示,接口信號符合Avalon交換式總線接口規(guī)范。為了驗證Myspi外設,在基于Cyclone Ⅱ芯片的FPGA開發(fā)板上建立了一個SPI接口模塊測試系統(tǒng),通過SoPC Builder配置SoPC系統(tǒng),加入NIOS Ⅱ CPU,jtag_uart,onchip_memory,sdram,F(xiàn)ALSH,Myspi,spi_slave_core等模塊。其中spi_slave_core為SPI從機模塊,將Myspi和spi_slave_core模塊相應的信號線相連。圖7是SPI接口模塊測試系統(tǒng)原理圖。
NIOS Ⅱ中使用Micro C/OS-Ⅱ嵌入式操作系統(tǒng),應用程序中使用2個任務分別控制SPI主機和SPI從機,修改驅動程序直到SPI主機和SPI從機之間能夠進行正常[LL]通信。調試結果顯示SPI主機和SPI從機之間通信正確,表明Myspi外設滿足設計要求,SPI接口模塊設計正確。
5 結 語
本文通過SPI接口模塊,從SPI接口模塊功能設計、接口信號設計、硬件實現(xiàn)以及NIOS Ⅱ驅動程序設計,闡述了SoPC模塊的編寫方法和步驟。所設計的SPI接口模塊通過了功能仿真和時序仿真,并在實際的NIOS Ⅱ系統(tǒng)上運行,驗證了接口功能的正確性。
參 考 文 獻
[1]孫豐軍,余春暄.SPI串行總線接口的Verilog實現(xiàn)[J].現(xiàn)代電子技術,2005,28(16):105-106,109.
[2]楊承富,徐志軍.SPI總線接口的FPGA設計與實現(xiàn)[J].軍事通信技術,2004,25(2):72-76.
[3]高谷剛,羅春.可復用SPI模塊IP核的設計與驗證[J].單片機與嵌入式系統(tǒng)應用,2004(11):5-8.
[4]劉伯棟,金永剛,裴毅,等.在FPGA中實現(xiàn)SPI與總線接口轉換[J].無線電工程,2005,35(3):59-61.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。