基于SOC的SPI接口設(shè)計(jì)與驗(yàn)證
摘要:給出了一個(gè)可用于SoC設(shè)計(jì)的SPI接口IP核的RTL設(shè)計(jì)與功能仿真。采用AMBA 2.0總線標(biāo)準(zhǔn)來實(shí)現(xiàn)SPI接口在外部設(shè)備和內(nèi)部系統(tǒng)之間進(jìn)行通信,在數(shù)據(jù)傳輸部分,摒棄傳統(tǒng)的需要一個(gè)專門的移位傳輸寄存器實(shí)現(xiàn)串/并轉(zhuǎn)換的設(shè)計(jì)方法,采用復(fù)用寄存器的方法,把移位傳輸寄存器和發(fā)送寄存器結(jié)合在一起,提高了傳輸速度,也節(jié)約了硬件資源。采用SoC驗(yàn)證平臺(tái)進(jìn)行SoC環(huán)境下對IP的驗(yàn)證,在100 MHz時(shí)鐘頻率下的仿真和驗(yàn)證結(jié)果表明,SPI接口實(shí)現(xiàn)了數(shù)據(jù)傳輸,且滿足時(shí)序設(shè)計(jì)要求。
本文引用地址:http://butianyuan.cn/article/234922.htm0 引言
SPI(Serial Peripheral Interface)是一種同步串行總線接口,很多器件如E2PROM、FLASH、實(shí)時(shí)時(shí)鐘、A/D轉(zhuǎn)換器等都用到了SPI接口,它也是SoC中的一個(gè)常用外圍功能模塊。AMBA總線是由ARM公司開發(fā)的一種高性能、開放性SoC系統(tǒng)總線,它主要包括AHB,ASB和APB三種總線類型。AHB總線主要用于連接高性能、高速度的系統(tǒng)模塊,如CPU,DSP,SRAM等;APB總線主要用于連接低速外圍模塊,如UART,I2C等,接口簡單,效率高,功耗低;ASB總線通過連接系統(tǒng)高速部件來實(shí)現(xiàn)高速通信,一般較少用到。
本文設(shè)計(jì)一個(gè)可作為IP核用于SoC設(shè)計(jì)的SPI接口,采用AMBA2.0總線標(biāo)準(zhǔn)來實(shí)現(xiàn)SPI接口在外部設(shè)備和內(nèi)部系統(tǒng)之間進(jìn)行通信,SPI接口作為低速外圍模塊掛載在APB總線上。
1 SPI接口的定義
1.1 接口信號
SPI的接口信號為同步串行時(shí)鐘SCLK、主機(jī)輸入/從機(jī)輸出MISO、主機(jī)輸出/從機(jī)輸入MOSI、從機(jī)選擇
(低電平有效),由于只用到四根線工作,與其他接口相比具有結(jié)構(gòu)簡單、速度快的優(yōu)點(diǎn)。SPI有主/從兩種工作模式,SPI總線的串行時(shí)鐘SCLK用來同步數(shù)據(jù)傳輸,在主模式下由主機(jī)產(chǎn)生,從機(jī)選擇信號
用來決定外部設(shè)備是否被選作SPI的從設(shè)備。主從設(shè)備連接方式如圖1所示。
1.2 內(nèi)部寄存器
SPI的內(nèi)部寄存器如表1所示。
1.3 傳輸時(shí)序
在本設(shè)計(jì)中,SPI的傳輸時(shí)序由控制寄存器CTRL來決定。CTRL[9]定義為RX_NEGE,置1表示數(shù)據(jù)在時(shí)鐘下降沿接收,置0為上升沿接收;CTRL[10]定義為TX_NEGE,置1表示數(shù)據(jù)在下降沿發(fā)送,置0為上升沿發(fā)送;CTRL[11]定義為LSB,置1表示數(shù)據(jù)從最低位開始傳輸,置0從最高位開始傳輸。CTRL[6:0]定義為CHAR_LEN,為數(shù)據(jù)傳輸長度,最長可為128 b。以其中一種傳輸時(shí)序?yàn)槔f明,如圖2所示。
2 SPI接口的RTL設(shè)計(jì)
本設(shè)計(jì)是針對SoC系統(tǒng)的,目標(biāo)是實(shí)現(xiàn)適用于SoC設(shè)計(jì)并且符合SPI通信協(xié)議的IP核,實(shí)現(xiàn)SoC通過此SPI接口和外設(shè)通信。所以,本設(shè)計(jì)分成SPI主機(jī)模塊spi_master的設(shè)計(jì)和SPI從機(jī)模塊spi_slave的設(shè)計(jì),采用Verilog HDL進(jìn)行RTL設(shè)計(jì)。
2.1 spi_master模塊設(shè)計(jì)
spi_master的功能主要包括:
(1)實(shí)現(xiàn)主機(jī)通過APB總線初始化spi_master的寄存器;
(2)實(shí)現(xiàn)spi_master和spi_slave之間的數(shù)據(jù)交換。
因此,spi_master模塊主要就是實(shí)現(xiàn)分頻和串并轉(zhuǎn)換,主要包含時(shí)鐘產(chǎn)生子模塊spi_clgen和數(shù)據(jù)傳輸子模塊spi_shift,其設(shè)計(jì)結(jié)構(gòu)如圖3所示。
2.1.1 時(shí)鐘產(chǎn)生子模塊設(shè)計(jì)
該子模塊主要作用是產(chǎn)生SPI主/從設(shè)備通信所需的同步串行時(shí)鐘sclk。在主模式下,sclk由系統(tǒng)提供的時(shí)鐘信號pclk分頻產(chǎn)生,產(chǎn)生的串行時(shí)鐘的時(shí)鐘頻率由式(1)計(jì)算得來:
傳輸開始前,cnt載人DIVIDER值,滿足傳輸條件下cnt減1計(jì)數(shù),減為0時(shí),輸出時(shí)鐘clk_out翻轉(zhuǎn),并且在clk_out的上升沿和下降沿分別產(chǎn)生pos_edge和neg_edge信號。
2.1.2 數(shù)據(jù)傳輸子模塊設(shè)計(jì)
該子模塊的主要功能是完成數(shù)據(jù)的串/并轉(zhuǎn)換。在本設(shè)計(jì)中,該子模塊負(fù)責(zé)把內(nèi)部APB總線并行傳輸進(jìn)來的數(shù)據(jù)轉(zhuǎn)化成串行數(shù)據(jù)傳輸給SPI從設(shè)備,并且把外部SPI從設(shè)備串行傳輸進(jìn)來的數(shù)據(jù)轉(zhuǎn)化成并行數(shù)據(jù)傳入到APB總線上。
傳統(tǒng)的串/并轉(zhuǎn)換設(shè)計(jì)方法需要一個(gè)專門的移位傳輸寄存器,本設(shè)計(jì)采用了復(fù)用寄存器的方法,把移位傳輸寄存器和發(fā)送寄存器結(jié)合在一起。當(dāng)傳輸停止且總線鎖存使能時(shí),數(shù)據(jù)從APB總線并行傳輸?shù)絪pi_shift移位傳輸寄存器即發(fā)送寄存器TxX,然后在傳輸時(shí)鐘使能情況下串行輸出到MOSI;而在主機(jī)接收使能的情況下,由從機(jī)MISO串行輸人數(shù)據(jù)至spi_shift移位傳輸寄存器。傳輸結(jié)構(gòu)如圖4所示,從圖4可以看出,數(shù)據(jù)傳輸位寬最大可達(dá)128 b/s。
2.1.3 RTL代碼設(shè)計(jì)
spi_master模塊代碼設(shè)計(jì)劃分如下:
(1)寄存器選擇使能信號的地址譯碼電路;
(2)讀寄存器部分,將并行數(shù)據(jù)輸出到APB總線上;
(3)控制寄存器ctrl、時(shí)鐘分頻寄存器divider、從機(jī)選擇寄存器ss初始化部分;
(4)例化時(shí)鐘分頻子模塊和數(shù)據(jù)傳輸子模塊。
為了提高代碼的復(fù)用性,特別設(shè)計(jì)了一個(gè)宏定義模塊,主要定義了傳輸最大位數(shù)SPI_MAX_CHAR,分頻寄存器位數(shù)SPI_DIVIDER_LEN,從機(jī)選擇數(shù)目SPI_SS_NB等相關(guān)數(shù)據(jù)。
2.2 spi_slave模塊設(shè)計(jì)
評論