(原創(chuàng)聲明:該文是作者的原創(chuàng),面向?qū)ο笫?/em>FPGA入門(mén)者,后續(xù)會(huì)有進(jìn)階的高級(jí)教程。宗旨是讓每個(gè)想做FPGA的人輕松入門(mén),作者不光讓大家知其然,還要讓大家知其所以然!每個(gè)工程作者都搭建了全自動(dòng)化的仿真環(huán)境,只需要雙擊top_tb.bat文件就可以完成整個(gè)的仿真(前提是安裝了modelsim),降低了初學(xué)者的門(mén)檻。如需整個(gè)工程請(qǐng)留言(WX:Blue23Light),不收任何費(fèi)用,但是僅供參考,不建議大家獲得資料后從事一些商業(yè)活動(dòng)!)
SPI的英文全稱(chēng)為Serial Peripheral Interface,顧名思義為串行外設(shè)接口。SPI是一種同步串行通信接口規(guī)范,主要應(yīng)用于嵌入式系統(tǒng)中的短距離通信。該接口由摩托羅拉在20世紀(jì)80年代中期開(kāi)發(fā),后發(fā)展成了行業(yè)規(guī)范。
SPI是一種高速的、全雙工的、同步的通信總線,并且至多僅需使用4根線,節(jié)約了芯片的管腳,SPI主要應(yīng)用于EEPROM、FLASH、ADC、DAC等芯片,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。
SPI設(shè)備之間采用全雙工模式通信,是一個(gè)主機(jī)和一個(gè)或者多個(gè)從機(jī)的主從模式。主機(jī)負(fù)責(zé)初始化幀,這個(gè)數(shù)據(jù)傳輸幀可以用于讀與寫(xiě)兩種操作,片選線可以從多個(gè)從機(jī)選擇一個(gè)來(lái)響應(yīng)主機(jī)的請(qǐng)求。
SPI通信中有4種不同的操作模式,不同的從機(jī)設(shè)備可能在出廠時(shí)就被設(shè)置好了某種模式,并且無(wú)法更改。但是SPI通信必須處于同一種模式下才能進(jìn)行。因此我們應(yīng)該對(duì)自己手里的SPI主機(jī)設(shè)備進(jìn)行模式的配置,也就是通過(guò)CPOL(時(shí)鐘極性)和CPHA(時(shí)鐘相位)來(lái)控制SPI主設(shè)備的通信模式,具體如下:
時(shí)鐘極性(CPOL)定義了SCLK時(shí)鐘線空閑狀態(tài)時(shí)的電平:
CPOL=0,即SCLK=0,表示SCLK時(shí)鐘信號(hào)線在空閑狀態(tài)時(shí)的電平為低電平,因此有效狀態(tài)為高電平。
CPOL=1,即SCLK=1,表示SCLK時(shí)鐘信號(hào)線在空閑狀態(tài)時(shí)的電平為高電平,因此有效狀態(tài)為低電平。
時(shí)鐘相位(CPHA)定義了數(shù)據(jù)位相對(duì)于時(shí)鐘線的時(shí)序(即相位):
CPHA=0,即表示輸出(out)端在上一個(gè)時(shí)鐘周期的后沿改變數(shù)據(jù),而輸入(in)端在時(shí)鐘周期的前沿(或不久之后)捕獲數(shù)據(jù)。輸出端保持?jǐn)?shù)據(jù)有效直到當(dāng)前時(shí)鐘周期的尾部邊緣。對(duì)于第一個(gè)時(shí)鐘周期來(lái)說(shuō),第一位的數(shù)據(jù)必須在時(shí)鐘前沿之前出現(xiàn)在MOSI線上。也就是一個(gè)CPHA=0的周期包括半個(gè)時(shí)鐘空閑和半個(gè)時(shí)鐘置位的周期。
CPHA=1,即表示輸出(out)端在當(dāng)前時(shí)鐘周期的前沿改變數(shù)據(jù),而輸入(in)端在時(shí)鐘周期的后沿(或不久之后)捕獲數(shù)據(jù)。輸出端保持?jǐn)?shù)據(jù)有效直到下一個(gè)時(shí)鐘周期的前沿。對(duì)于最后一個(gè)時(shí)鐘周期來(lái)說(shuō),從機(jī)設(shè)備在片選信號(hào)消失之前保持MISO信號(hào)線有效。也就是一個(gè)CHPA=1的周期包括半個(gè)時(shí)鐘置位和半個(gè)時(shí)鐘空閑的周期。
時(shí)鐘極性和相位的時(shí)序圖。紅線表示時(shí)鐘的前沿,藍(lán)線表示時(shí)鐘的后沿。
SPI的FPGA實(shí)現(xiàn),網(wǎng)上有很多的教程,很多是用狀態(tài)機(jī)實(shí)現(xiàn)的,本節(jié)我們用一種簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)SPI的主機(jī)通信,先來(lái)實(shí)現(xiàn)CPOL=0和CPHA=0;下節(jié)課再用通用方式來(lái)實(shí)現(xiàn)4種模式。
SPI的時(shí)鐘一般都是一個(gè)范圍,這個(gè)要看實(shí)際芯片的datasheet,所以我們可以采用主時(shí)鐘的分頻來(lái)實(shí)現(xiàn),主要在規(guī)定的范圍內(nèi)即可。
如下所示,定義了參數(shù)DNUM是要發(fā)送數(shù)據(jù)的位寬,FRE_DIV是主時(shí)鐘的分頻數(shù),取2的冪次,如果是4就是主時(shí)鐘的4分頻,假設(shè)主時(shí)鐘是100MHz,那SPI的時(shí)鐘就是25MHz。FRE_DIV_INDEX就是分頻數(shù)的那個(gè)冪次,FRE_DIV取4,F(xiàn)RE_DIV_INDEX就是2,F(xiàn)RE_DIV取8,F(xiàn)RE_DIV_INDEX就是3......
用信號(hào)spi_conv來(lái)標(biāo)識(shí)一次SPI通信,spi_state_cnt的計(jì)數(shù)最大值是數(shù)據(jù)位寬和分頻數(shù)的乘積(總共消耗的系統(tǒng)時(shí)鐘數(shù)),同時(shí)根據(jù)計(jì)數(shù)值值完成spi_over和spi_cs信號(hào)的控制。
根據(jù)計(jì)數(shù)器取分頻時(shí)鐘,即SPI的時(shí)鐘spi_sck,因?yàn)?strong>CPOL=0,所以spi_sck在空閑狀態(tài)時(shí)低電平。因?yàn)?strong>CPHA=0,就是在spi_sck的下升沿SPI的輸出spi_mosi進(jìn)行變化,通過(guò)信號(hào)shift_en和shift_en_d來(lái)取spi_sck的下降沿send_en_flag。最后將要發(fā)送的數(shù)據(jù)通過(guò)send_en_flag控制放到線spi_mosi上即可。
新建tb測(cè)試文件,在文件中設(shè)計(jì)了2個(gè)task,spi_data()用來(lái)產(chǎn)生16位的隨機(jī)數(shù)據(jù),spi_slave()模擬接收spi_master發(fā)送的串行信號(hào),并與spi_master實(shí)際發(fā)送的并行多位信號(hào)進(jìn)行比較,通過(guò)打印信息確定設(shè)計(jì)的功能是否正確。
雙擊sim目錄下得top_tb.bat文件,完成系統(tǒng)得自動(dòng)化仿真。
1次SPI發(fā)送的仿真波形圖如下所示。
查看modelsim的Transcript窗口,spi_master發(fā)送的數(shù)據(jù)和spi_slave接收的數(shù)據(jù)一致,設(shè)計(jì)功能正常。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-766580.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766580.html
到了這里,關(guān)于孩子都能學(xué)會(huì)的FPGA:第三十一課——用FPGA實(shí)現(xiàn)SPI主機(jī)發(fā)送數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!