一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【教程分享】FPGA零基礎(chǔ)學(xué)習(xí):SPI 協(xié)議驅(qū)動(dòng)設(shè)計(jì)

電子發(fā)燒友論壇 ? 來(lái)源:未知 ? 2023-07-11 09:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本系列將帶來(lái)FPGA的系統(tǒng)性學(xué)習(xí),從最基本的數(shù)字電路基礎(chǔ)開(kāi)始,最詳細(xì)操作步驟,最直白的言語(yǔ)描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業(yè)學(xué)生、初入職場(chǎng)小白及打算進(jìn)階提升的職業(yè)開(kāi)發(fā)者都可以有系統(tǒng)性學(xué)習(xí)的機(jī)會(huì)。


系統(tǒng)性的掌握技術(shù)開(kāi)發(fā)以及相關(guān)要求,對(duì)個(gè)人就業(yè)以及職業(yè)發(fā)展都有著潛在的幫助,希望對(duì)大家有所幫助。后續(xù)會(huì)陸續(xù)更新 Xilinx 的 Vivado、ISE 及相關(guān)操作軟件的開(kāi)發(fā)的相關(guān)內(nèi)容,學(xué)習(xí)FPGA設(shè)計(jì)方法及設(shè)計(jì)思想的同時(shí),實(shí)操結(jié)合各類操作軟件,會(huì)讓你在技術(shù)學(xué)習(xí)道路上無(wú)比的順暢,告別技術(shù)學(xué)習(xí)小BUG卡破腦殼,告別目前忽悠性的培訓(xùn)誘導(dǎo),真正的去學(xué)習(xí)去實(shí)戰(zhàn)應(yīng)用。話不多說(shuō),上貨。


SPI 協(xié)議驅(qū)動(dòng)設(shè)計(jì)


本篇實(shí)現(xiàn)基于叁芯智能科技的SANXIN -B01 FPGA開(kāi)發(fā)板,以下為配套的教程,如有入手開(kāi)發(fā)板,可以登錄官方淘寶店購(gòu)買(mǎi),還有配套的學(xué)習(xí)視頻。SANXIN-B01 Verilog教程-郝旭帥團(tuán)隊(duì)


SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫(xiě)。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,如今越來(lái)越多的芯片集成了這種通信協(xié)議。


SPI的通信原理很簡(jiǎn)單,它以主從方式工作,這種模式通常有一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備,中間靠三線或者四線連接(三線時(shí)為單向傳輸或者數(shù)據(jù)線雙向傳輸)。所有基于SPI的設(shè)備共有的,它們是MISO、MOSI、SCLK、CS。


MISO– Master Input Slave Output,主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出。


MOSI– Master Output Slave Input,主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入。


SCLK – Serial Clock,時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生。


CS – Chip Select,從設(shè)備使能信號(hào),由主設(shè)備控制。



cs是從芯片是否被主芯片選中的控制信號(hào),也就是說(shuō)只有片選信號(hào)為預(yù)先規(guī)定的使能信號(hào)時(shí)(高電位或低電位),主芯片對(duì)此從芯片的操作才有效。這就使在同一條總線上連接多個(gè)spi設(shè)備成為可能。



通訊是通過(guò)數(shù)據(jù)交換完成的,由sclk提供時(shí)鐘脈沖,mosi、miso則基于此脈沖完成數(shù)據(jù)傳輸。數(shù)據(jù)輸出通過(guò) mosi線,數(shù)據(jù)在時(shí)鐘上升沿或下降沿時(shí)改變,在緊接著的下降沿或上升沿被讀取。完成一位數(shù)據(jù)傳輸,輸入也使用同樣原理。因此,至少需要N次時(shí)鐘信號(hào)的改變(上沿和下沿為一次),才能完成N位數(shù)據(jù)的傳輸。


spi通信有四種不同的模式,不同的從設(shè)備可能在出廠時(shí)就已經(jīng)配置為某種模式。通信的雙方必須是工作在同一模式下,所以我們可以對(duì)主設(shè)備的spi模式進(jìn)行配置,通過(guò)CPOL(時(shí)鐘極性)和CPHA(時(shí)鐘相位)來(lái)控制我們主設(shè)備的通信模式。


mode0:CPOL=0,CPHA=0;

mode1:CPOL=0,CPHA=1;

mode2:CPOL=1,CPHA=0;

mode3:CPOL=1,CPHA=1;


時(shí)鐘極性CPOL是用來(lái)配置SCLK在空閑時(shí),應(yīng)該處于的狀態(tài);時(shí)鐘相位CPHA用來(lái)配置在第幾個(gè)邊沿進(jìn)行采樣。


CPOL=0,表示在空閑狀態(tài)時(shí),時(shí)鐘SCLK為低電平。

CPOL=1,表示在空閑狀態(tài)時(shí),時(shí)鐘SCLK為高電平。

CPHA=0,表示數(shù)據(jù)采樣是在第1個(gè)邊沿。

CPHA=1,表示數(shù)據(jù)采樣是在第2個(gè)邊沿。


即:

CPOL=0,CPHA=0:此時(shí)空閑態(tài)時(shí),SCLK處于低電平,數(shù)據(jù)采樣是在第1個(gè)邊沿,也就是SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。


CPOL=0,CPHA=1:此時(shí)空閑態(tài)時(shí),SCLK處于低電平,數(shù)據(jù)發(fā)送是在第1個(gè)邊沿,也就是SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。


CPOL=1,CPHA=0:此時(shí)空閑態(tài)時(shí),SCLK處于高電平,數(shù)據(jù)采集是在第1個(gè)邊沿,也就是SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。


CPOL=1,CPHA=1:此時(shí)空閑態(tài)時(shí),SCLK處于高電平,數(shù)據(jù)發(fā)送是在第1個(gè)邊沿,也就是SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。



硬件簡(jiǎn)介

FLASH閃存 的英文名稱是"Flash Memory",一般簡(jiǎn)稱為"Flash",它屬于內(nèi)存器件的一種,是一種非易失性( Non-Volatile )內(nèi)存。


在開(kāi)發(fā)板上有一塊flash(M25P16),用來(lái)保存FPGA的硬件配置信息,也可以用來(lái)存儲(chǔ)用戶的應(yīng)用程序或數(shù)據(jù)。




M25P16是一款帶有寫(xiě)保護(hù)機(jī)制和高速SPI總線訪問(wèn)的2M字節(jié)串行Flash存儲(chǔ)器,該存儲(chǔ)器主要特點(diǎn):2M字節(jié)的存儲(chǔ)空間,分32個(gè)扇區(qū),每個(gè)扇區(qū)256頁(yè),每頁(yè)256字節(jié);能單個(gè)扇區(qū)擦除和整片擦除;每扇區(qū)擦寫(xiě)次數(shù)保證10萬(wàn)次、數(shù)據(jù)保存期限至少20年。



C(serial clock:串行時(shí)鐘)為D和Q提供了數(shù)據(jù)輸入或者輸出的時(shí)序。D的數(shù)據(jù)總是在C的上升沿被采樣。Q的數(shù)據(jù) 在C的下降沿被輸出。


ˉS(Chip Select:芯片選擇端),當(dāng)輸入為低時(shí),該芯片被選中,可以允許進(jìn)行讀寫(xiě)操作。當(dāng)輸入為高時(shí),該芯片被釋放,不能夠進(jìn)行操作。


對(duì)于H——o——l——d——和W——, 為保持功能和硬件寫(xiě)保護(hù)功能,在本設(shè)計(jì)中不使用此管腳,在硬件設(shè)計(jì)時(shí),這兩個(gè)管腳全部被拉高了,即全部失效。


flash采用spi的通信協(xié)議,flash當(dāng)做從機(jī)。serial clcok等效于spi中的sclk,chip select等效于spi中的cs,D等效于spi中的mosi,Q等效于spi中的miso。


flash可以支持mode0和mode3,這兩種模式中,都是在時(shí)鐘的上升沿采樣,在時(shí)鐘的下降沿發(fā)送數(shù)據(jù)。



flash的每一頁(yè)都可以被寫(xiě)入,但是寫(xiě)入只能是把1改變?yōu)?。擦除可以把0改變?yōu)?。所以在正常寫(xiě)入數(shù)據(jù)之前,都要將flash進(jìn)行擦除。


flash的命令表如下:



下面介紹幾個(gè)常用的命令

RDID(Read Identification :讀ID):發(fā)送命令RDID(9F),然后接收第1個(gè)字節(jié)的memory type(20H),第二個(gè)字節(jié)的memory capacity(15H)。后續(xù)的字節(jié)暫不關(guān)心。



WREN(Write Enable :寫(xiě)使能):在任何寫(xiě)或者擦除的命令之前,都必須首先打開(kāi)寫(xiě)使能。打開(kāi)寫(xiě)使能為發(fā)送命令WREN(06h)。



RDSR(Read Status Register:讀狀態(tài)寄存器):發(fā)送命令RDSR(05h),然后返回一個(gè)字節(jié)的狀態(tài)值。



狀態(tài)寄存器的格式如下:



WIP(Write In Progress bit)表示flash內(nèi)部是否正在進(jìn)行內(nèi)部操作,寫(xiě)和擦除都會(huì)導(dǎo)致flash內(nèi)部進(jìn)行一段時(shí)間的工作,在內(nèi)部工作期間,外部的命令會(huì)被忽略,所以在進(jìn)行任何命令之前,都需要查看flash內(nèi)部是否正在工作。WIP為1時(shí),表示flash內(nèi)部正在工作;WIP為0時(shí),表示flash內(nèi)部沒(méi)有在工作。


READ(Read DATA Bytes:讀數(shù)據(jù)):發(fā)送命令READ(03H),后續(xù)發(fā)送3個(gè)字節(jié)的地址,然后就可以接收數(shù)據(jù),內(nèi)部的地址會(huì)不斷遞增。一個(gè)讀命令就可以把整個(gè)flash全部讀完。



PP(Page Program :頁(yè)編寫(xiě)):發(fā)送命令PP(02H),接著發(fā)送3個(gè)字節(jié)的地址,然后發(fā)送數(shù)據(jù)即可。切記所寫(xiě)的數(shù)據(jù)不能超過(guò)本頁(yè)的地址范圍。



SE(Sector Erase :扇區(qū)擦除):發(fā)送命令SE(D8H),接著發(fā)送3個(gè)字節(jié)的地址。



BE(Bulk Erase:整片擦除):發(fā)送命令BE(C7H)。



關(guān)于flash的其他的介紹,可以參考03_芯片手冊(cè)->FLASH->M25P16.pdf。

設(shè)計(jì)要求

設(shè)計(jì)flash(M25P16)控制器

設(shè)計(jì)分析

根據(jù)M25P16的數(shù)據(jù)手冊(cè)得知,其接口為spi接口,且支持模式0和模式3,本設(shè)計(jì)中選擇模式0。

輸入時(shí)序圖如下:



輸出時(shí)序如下:



時(shí)序圖中所對(duì)應(yīng)的符號(hào)說(shuō)明:



根據(jù)輸入和輸出的時(shí)序圖以及參數(shù)表,將SPI的時(shí)鐘的頻率定為10MHz。


在設(shè)計(jì)中,F(xiàn)PGA作為主機(jī),M25P16作為從機(jī)。


架構(gòu)設(shè)計(jì)和信號(hào)說(shuō)明

此模塊命名為m25p16_drive。



二級(jí)模塊(分模塊)(第一頁(yè))



二級(jí)模塊(分模塊)(第二頁(yè))




設(shè)計(jì)中,各個(gè)命令單獨(dú)寫(xiě)出控制器,通過(guò)多路選擇器選擇出對(duì)應(yīng)的命令,然后控制spi_8bit_drive將數(shù)據(jù)按照spi的協(xié)議發(fā)送出去。各個(gè)命令的脈沖通過(guò)ctrl模塊進(jìn)行控制各個(gè)命令控制器,寫(xiě)入的數(shù)據(jù)首先寫(xiě)入到寫(xiě)緩沖區(qū),讀出的數(shù)據(jù)讀出后寫(xiě)入到讀緩沖區(qū)。


暫不分配的端口,在應(yīng)用時(shí)都是由上游模塊進(jìn)行控制,本設(shè)計(jì)測(cè)試時(shí),編寫(xiě)上游模塊進(jìn)行測(cè)試。


各個(gè)模塊的功能,和連接線的功能在各個(gè)模塊設(shè)計(jì)中說(shuō)明。


spi_8bit_drive設(shè)計(jì)實(shí)現(xiàn)

本模塊負(fù)責(zé)將8bit的并行數(shù)據(jù)按照spi協(xié)議發(fā)送出去,以及負(fù)責(zé)按照spi協(xié)議接收數(shù)據(jù),將接收的數(shù)據(jù)(8bit)并行傳輸給各個(gè)模塊。


spi_send_en為發(fā)送數(shù)據(jù)使能信號(hào)(脈沖信號(hào)),spi_send_data為所要發(fā)送數(shù)據(jù),spi_send_done為發(fā)送完成信號(hào)(脈沖信號(hào))。


spi_read_en為接收數(shù)據(jù)使能信號(hào)(脈沖信號(hào)),spi_read_data為所接收的數(shù)據(jù),spi_read_done為接收完成信號(hào)(脈沖信號(hào))。



在發(fā)送邏輯控制中,全部的信號(hào)采用下降沿驅(qū)動(dòng)。利用外部給予的spi_send_en作為啟動(dòng)信號(hào),啟動(dòng)send_cnt。send_cnt在不發(fā)送數(shù)據(jù)時(shí)為8,發(fā)送數(shù)據(jù)時(shí),從0到7。


在接收邏輯中,全部的信號(hào)采用上升沿驅(qū)動(dòng)。利用外部給予的spi_read_en作為啟動(dòng)信號(hào),啟動(dòng)rec_en,經(jīng)過(guò)移位接收數(shù)據(jù)。


在spi_sclk輸出時(shí),采用組合邏輯。由于設(shè)計(jì)采用spi的模式0,故而spi_sclk不發(fā)送或者接收數(shù)據(jù)時(shí)為0,接收數(shù)據(jù)時(shí)為時(shí)鐘信號(hào)。因?yàn)橐鬄槟J?,所以在接收數(shù)據(jù)時(shí),spi_sclk的輸出不能夠先有下降沿,即要求spi_sclk的控制信號(hào)不能由上升沿信號(hào)驅(qū)動(dòng),所以將rec_en同步到下降沿的rec_en_n。


仿真代碼為:


在仿真中,將時(shí)鐘設(shè)置為10MHz。


所有的信號(hào)采用上升沿驅(qū)動(dòng)。發(fā)送一個(gè)8bit的隨機(jī)數(shù)值,接收一個(gè)8bit的隨機(jī)數(shù)值。


spi_miso信號(hào)為從機(jī)下降沿驅(qū)動(dòng)信號(hào)。


通過(guò)RTL仿真,可以看出發(fā)送和接收全部正常。


mux7_1設(shè)計(jì)實(shí)現(xiàn)

本模塊負(fù)責(zé)將7個(gè)命令模塊發(fā)出的命令(寫(xiě)使能、寫(xiě)數(shù)據(jù)和讀使能)經(jīng)過(guò)選擇發(fā)送給spi_8bit_drive模塊。


在設(shè)計(jì)中,有的命令模塊不需要進(jìn)行讀?。╬p和se等等),此時(shí)將輸出的讀使能信號(hào)輸出為低電平。


be設(shè)計(jì)實(shí)現(xiàn)

該模塊接收到be_en(整片擦除的脈沖信號(hào))信號(hào)后,發(fā)送對(duì)應(yīng)的使能和數(shù)據(jù),等待發(fā)送完成脈沖。發(fā)送完成后,輸出擦除完成的脈沖。


整片擦除的命令為8’hc7。


wren設(shè)計(jì)實(shí)現(xiàn)

該模塊接收到wren_en(打開(kāi)flash內(nèi)部的寫(xiě)使能的脈沖信號(hào))信號(hào)后,發(fā)送對(duì)應(yīng)的使能和數(shù)據(jù),等待發(fā)送完成脈沖。發(fā)送完成后,輸出擦除完成的脈沖。


打開(kāi)flash內(nèi)部寫(xiě)使能的命令碼為8’h06。


se設(shè)計(jì)實(shí)現(xiàn)

該模塊接收到se_en(擦除扇區(qū)的寫(xiě)使能的脈沖信號(hào))信號(hào)后,發(fā)送對(duì)應(yīng)的使能和數(shù)據(jù),等待發(fā)送完成脈沖。發(fā)送完成后,接著發(fā)送高八位地址,中間八位地址和低八位地址。全部發(fā)送完成后,發(fā)送se_done信號(hào)。


該模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。SE_STATE(扇區(qū)擦除命令發(fā)送)、H_ADDR(高八位地址發(fā)送)、M_ADDR(中間八位地址發(fā)送)、L_ADDR(低八位地址發(fā)送)、SE_DONE(扇區(qū)擦除完成)。所有的脈沖信號(hào)在未標(biāo)注的時(shí)刻,輸出全部為0。



設(shè)計(jì)代碼為:


在發(fā)送過(guò)程中,由于是每8bit發(fā)送一次,所以在時(shí)序上將看到發(fā)送時(shí),每8個(gè)脈沖一組,中間會(huì)有明顯的間隔。


pp設(shè)計(jì)實(shí)現(xiàn)

該模塊負(fù)責(zé)將外部寫(xiě)fifo中的數(shù)據(jù)寫(xiě)入到flash中。wr_fifo_rd為寫(xiě)fifo的讀使能信號(hào),wrdata為從寫(xiě)fifo中讀出的數(shù)據(jù),wr_len為需要寫(xiě)入flash中數(shù)據(jù)的長(zhǎng)度,wr_addr為寫(xiě)入地址。


該模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。PP_STATE(發(fā)送pp命令),H_ADDR(發(fā)送高八位地址)、M_ADDR(發(fā)送中間八位地址),L_ADDR(發(fā)送低八位地址)、RDFIFO(讀寫(xiě)fifo)、FIFO_WAIT(等待讀寫(xiě)fifo的數(shù)據(jù)輸出)、SEND(發(fā)送8bit數(shù)據(jù))、SEND_WAIT(發(fā)送等待,發(fā)送完成后判斷是否發(fā)送完成)。對(duì)于所有的脈沖信號(hào),沒(méi)有賦值的位置,全部賦值為0。


cnt為記錄已經(jīng)發(fā)送的數(shù)據(jù)個(gè)數(shù)。



設(shè)計(jì)代碼為:


rdsr設(shè)計(jì)實(shí)現(xiàn)

本模塊的功能為讀取m25p16的狀態(tài)寄存器,主要檢測(cè)狀態(tài)寄存器的最低位(WIP)。


WIP(write in progress :正在進(jìn)行寫(xiě)進(jìn)程),該bie位表示了flash內(nèi)部是否在進(jìn)行寫(xiě)進(jìn)程。如果處于寫(xiě)進(jìn)程時(shí),flash忽略外部所有的命令,所以建議在執(zhí)行任何命令前,首先進(jìn)行檢測(cè)該位。1表示正在寫(xiě)進(jìn)程中,0表示不處于寫(xiě)進(jìn)程。


如果檢測(cè)到正在寫(xiě)進(jìn)程中,進(jìn)行延遲1ms,然后再次讀取該位狀態(tài)。直到寫(xiě)進(jìn)程結(jié)束。


本模塊采用狀態(tài)機(jī)設(shè)計(jì)實(shí)現(xiàn)。ILDE(發(fā)送讀狀態(tài)寄存器命令)、RDSRSTATE(發(fā)送讀使能)、WIP(判斷wip位)、 DELAY1ms(延遲1ms)。cnt為延遲1ms的計(jì)數(shù)器。



設(shè)計(jì)代碼為:


rdid設(shè)計(jì)實(shí)現(xiàn)

該模塊負(fù)責(zé)讀取flash的ID(2015),驗(yàn)證ID的正確性。

該模塊采用狀態(tài)機(jī)的方式實(shí)現(xiàn)。IDLE(等待讀取ID的命令)、IDSTATE1(讀取高八位ID)、IDSTATE2(讀取中間八位ID)、IDSTATE3(讀取低八位ID)、ID_CHECK(檢測(cè)ID的正確性)。


狀態(tài)轉(zhuǎn)移圖如下:



設(shè)計(jì)代碼為:


read_ctrl設(shè)計(jì)實(shí)現(xiàn)

該模塊負(fù)責(zé)將flash的數(shù)據(jù)讀出,寫(xiě)入到輸出緩存中。


該模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。RD_STATE(等待讀命令)、H_ADDR(發(fā)送高八位地址)、M_ADDR(發(fā)送中間八位地址)、L_ADDR(發(fā)送低八位地址)、RDDATA(讀取數(shù)據(jù))、WRFIFO(將讀出的數(shù)據(jù)寫(xiě)入到FIFO中)、CHECK_LEN(判斷讀取的長(zhǎng)度)。


狀態(tài)轉(zhuǎn)移圖如下:



設(shè)計(jì)代碼為:


wr_fifo和rd_fifo調(diào)用

兩個(gè)fifo的寬度設(shè)置為8,深度設(shè)置為256,同步fifo,帶有復(fù)位。


ctrl設(shè)計(jì)實(shí)現(xiàn)

該模塊根據(jù)外部的命令,按照m25p16的執(zhí)行規(guī)則,進(jìn)行控制各個(gè)模塊的執(zhí)行。


該模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。INIT_RDSR(讀WIP),INIT_RDID(讀ID),INIT_ID(判斷ID),WIP(讀WIP),WIP_DONE(等待WIP),IDLE(空閑狀態(tài)),**STATE(執(zhí)行對(duì)應(yīng)的命令),**WREN(打開(kāi)flash的寫(xiě)使能)。在進(jìn)行任何命令前,都檢查wip。


狀態(tài)轉(zhuǎn)移圖如下:



在不同的狀態(tài),mux_sel選擇對(duì)應(yīng)的命令通過(guò)。


drive_busy只有在IDLE狀態(tài)才是低電平。


spi_cs_n信號(hào), DLE狀態(tài)為高電平、WIP_DONE(INIT_RDID)中spi_read_done信號(hào)為高時(shí) (保證能夠多次讀取狀態(tài)寄存器)、在其他狀態(tài)發(fā)生切換時(shí),spi_cs_n 為高電平,否則為低電平。


設(shè)計(jì)代碼為:

m25p16_drive設(shè)計(jì)實(shí)現(xiàn)

本模塊負(fù)責(zé)連接所有二級(jí)模塊,實(shí)現(xiàn)所有的功能。


RTL仿真

本次設(shè)計(jì)涉及到讀取flash的id以及狀態(tài)寄存器,所以在仿真時(shí)需要加入仿真模型。仿真模型放在msim的m25p16_sim_module中。m25p16為仿真模型的頂層文件。


由于讀寫(xiě)和擦除的時(shí)間較長(zhǎng),RTL仿真中,將只仿真RDSR和RDID,其他的功能測(cè)試在板級(jí)測(cè)試時(shí)進(jìn)行。


仿真代碼如下:


在設(shè)置testbench時(shí),注意將所有文件全部添加到文件中。



選擇testbench時(shí),注意選中設(shè)置的m25p16_drive_tb。



利用modelsim仿真,可以得出如下RTL仿真波形。



讀到ID,以及檢測(cè)WIP都是正確的。


板級(jí)測(cè)試

由于m25p16的時(shí)序原因,整個(gè)設(shè)計(jì)工作在10MHz(利用PLL產(chǎn)生)。


在進(jìn)行測(cè)試控制時(shí),對(duì)最后一個(gè)扇區(qū)進(jìn)行擦除;對(duì)最后一個(gè)扇區(qū)的第一頁(yè)進(jìn)行寫(xiě)入數(shù)據(jù)100個(gè)(1至100);對(duì)最后一個(gè)扇區(qū)的第一個(gè)進(jìn)行讀取,驗(yàn)證數(shù)據(jù)是否為1至100。

測(cè)試的控制模塊命名為test_ctrl。


此模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。WRFIFO(將1至100寫(xiě)入wrfifo中)、SE(扇區(qū)擦除)、PP(寫(xiě)入flash)、RD(讀出flash)、WAIT_RD(等待讀?。?、CHECK( 檢測(cè)讀出的數(shù)據(jù)的正確性)。



設(shè)計(jì)代碼為:


將test模塊設(shè)置為頂層。在test模塊中,m25p16_drive例化中,對(duì)于整片擦除不做控制,對(duì)于addr直接指向最后一個(gè)扇區(qū)的第一頁(yè),len指定為100。


代碼為:


由于開(kāi)發(fā)板上的flash是為FPGA進(jìn)行保存配置信息的,所以管腳都連接在專用管腳上,本次實(shí)驗(yàn)需要將這專用管腳配置為普通io。


右擊器件型號(hào),選擇device。



點(diǎn)擊device and pin options。



選擇Dual-purpose pins,將其中所有的功能改為普通IO。



點(diǎn)擊ok后,即可進(jìn)行綜合分析。


連接開(kāi)發(fā)板和PC,打開(kāi)邏輯分析儀。


采樣時(shí)鐘選擇10MHz(PLL 的c0),采樣深度設(shè)置為2K。



觀測(cè)信號(hào)如下圖所示。



首先將wrfifo_wr的觸發(fā)條件設(shè)置為上升沿。點(diǎn)擊觸發(fā)后,按下復(fù)位按鍵。觸發(fā)后,可以看到寫(xiě)入數(shù)據(jù)1至100后,然后進(jìn)行SE命令。



將rdfifo_rd的觸發(fā)條件設(shè)置為上升沿(將wrfifo_wr觸發(fā)條件修改為donot care)。點(diǎn)擊觸發(fā)后,按下復(fù)位按鍵。



通過(guò)仿真和下板實(shí)測(cè),驗(yàn)證控制器設(shè)計(jì)正確。






聲明本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請(qǐng)注明以上來(lái)源。如需社區(qū)合作及入群交流,請(qǐng)?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


更多熱點(diǎn)文章閱讀

  • 基于Cortex-M3內(nèi)核的32位微控制器STM32項(xiàng)目實(shí)戰(zhàn)分享!

  • 基于32位RISC-V設(shè)計(jì)的互聯(lián)型微控制器,沁恒微CH32V307開(kāi)發(fā)樣例

  • RK3568!四核64位ARMv8.2A架構(gòu),匯聚編譯源碼及實(shí)戰(zhàn)樣例

  • 尺寸僅有21mm*51mm,板邊采用郵票孔設(shè)計(jì),合宙 Air105 核心板開(kāi)發(fā)總結(jié)

  • 嵌入式Linux開(kāi)發(fā)秘籍!工程師大佬親歷分享項(xiàng)目樣例


原文標(biāo)題:【教程分享】FPGA零基礎(chǔ)學(xué)習(xí):SPI 協(xié)議驅(qū)動(dòng)設(shè)計(jì)

文章出處:【微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:【教程分享】FPGA零基礎(chǔ)學(xué)習(xí):SPI 協(xié)議驅(qū)動(dòng)設(shè)計(jì)

文章出處:【微信號(hào):gh_9b9470648b3c,微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    零基礎(chǔ)學(xué)習(xí)LuatOS編程:快速上手開(kāi)發(fā)實(shí)戰(zhàn)教程!

    無(wú)論你是剛接觸物聯(lián)網(wǎng)編程的新手,還是希望拓展技能的技術(shù)愛(ài)好者,本教程將為零基礎(chǔ)的讀者提供一條清晰的LuatOS學(xué)習(xí)路徑。從安裝開(kāi)發(fā)工具到編寫(xiě)第一個(gè)程序,我們將通過(guò)實(shí)例講解核心概念,助你快速實(shí)現(xiàn)從理論
    的頭像 發(fā)表于 06-13 17:27 ?208次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)<b class='flag-5'>學(xué)習(xí)</b>LuatOS編程:快速上手開(kāi)發(fā)實(shí)戰(zhàn)教程!

    【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+讀《零基礎(chǔ)開(kāi)發(fā)AI Agent》掌握扣子平臺(tái)開(kāi)發(fā)智能體方法

    收到發(fā)燒友網(wǎng)站寄來(lái)的《零基礎(chǔ)開(kāi)發(fā)AI Agent》這本書(shū)已經(jīng)有好些天了,這段時(shí)間有幸拜讀了一下全書(shū),掌握了一個(gè)開(kāi)發(fā)智能體的方法。 該書(shū)充分從零基礎(chǔ)入手,先闡述了Agent是什么,它的基本概念和知識(shí)
    發(fā)表于 05-14 19:51

    【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+ 入門(mén)篇學(xué)習(xí)

    很高興又有機(jī)會(huì)學(xué)習(xí)ai技術(shù),這次試讀的是「零基礎(chǔ)開(kāi)發(fā)AI Agent」,作者葉濤、管鍇、張心雨。 大模型的普及是近三年來(lái)的一件大事,萬(wàn)物皆可大模型已成為趨勢(shì)。作為大模型開(kāi)發(fā)應(yīng)用中重要組成部分,提示詞
    發(fā)表于 05-02 09:26

    零基礎(chǔ)學(xué)習(xí)一階RC低通濾波器(從原理到實(shí)踐)

    *附件:零基礎(chǔ)學(xué)習(xí)一階RC低通濾波器(從原理到實(shí)踐).docx
    發(fā)表于 03-26 14:35

    零基礎(chǔ)開(kāi)發(fā)AiPi-Eyes-S1——通過(guò)屏幕輸入連接Wi-Fi

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 01-15 09:27 ?708次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)AiPi-Eyes-S1——通過(guò)屏幕輸入連接Wi-Fi

    Vivado Tcl零基礎(chǔ)入門(mén)與案例實(shí)戰(zhàn)【高亞軍編著】

    Vivado Tcl零基礎(chǔ)入門(mén)與案例實(shí)戰(zhàn)-高亞軍編寫(xiě)
    發(fā)表于 01-14 11:13

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1——初識(shí)LVGL并搭建最小工程

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 01-03 14:09 ?908次閱讀

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇——DAC

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 12-27 10:55 ?1198次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇——DAC

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——I2S

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 12-13 18:02 ?1635次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——I2S

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——FLASH

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 12-05 14:31 ?740次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——FLASH

    零基礎(chǔ)入門(mén)PCB工程師

    各位前輩大家好,零基礎(chǔ)入門(mén)PCB工程師,有什么學(xué)習(xí)資料推薦嗎?
    發(fā)表于 11-27 16:54

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇 ——I2C

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 11-27 16:39 ?846次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇 ——I2C

    零基礎(chǔ)嵌入式開(kāi)發(fā)學(xué)習(xí)路線

    “嵌入式開(kāi)發(fā)”沒(méi)有接觸過(guò)的同學(xué)可能會(huì)不明覺(jué)厲,但是只要你了解了,感興趣并且有一個(gè)正確的學(xué)習(xí)路線的話,零基礎(chǔ)也能入門(mén)。給大家介紹一個(gè)簡(jiǎn)單易懂的學(xué)習(xí)路線,讓你能夠從開(kāi)始
    發(fā)表于 10-25 15:55

    零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——GPIO 輸入輸出

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。 從開(kāi)始學(xué)習(xí)小安派: 1、零基
    的頭像 發(fā)表于 10-25 13:50 ?1465次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——GPIO 輸入輸出

    DS1302芯片與FPGA之間SPI通信原理

    本文通過(guò)以DS1302芯片為基礎(chǔ),介紹該芯片與FPGA之間SPI通信原理,詳細(xì)描述硬件設(shè)計(jì)原理及FPGA SPI接口驅(qū)動(dòng)設(shè)計(jì)。
    的頭像 發(fā)表于 10-24 14:16 ?1559次閱讀
    DS1302芯片與<b class='flag-5'>FPGA</b>之間<b class='flag-5'>SPI</b>通信原理