孫永琦,李曉明
(浙江理工大學(xué)機(jī)械與自動(dòng)控制學(xué)院,杭州310018)
DW8051 是Synopsys 公司設(shè)計(jì)的一款高性能、可配置、可綜合的8051 軟核,該軟核同工業(yè)標(biāo)準(zhǔn)的803x/805x 微控制器兼容。DW8051 在很多基于ASIC和FPGA 技術(shù)的應(yīng)用中得到廣泛使用。DW8051 作為一個(gè)軟核,只提供了最基本的標(biāo)準(zhǔn)8051 外設(shè),包括通用串口、定時(shí)/計(jì)數(shù)器和中斷控制器。為了擴(kuò)展其應(yīng)用,DW8051 提供了一組用戶SFR(Special Function Register)外設(shè)總線,該總線可以讓用戶將自己設(shè)計(jì)的外設(shè)模塊連接到DW8051 上面。本文設(shè)計(jì)的SPI 控制器,可作為一個(gè)外設(shè)掛載在DW8051 的SFR 外設(shè)總線上。
串行外圍接口SPI(Serial Peripheral Interface)是芯片內(nèi)部串行通信的一種,該協(xié)議由Motorola 命名。SPI 是一種同步串行接口,可傳輸8 位字節(jié)格式數(shù)據(jù),同一時(shí)刻只能傳輸1 位,具有I/O 資源占用少、協(xié)議實(shí)現(xiàn)簡單、傳輸速度快等優(yōu)點(diǎn)。目前,還沒有公共領(lǐng)域規(guī)范對SPI 協(xié)議進(jìn)行定義,也沒有IEEE 的認(rèn)定。然而,Motorola 設(shè)計(jì)的SPI 規(guī)范已經(jīng)被廣泛采用,可看做事實(shí)上的標(biāo)準(zhǔn),而且得到很多半導(dǎo)體生產(chǎn)商的支持和認(rèn)可[1]。目前,很多的MCU 和DSP 芯片以及AD器件和Flash 都支持SPI 總線接口。
SPI 的一個(gè)重要特性就是主/從模式,串行SPI總線僅要求4 根信號線,其中兩根為控制線,兩根為數(shù)據(jù)線。SPI 總線的信號定義如下:控制信號,串行時(shí)鐘(SCLK)和從片選擇(SS);數(shù)據(jù)信號,主機(jī)輸入/從機(jī)輸出(MISO)和主機(jī)輸出/從機(jī)輸入(MOSI)。SPI 數(shù)據(jù)傳輸速率可達(dá)幾Mbit/s,通常只受限于主/從接口信號規(guī)范。該接口的主要問題是地址容量不足,每一從芯片都需要一根獨(dú)立的從芯片選擇線。對于簡單的主/從設(shè)計(jì)來說,SPI 是非常不錯(cuò)的選擇[1]。
本文設(shè)計(jì)的SPI 控制器模塊是作為DW8051 的一個(gè)外設(shè),根據(jù)具體的應(yīng)用需求(沒有多控制器應(yīng)用),該控制器僅被設(shè)計(jì)成一個(gè)SPI 主機(jī),其在整個(gè)系統(tǒng)的位置和與外部設(shè)備的關(guān)系如圖1。在微控制器(MCU)內(nèi)部,SPI 控制器通過SFR 總線與DW8051 內(nèi)核相連,其地位和普通I/O 端口(P0、P1、P2 和P3)相同;在外部,從MCU 頂層引出SPI的四根信號線,通過這些信號線與基于SPI 總線的外設(shè)相連。本文設(shè)計(jì)的SPI 控制器用硬件描述語言描述,成為一個(gè)可復(fù)用的IP 核,可以方便的集成到其他的數(shù)字系統(tǒng)中去。
圖1 系統(tǒng)總結(jié)構(gòu)
本文最終目標(biāo)是設(shè)計(jì)出如圖2 所示的SPI 頂層模塊。該頂層模塊的端口主要分為兩個(gè)部分:左邊的端口為控制信號端口,包括系統(tǒng)信號和與DW8051 連接的SFR 總線信號;右邊的端口為SPI的四根信號線。
各端口功能定義與描述如下:
i_clk:系統(tǒng)時(shí)鐘信號,由MCU 外部提供,與DW8051 內(nèi)核共用。
i_rst_n:系統(tǒng)復(fù)位信號,低電平有效,由MCU 外部提供,與DW8051 內(nèi)核共用。
i_sfr_addr:SFR 總線地址輸入信號,由DW8051內(nèi)核提供。
i_sfr_data_out:SFR 總線數(shù)據(jù)輸出信號,由DW8051 內(nèi)核提供。
i_sfr_wr:SFR 總線寫使能信號,由DW8051 內(nèi)核提供。
i_sfr_rd:SFR 總線讀使能信號,由DW8051 內(nèi)核提供。
o_sfr_data_in:SFR 總線數(shù)據(jù)輸入信號,輸出給DW8051 內(nèi)核。
o_spi_sfr_cs:SFR 總線選擇信號,輸出給DW8051 內(nèi)核。
i_miso:主機(jī)輸入/從機(jī)輸出信號,由SPI 外設(shè)輸入。
o_ss:從片選擇信號,使能SPI 外設(shè)。
o_mosi:主機(jī)輸出/從機(jī)輸入,輸出給SPI 外設(shè)。
o_sclk:串行時(shí)鐘,由SPI 控制器產(chǎn)生。
根據(jù)設(shè)計(jì)目標(biāo),將SPI 控制器分為兩個(gè)部分,一個(gè)是SFR 總線控制單元,一個(gè)是SPI 總線控制單元。將設(shè)計(jì)分塊可以有效的劃分功能,讓整個(gè)設(shè)計(jì)的邏輯更加清楚,符合模塊化設(shè)計(jì)的要求,也更有利于硬件描述語言的實(shí)現(xiàn)。
如圖3 所示,上面虛線框內(nèi)為SFR 總線控制單元,該部分主要負(fù)責(zé)與微控制器交互,包括SFR 總線控制接口和4 個(gè)寄存器;下面虛線框內(nèi)為SPI 總線控制單元,該部分主要負(fù)責(zé)產(chǎn)生和接收SPI 信號,包括sclk 產(chǎn)生模塊,SPI 控制狀態(tài)機(jī),發(fā)送/接收FIFO 和發(fā)送/接收移位寄存器。SPI 控制器的兩個(gè)部分擁有統(tǒng)一的系統(tǒng)時(shí)鐘,系統(tǒng)復(fù)位信號僅供SFR總線控制單元使用。
圖3 SPI 控制模塊內(nèi)部結(jié)構(gòu)
SPI 主要的組成部分功能闡述如下:
SFR 總線控制接口——與DW8051 的接口??刂芐FR 總線控制單元中的四個(gè)寄存器的讀取與寫入。
控制寄存器——由微控制器進(jìn)行隨機(jī)讀寫,用來配置SPI 控制器的各種控制信號,包括SPI 使能信號、SPI 的時(shí)鐘極性、相位以及傳輸數(shù)率。
擴(kuò)展控制寄存器——對控制寄存器的擴(kuò)展,包括SPI 讀使能信號、讀取數(shù)據(jù)數(shù)目控制信號、從設(shè)備選擇信號(可以根據(jù)外設(shè)數(shù)目進(jìn)行擴(kuò)展位數(shù))。該寄存器有未定義位,可以作為以后升級擴(kuò)展用。
狀態(tài)寄存器——控制器運(yùn)行時(shí)的狀態(tài)標(biāo)志,該寄存器為只讀,微控制器根據(jù)狀態(tài)寄存器來控制SPI 的數(shù)據(jù)傳輸。包括傳輸結(jié)束標(biāo)志位、SPI 讀沖突和寫溢出位以及發(fā)送/接收FIFO 的滿空標(biāo)志位。
數(shù)據(jù)寄存器——在邏輯上只有一個(gè)數(shù)據(jù)寄存器,既表示發(fā)送又表示接收,對于微控制器來說只有一個(gè)單元地址。在物理上分為發(fā)送寄存器和接收寄存器兩個(gè)。
CLK 分頻計(jì)數(shù)器——由控制寄存器控制,用于產(chǎn)生SCLK 信號,頻率分別為系統(tǒng)頻率的1/2、1/20、1/26 和1/64。
SPI 控制狀態(tài)機(jī)——根據(jù)控制寄存器和擴(kuò)展控制寄存器來產(chǎn)生控制邏輯,用以控制發(fā)送FIFO 和移位寄存器以及接收FIFO 和移位寄存器。
緩沖FIFO 和移位寄存器——獨(dú)立的發(fā)送緩沖FIFO 和接收緩沖FIFO,同步FIFO 的深度為16,寬度為8。發(fā)送FIFO 的輸出為寄存輸出,接收FIFO的輸出為非寄存,主要是為了配合微控制器的讀寫時(shí)序,兩者其他都相同。當(dāng)發(fā)送緩沖FIFO 為滿且仍向FIFO 中寫入時(shí),產(chǎn)生寫溢出;當(dāng)接收緩沖FIFO為滿且仍在接收數(shù)據(jù)時(shí),產(chǎn)生讀沖突。發(fā)送和接收移位寄存器在SPI 控制狀態(tài)機(jī)的控制下,串行的發(fā)送和接收數(shù)據(jù),當(dāng)發(fā)送或接收完一個(gè)字節(jié)時(shí),將該字節(jié)存入相應(yīng)的FIFO,然后繼續(xù)下一個(gè)字節(jié)的發(fā)送或者接收。
Verilog HDL 是硬件描述語言的一種,用于數(shù)字電子系統(tǒng)設(shè)計(jì)。該語言允許設(shè)計(jì)者進(jìn)行各種級別的邏輯設(shè)計(jì),進(jìn)行邏輯系統(tǒng)的仿真驗(yàn)證、時(shí)序分析、邏輯綜合。它是目前應(yīng)用最廣泛的一種硬件描述語言。用Verilog HDL 描述的電路設(shè)計(jì)就是該電路的Verilog HDL 模型,也稱模塊[3]。本文對SPI 控制器模塊采用RTL(寄存器傳輸級)進(jìn)行描述,編寫的RTL 模型可以進(jìn)行綜合并在FPGA 上進(jìn)行驗(yàn)證。
大型數(shù)字系統(tǒng)一般采用自頂向下(Top_Down)的設(shè)計(jì)方法。本文設(shè)計(jì)的SPI 控制器規(guī)模比較小,所以沒有采用該方法,而是把主要電路設(shè)計(jì)在一個(gè)模塊內(nèi)完成,發(fā)送FIFO 和接收FIFO 分別在另外兩個(gè)模塊內(nèi)完成。
有限狀態(tài)機(jī)是實(shí)現(xiàn)時(shí)序電路常用的方式,很多數(shù)字系統(tǒng)的控制模型都采用這種方式,它是大多數(shù)數(shù)字電路的核心。相比其他的設(shè)計(jì)方案,狀態(tài)機(jī)的機(jī)構(gòu)模式簡單、運(yùn)行速度快、程序?qū)哟畏置?、可靠性更高?/p>
根據(jù)電路設(shè)計(jì),本文設(shè)計(jì)的SPI 控制器主要分為SFR 總線控制單元和SPI 總線控制單元。SFR 總線控制單元主要是根據(jù)DW8051 的時(shí)序來進(jìn)行寄存器的讀寫操作,結(jié)構(gòu)比較簡單,在本文中不做詳細(xì)介紹;SPI 總線控制單元是設(shè)計(jì)重點(diǎn),本文采用有限狀態(tài)機(jī)來實(shí)現(xiàn)SPI 總線控制單元的核心時(shí)序電路。SPI 控制狀態(tài)機(jī)主要完成的任務(wù)是:根據(jù)CLK 分頻計(jì)數(shù)器和控制寄存器產(chǎn)生SCLK 信號;控制SPI 總線的工作模式;產(chǎn)生讀FIFO 信號,從發(fā)送緩沖FIFO中讀取數(shù)據(jù);產(chǎn)生寫FIFO 信號,向接收緩沖FIFO中寫入數(shù)據(jù);控制發(fā)送和接收移位寄存器的移位輸出和輸入;產(chǎn)生傳輸結(jié)束標(biāo)志。SPI 控制狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換如圖4 所示。
圖4 SPI 控制狀態(tài)機(jī)轉(zhuǎn)換結(jié)構(gòu)圖
狀態(tài)機(jī)開始處于初始狀態(tài)(IDLE),設(shè)置SPI 時(shí)鐘極性,當(dāng)從設(shè)備選擇信號有效后,如果發(fā)送使能信號有效則狀態(tài)轉(zhuǎn)移到發(fā)送開始狀態(tài)(S1),如果接收使能信號有效則狀態(tài)轉(zhuǎn)移到接收開始狀態(tài)(R1);發(fā)送狀態(tài)S1 啟動(dòng)發(fā)送,打開傳輸標(biāo)志位,產(chǎn)生讀發(fā)送緩沖FIFO 信號;發(fā)送狀態(tài)S2 延遲一個(gè)節(jié)拍;發(fā)送狀態(tài)S3 讀取發(fā)送緩沖FIFO 數(shù)據(jù),并設(shè)置SPI 時(shí)鐘相位;發(fā)送狀態(tài)S4 翻轉(zhuǎn)SLCK 信號;發(fā)送狀態(tài)S5 移位輸出發(fā)送數(shù)據(jù)的一位,翻轉(zhuǎn)SLCK 信號并計(jì)數(shù),當(dāng)減一計(jì)數(shù)器歸零狀態(tài)轉(zhuǎn)移到IDLE,當(dāng)減一計(jì)數(shù)器不為零則狀態(tài)轉(zhuǎn)移到S4;接收狀態(tài)R1 啟動(dòng)接收,打開傳輸標(biāo)志位,并設(shè)置SPI 時(shí)鐘相位;接收狀態(tài)R2 翻轉(zhuǎn)SLCK信號;接收狀態(tài)R3 移位接收一位SPI 輸入信號,翻轉(zhuǎn)SLCK 信號并計(jì)數(shù),當(dāng)減一計(jì)數(shù)器歸零狀態(tài)轉(zhuǎn)移到IDLE,當(dāng)減一計(jì)數(shù)器不為零則狀態(tài)轉(zhuǎn)移到R2。
在本文的設(shè)計(jì)中,采用獨(dú)熱(One Hot)碼對狀態(tài)進(jìn)行編碼。這種編碼方式用n 個(gè)觸發(fā)器實(shí)現(xiàn)n 個(gè)狀態(tài)的狀態(tài)機(jī),雖然使用了較多的觸發(fā)器,但所用組合電路可以省一些,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無增加。采用獨(dú)熱編碼后由了多余的狀態(tài),就有一些不可到達(dá)的狀態(tài)。為此,在case 語句的最后需要增加default 分支項(xiàng)。這可以用默認(rèn)項(xiàng)表示該項(xiàng),也可以用確定項(xiàng)表示,以確?;氐絀DLE 狀態(tài)[3]。用Verilog HDL 來描述狀態(tài)機(jī)時(shí)有多種方法,在本文中采用兩段式方法,用最常用的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
在完成整個(gè)SPI 控制器模型設(shè)計(jì)以后,要對其進(jìn)行功能仿真和在FPGA 上進(jìn)行實(shí)際驗(yàn)證,本文功能仿真使用的工具是Modelsim 6.5f,F(xiàn)PGA 使用的是Altera 公司Cyclone Ⅱ系列的EP2C8Q208C8 芯片,工具是Quartus Ⅱ9.0。為了驗(yàn)證SPI 控制器功能的正確性,在本文中選用了一款SPI 接口的Flash,通過編程向Flash 中寫入指令,然后讀取指令。Flash 的型號為旺宏微電子的MX25L512C,該公司的Flash 提供的有Verilog 仿真模型,方便仿真。Flash 的連接方式如圖1 中的SPI 外設(shè)。仿真波形如圖5 所示,有波形圖可以看出,首先cs 線拉低使能FLASH,接著發(fā)送讀數(shù)據(jù)指令及地址0x03,0x00,0x00,然后可以從Flash 中讀取數(shù)據(jù)。在實(shí)際的仿真過程中,還做了更加詳細(xì)的驗(yàn)證,包括擦出Flash中的內(nèi)容,然后寫入新的數(shù)據(jù),最后再讀出顯示。對于SPI 控制器,我們還設(shè)置了4 種傳輸速率,以及對控制寄存器進(jìn)行不同的賦值,以產(chǎn)生不同的控制信號,最后都證明了SPI 控制器模塊功能的正確性。
圖5 仿真波形圖
然后在FPGA 上驗(yàn)證SPI 控制器模塊,整個(gè)過程同功能仿真類似,只是整個(gè)設(shè)計(jì)包括DW8051 內(nèi)核下載到FPGA 上,然后將真實(shí)的Flash(MX25L512C)連接到FPGA 的I/O 端口口上面,對Flash 進(jìn)行各種操作,驗(yàn)證整個(gè)設(shè)計(jì)的正確性。
本文設(shè)計(jì)了一款基于DW8051 的SPI 控制器,該控制器基于DW8051 的SFR 總線,特點(diǎn)在于具有獨(dú)立的深度為16 的發(fā)送和接收緩沖FIFO、功能豐富的控制寄存器以及其擴(kuò)展性。本文設(shè)計(jì)的SPI 控制器不僅限于DW8051 的使用,通過對SFR 總線控制單元的修改,同樣可以作為其他微控制器的外圍設(shè)備使用。
[1] Greg Osborn.嵌入式微控制器與處理器設(shè)計(jì)[M]. 北京:機(jī)械工業(yè)出版社,2011:79-81.
[2] 李曉林,朱昱光,李臨生,等.單片機(jī)原理與接口技術(shù)[M].第2版.北京:電子工業(yè)出版社,2011:198-203.
[3] 夏宇聞.Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程[M].第2 版. 北京:北京航空航天大學(xué)出版社,2009:11,19.
[4] 孫豐軍,余春暄.SPI 串行總線接口的Verilog 實(shí)現(xiàn)[J].現(xiàn)代電子計(jì)數(shù),2005,16(207):105-109.
[5] 楊承富,徐志軍.SPI 總線接口的FPGA 設(shè)計(jì)與實(shí)現(xiàn)[J].軍事通信計(jì)數(shù),2004,25(2):72-76.
[6] 趙新麗,許忠仁,付貴增,等.基于FPGA 與單片機(jī)的SPI 接口的實(shí)現(xiàn)[J].工業(yè)儀表與自動(dòng)化裝置,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.