孫永琦,李曉明
(浙江理工大學機械與自動控制學院,杭州310018)
DW8051 是Synopsys 公司設計的一款高性能、可配置、可綜合的8051 軟核,該軟核同工業標準的803x/805x 微控制器兼容。DW8051 在很多基于ASIC和FPGA 技術的應用中得到廣泛使用。DW8051 作為一個軟核,只提供了最基本的標準8051 外設,包括通用串口、定時/計數器和中斷控制器。為了擴展其應用,DW8051 提供了一組用戶SFR(Special Function Register)外設總線,該總線可以讓用戶將自己設計的外設模塊連接到DW8051 上面。本文設計的SPI 控制器,可作為一個外設掛載在DW8051 的SFR 外設總線上。
串行外圍接口SPI(Serial Peripheral Interface)是芯片內部串行通信的一種,該協議由Motorola 命名。SPI 是一種同步串行接口,可傳輸8 位字節格式數據,同一時刻只能傳輸1 位,具有I/O 資源占用少、協議實現簡單、傳輸速度快等優點。目前,還沒有公共領域規范對SPI 協議進行定義,也沒有IEEE 的認定。然而,Motorola 設計的SPI 規范已經被廣泛采用,可看做事實上的標準,而且得到很多半導體生產商的支持和認可[1]。目前,很多的MCU 和DSP 芯片以及AD器件和Flash 都支持SPI 總線接口。
SPI 的一個重要特性就是主/從模式,串行SPI總線僅要求4 根信號線,其中兩根為控制線,兩根為數據線。SPI 總線的信號定義如下:控制信號,串行時鐘(SCLK)和從片選擇(SS);數據信號,主機輸入/從機輸出(MISO)和主機輸出/從機輸入(MOSI)。SPI 數據傳輸速率可達幾Mbit/s,通常只受限于主/從接口信號規范。該接口的主要問題是地址容量不足,每一從芯片都需要一根獨立的從芯片選擇線。對于簡單的主/從設計來說,SPI 是非常不錯的選擇[1]。
本文設計的SPI 控制器模塊是作為DW8051 的一個外設,根據具體的應用需求(沒有多控制器應用),該控制器僅被設計成一個SPI 主機,其在整個系統的位置和與外部設備的關系如圖1。在微控制器(MCU)內部,SPI 控制器通過SFR 總線與DW8051 內核相連,其地位和普通I/O 端口(P0、P1、P2 和P3)相同;在外部,從MCU 頂層引出SPI的四根信號線,通過這些信號線與基于SPI 總線的外設相連。本文設計的SPI 控制器用硬件描述語言描述,成為一個可復用的IP 核,可以方便的集成到其他的數字系統中去。

圖1 系統總結構
本文最終目標是設計出如圖2 所示的SPI 頂層模塊。該頂層模塊的端口主要分為兩個部分:左邊的端口為控制信號端口,包括系統信號和與DW8051 連接的SFR 總線信號;右邊的端口為SPI的四根信號線。
各端口功能定義與描述如下:
i_clk:系統時鐘信號,由MCU 外部提供,與DW8051 內核共用。
i_rst_n:系統復位信號,低電平有效,由MCU 外部提供,與DW8051 內核共用。
i_sfr_addr:SFR 總線地址輸入信號,由DW8051內核提供。
i_sfr_data_out:SFR 總線數據輸出信號,由DW8051 內核提供。
i_sfr_wr:SFR 總線寫使能信號,由DW8051 內核提供。
i_sfr_rd:SFR 總線讀使能信號,由DW8051 內核提供。
o_sfr_data_in:SFR 總線數據輸入信號,輸出給DW8051 內核。
o_spi_sfr_cs:SFR 總線選擇信號,輸出給DW8051 內核。
i_miso:主機輸入/從機輸出信號,由SPI 外設輸入。
o_ss:從片選擇信號,使能SPI 外設。
o_mosi:主機輸出/從機輸入,輸出給SPI 外設。
o_sclk:串行時鐘,由SPI 控制器產生。
根據設計目標,將SPI 控制器分為兩個部分,一個是SFR 總線控制單元,一個是SPI 總線控制單元。將設計分塊可以有效的劃分功能,讓整個設計的邏輯更加清楚,符合模塊化設計的要求,也更有利于硬件描述語言的實現。
如圖3 所示,上面虛線框內為SFR 總線控制單元,該部分主要負責與微控制器交互,包括SFR 總線控制接口和4 個寄存器;下面虛線框內為SPI 總線控制單元,該部分主要負責產生和接收SPI 信號,包括sclk 產生模塊,SPI 控制狀態機,發送/接收FIFO 和發送/接收移位寄存器。SPI 控制器的兩個部分擁有統一的系統時鐘,系統復位信號僅供SFR總線控制單元使用。

圖3 SPI 控制模塊內部結構
SPI 主要的組成部分功能闡述如下:
SFR 總線控制接口——與DW8051 的接口。控制SFR 總線控制單元中的四個寄存器的讀取與寫入。
控制寄存器——由微控制器進行隨機讀寫,用來配置SPI 控制器的各種控制信號,包括SPI 使能信號、SPI 的時鐘極性、相位以及傳輸數率。
擴展控制寄存器——對控制寄存器的擴展,包括SPI 讀使能信號、讀取數據數目控制信號、從設備選擇信號(可以根據外設數目進行擴展位數)。該寄存器有未定義位,可以作為以后升級擴展用。
狀態寄存器——控制器運行時的狀態標志,該寄存器為只讀,微控制器根據狀態寄存器來控制SPI 的數據傳輸。包括傳輸結束標志位、SPI 讀沖突和寫溢出位以及發送/接收FIFO 的滿空標志位。
數據寄存器——在邏輯上只有一個數據寄存器,既表示發送又表示接收,對于微控制器來說只有一個單元地址。在物理上分為發送寄存器和接收寄存器兩個。
CLK 分頻計數器——由控制寄存器控制,用于產生SCLK 信號,頻率分別為系統頻率的1/2、1/20、1/26 和1/64。
SPI 控制狀態機——根據控制寄存器和擴展控制寄存器來產生控制邏輯,用以控制發送FIFO 和移位寄存器以及接收FIFO 和移位寄存器。
緩沖FIFO 和移位寄存器——獨立的發送緩沖FIFO 和接收緩沖FIFO,同步FIFO 的深度為16,寬度為8。發送FIFO 的輸出為寄存輸出,接收FIFO的輸出為非寄存,主要是為了配合微控制器的讀寫時序,兩者其他都相同。當發送緩沖FIFO 為滿且仍向FIFO 中寫入時,產生寫溢出;當接收緩沖FIFO為滿且仍在接收數據時,產生讀沖突。發送和接收移位寄存器在SPI 控制狀態機的控制下,串行的發送和接收數據,當發送或接收完一個字節時,將該字節存入相應的FIFO,然后繼續下一個字節的發送或者接收。
Verilog HDL 是硬件描述語言的一種,用于數字電子系統設計。該語言允許設計者進行各種級別的邏輯設計,進行邏輯系統的仿真驗證、時序分析、邏輯綜合。它是目前應用最廣泛的一種硬件描述語言。用Verilog HDL 描述的電路設計就是該電路的Verilog HDL 模型,也稱模塊[3]。本文對SPI 控制器模塊采用RTL(寄存器傳輸級)進行描述,編寫的RTL 模型可以進行綜合并在FPGA 上進行驗證。
大型數字系統一般采用自頂向下(Top_Down)的設計方法。本文設計的SPI 控制器規模比較小,所以沒有采用該方法,而是把主要電路設計在一個模塊內完成,發送FIFO 和接收FIFO 分別在另外兩個模塊內完成。
有限狀態機是實現時序電路常用的方式,很多數字系統的控制模型都采用這種方式,它是大多數數字電路的核心。相比其他的設計方案,狀態機的機構模式簡單、運行速度快、程序層次分明、可靠性更高。
根據電路設計,本文設計的SPI 控制器主要分為SFR 總線控制單元和SPI 總線控制單元。SFR 總線控制單元主要是根據DW8051 的時序來進行寄存器的讀寫操作,結構比較簡單,在本文中不做詳細介紹;SPI 總線控制單元是設計重點,本文采用有限狀態機來實現SPI 總線控制單元的核心時序電路。SPI 控制狀態機主要完成的任務是:根據CLK 分頻計數器和控制寄存器產生SCLK 信號;控制SPI 總線的工作模式;產生讀FIFO 信號,從發送緩沖FIFO中讀取數據;產生寫FIFO 信號,向接收緩沖FIFO中寫入數據;控制發送和接收移位寄存器的移位輸出和輸入;產生傳輸結束標志。SPI 控制狀態機的狀態轉換如圖4 所示。

圖4 SPI 控制狀態機轉換結構圖
狀態機開始處于初始狀態(IDLE),設置SPI 時鐘極性,當從設備選擇信號有效后,如果發送使能信號有效則狀態轉移到發送開始狀態(S1),如果接收使能信號有效則狀態轉移到接收開始狀態(R1);發送狀態S1 啟動發送,打開傳輸標志位,產生讀發送緩沖FIFO 信號;發送狀態S2 延遲一個節拍;發送狀態S3 讀取發送緩沖FIFO 數據,并設置SPI 時鐘相位;發送狀態S4 翻轉SLCK 信號;發送狀態S5 移位輸出發送數據的一位,翻轉SLCK 信號并計數,當減一計數器歸零狀態轉移到IDLE,當減一計數器不為零則狀態轉移到S4;接收狀態R1 啟動接收,打開傳輸標志位,并設置SPI 時鐘相位;接收狀態R2 翻轉SLCK信號;接收狀態R3 移位接收一位SPI 輸入信號,翻轉SLCK 信號并計數,當減一計數器歸零狀態轉移到IDLE,當減一計數器不為零則狀態轉移到R2。
在本文的設計中,采用獨熱(One Hot)碼對狀態進行編碼。這種編碼方式用n 個觸發器實現n 個狀態的狀態機,雖然使用了較多的觸發器,但所用組合電路可以省一些,因而使電路的速度和可靠性有顯著提高,而總的單元數并無增加。采用獨熱編碼后由了多余的狀態,就有一些不可到達的狀態。為此,在case 語句的最后需要增加default 分支項。這可以用默認項表示該項,也可以用確定項表示,以確保回到IDLE 狀態[3]。用Verilog HDL 來描述狀態機時有多種方法,在本文中采用兩段式方法,用最常用的always 語句和case 語句。
parameter Idle = 9’b000_000_001,
S1 = 9’b000_000_010,
……
R3 = 9’b100_000_000;
always @(posedge i_clk)
if(~SPE)
state <= 8’h00;
else
state <= next_state;
always @(state or …)
case(state)
Idle:begin
……
end
……
default:next_state = 9’b000_000_001;
endcase
在完成整個SPI 控制器模型設計以后,要對其進行功能仿真和在FPGA 上進行實際驗證,本文功能仿真使用的工具是Modelsim 6.5f,FPGA 使用的是Altera 公司Cyclone Ⅱ系列的EP2C8Q208C8 芯片,工具是Quartus Ⅱ9.0。為了驗證SPI 控制器功能的正確性,在本文中選用了一款SPI 接口的Flash,通過編程向Flash 中寫入指令,然后讀取指令。Flash 的型號為旺宏微電子的MX25L512C,該公司的Flash 提供的有Verilog 仿真模型,方便仿真。Flash 的連接方式如圖1 中的SPI 外設。仿真波形如圖5 所示,有波形圖可以看出,首先cs 線拉低使能FLASH,接著發送讀數據指令及地址0x03,0x00,0x00,然后可以從Flash 中讀取數據。在實際的仿真過程中,還做了更加詳細的驗證,包括擦出Flash中的內容,然后寫入新的數據,最后再讀出顯示。對于SPI 控制器,我們還設置了4 種傳輸速率,以及對控制寄存器進行不同的賦值,以產生不同的控制信號,最后都證明了SPI 控制器模塊功能的正確性。

圖5 仿真波形圖
然后在FPGA 上驗證SPI 控制器模塊,整個過程同功能仿真類似,只是整個設計包括DW8051 內核下載到FPGA 上,然后將真實的Flash(MX25L512C)連接到FPGA 的I/O 端口口上面,對Flash 進行各種操作,驗證整個設計的正確性。
本文設計了一款基于DW8051 的SPI 控制器,該控制器基于DW8051 的SFR 總線,特點在于具有獨立的深度為16 的發送和接收緩沖FIFO、功能豐富的控制寄存器以及其擴展性。本文設計的SPI 控制器不僅限于DW8051 的使用,通過對SFR 總線控制單元的修改,同樣可以作為其他微控制器的外圍設備使用。
[1] Greg Osborn.嵌入式微控制器與處理器設計[M]. 北京:機械工業出版社,2011:79-81.
[2] 李曉林,朱昱光,李臨生,等.單片機原理與接口技術[M].第2版.北京:電子工業出版社,2011:198-203.
[3] 夏宇聞.Verilog 數字系統設計教程[M].第2 版. 北京:北京航空航天大學出版社,2009:11,19.
[4] 孫豐軍,余春暄.SPI 串行總線接口的Verilog 實現[J].現代電子計數,2005,16(207):105-109.
[5] 楊承富,徐志軍.SPI 總線接口的FPGA 設計與實現[J].軍事通信計數,2004,25(2):72-76.
[6] 趙新麗,許忠仁,付貴增,等.基于FPGA 與單片機的SPI 接口的實現[J].工業儀表與自動化裝置,2010,2:32-33.
[7] Liu Tianxiang,Wang Yunfeng.IP Design of Universal Multiple Devices SPI Interface[C]//Anti-Counterfeiting,Security and Identification(ASID),2011 IEEE International Conference on,2011:169-172.
[8] Zhang Jianlong,Wu Chunyu,Zhang Wenjing,et al.The Design and Realization of a Comprehensive SPI Interface Controller[C]//Mechanic Automation and Control Engineering(MACE),2011 Second International Conference on,2011:4529-4532.
[9] Wikipedia,the free encyclopedia,“Serial Peripheral Interface Bus”[EB/OL].Available http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus.
[10] Deepak Kumar Tala,“Verilog Tutorial”[EB/OL]. Available http://www.asicworld.com.
[11] Oudjida A K,Berrandjia M L,Liacha A,et al. Design and Test of General-Purpose SPI Master/Slave IPs on OPB bus[C]//2010 7th International Multi-Conference on Systems Signals and Devices(SSD).2010:1-6.
[12] Oudjida A K,Berrandjia ,M L,Tiar R,et al. FPGA Implementation of I2C & SPI Protocols:A Comparative Study[C]//2009 16th IEEE International Conference on Electronics,Circuits,and Systems(ICECS),2009:507-510.