文章目錄
1、存儲芯片分類
2、NOR Flash 與NAND Flash的區別
3、什么是SD卡?
4、什么是SD NAND?
5、SD NAND的控制時序
6、FPGA實現SD NAND讀寫
6.1、設計思路
6.2、仿真結果
6.3、實驗結果
1、存儲芯片分類
目前市面上的存儲芯片,大致可以將其分為3大類:
① EEPROM
EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程只讀存儲器,是一種掉電后數據不丟失的存儲芯片。EEPROM 可以在電腦上或專用設備上擦除已有信息,重新編程。
這類產品容量小,讀取速度慢,且無法在應用過程中寫入數據,十分不便。目前多存在于一些MCU內部,如遙控器,電風扇等各類低端、低速消費類產品。相信你讀大學如果玩單片機的話,那么應該是不陌生。
② NOR Flash
NOR Flash由Intel在1988年發明,是市場上兩種主要的非易失閃存技術之一。NOR Flash 技術的出現,徹底改變了原先由EPROM和EEPROM一統天下的局面。
NOR Flash可能是目前應用領域最廣泛的一種存儲芯片了,基本上主流的電子產品里都有使用,比如手機攝像頭內部,或者屏幕驅動電路板。主要用來存儲代碼和一些比較小的數據文件。NOR Flash架構決定了它的容量不能做大,而且讀取速度比較慢。好處在于簡單易用,其接口可以實現地址尋址,也就意味著可以做到直接對某個地址直接操作,而不需要建立額外的文件系統。
③ NAND Flash
雖然很多人平常說的Flash 存儲器一半默認其就是NOR Flash ,但這無疑是不嚴謹的。FLASH產品可以分為兩個大類:NOR Flash 和 NAND Flash 。
NAND Flash 是市場上兩種主要的非易失閃存技術之一,由東芝公司在1989年發明。其強調降低每比特的成本,并擁有更高的性能,可以像磁盤一樣可以通過接口輕松升級。
NAND Flash應該是目前最熱門的存儲芯片了。因為我們生活中經常使用的電子產品都會涉及到它。比如你買手機,肯定會考慮64GB,還是256GB?買筆記本是買256GB,還是512GB容量的硬盤呢?(目前電腦大部分采用了基于NAND Flash產品的固態硬盤)
2、NOR Flash 與 NAND Flash的區別
Flash 閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進行擦寫和再編程。任何Flash 器件的寫入操作都只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。
執行擦除時塊尺寸的不同進一步拉大了NOR和NAND之間的性能差距,統計表明,對于給定的一套寫入操作(尤其是更新小文件時),更多的擦除操作必須在基于NOR的單元中進行。這樣,當選擇存儲解決方案時,用戶必須權衡以下因素:
NOR Flash支持隨機訪問,所以支持XIP(execute In Place),NAND Flash需要按塊進行讀取,所以不支持XIP
NAND FLASH理論讀取速度與NOR Flash相近,實際情況會根據接口不同有些差異
NOR 與 NAND 寫入前都需要先擦除,NOR在擦除時以64~128KB的塊進行,執行一個寫入/擦除操作的時間約5s,NAND在擦除時以8~32KB的塊進行,執行一個寫入/擦除操作的時間約4ms
NAND 理論最大擦除次數比NOR多
NOR 驅動比NAND簡單,NAND FLASH需要通過專門的NFI(NAND FLASH Interface)與Host端進行通信,驅動相對復雜
所有Flash 都會有位反轉的問題,NAND 位反轉概率要比NOR高,NAND Flash 必須要使用ECC
NAND的單元尺寸幾乎是NOR器件的一半,所以NAND成本更低
NOR 與 NAND 各有特點,應用場景與應用難度也不同,一般來講,NOR適用于小容量、略低速且需要直接對地址塊進行操作的應用,而NADN則適用于大容量的高速應用。SD NAND 在保留了NAND架構優質特性的同時改進了不足之處,內置的控制器能自行管理NAND Flash,無需在外部處理ECC和進行壞塊管理,免去了MTD層,不需要寫繁瑣的驅動代碼。
3、什么是SD卡?
①概述
SD卡的英文全稱是Secure Digital Card,即安全數字卡(又叫安全數碼卡),是在MMC 卡(Multimedia Card,多媒體卡)的基礎上發展而來,主要增加了兩個特色:更高的安全性和更快的讀寫速度。
②容量標準和速度等級
若按照容量 對 SD 卡進行等級劃分,SD 卡可分為 4 個等級,SD(Secure Digital Card,安全數字卡) 卡、SDHC 卡(Secure Digital High Capacity,高容量安全數字卡)、SDXC 卡( SD eXtended Capacity,容量擴大化的安全數字卡)和 SDUC(Secure Digital Ultra Capacity,超 容量安全數字卡)。現今,市場的主流 SD 產品是 SDHC 和 SDXC 這兩種較大容量的存儲 卡,SD 卡因容量過小,已逐漸被市場淘汰,SDUC 則是容量太大,預計會出現在未來市 場。SD 卡的四種容量標準,具體見下圖:
不同品牌和廠商生產的 SD 卡在對存取速度上的定義標準不同,這會使用戶在選擇 SD卡時產生困擾。所以 SD 協會根據視頻勻速寫入到 SD 卡的最低持續速度來劃分不同等級, 每個等級的速率是以每秒傳輸多少 MB 來衡量的,單位為 MB/S。
SD 協會定義了三種速度等級:速度等級、UHS 速度等級與視頻速度等級。三種速度等級的具體傳輸速度如下圖:
4、什么是SD NAND?
上文中提到的SD卡其實更應該叫做TF卡,在日常生活中最常見的應用就是數碼相機的存儲卡。因為它是可拆卸的,所以這類SD卡最大的優點就是便攜方便,但同時也有容易丟失和接觸不良等毛病,所以多用于消費類產品。
在工業級應用中,更多見的是一類貼片式的SD NAND產品,俗稱貼片式T卡或貼片式SD卡。雖然SD NAND 和TF卡稱呼上有些類似,但是SD NAND和TF卡有著本質上的區別:
為什么SD NAND和 TF卡 之間有這么大區別呢?因為 SD NAND是為內置存儲而生,是焊接在PCB板上的,是針對工業級應用的產品,所以品質穩定、一致性高、使用穩定性高、同時尺寸也小。而TF卡主要是針對普通消費者,品質和一致性、使用穩定性等相對要求不高,再加上國內魚龍混雜的市場環境,導致內置存儲用TF卡的品質風險高。
NAND Flash產品的一個特質就是它的品質并不是0和1這么簡單,有些品質隱患是使用一段時間之后才被發現,如果這個產品已經銷往海外,處理起來會變得異常麻煩。使用SD NAND可以為客戶產品帶來整體品質的提升,提供確定性,是客戶產品良好品牌和口碑的穩定基石。而使用TF卡時,產品整機不可控因素會增高,比如常見的卡座老化松動、TF觸點氧化、TF卡遺失、抗震性能減退等等。綜上所述,雖然SD NAND與TF卡使用的協議相同,但從外觀到內在都有區別。正在使用TF卡的客戶需要提升產品穩定性及耐用性時,SD NAND 是絕佳選擇。
盡管 SD NAND和 TF卡之間有著這么大的區別,但具體到實際應用,其對外接口和驅動程序都是一樣了,這說明可移植性非常好。
① 物理結構
SD NAND從物理結構看包括 5 個部分,分別為存儲單元、存儲單元接口、電源檢測、卡及接口控制器和對外接口,具體見下圖。
存儲單元是存儲數據部件,存儲單元通過存儲單元接口與卡控制單元進行數據傳輸
存儲單元接口是接口控制器與存儲單元的數據交互通道
電源檢測單元保證 SD NAND工作在合適的電壓下,如出現掉電或上電狀態時,它會使控制單元和存儲單元接口復位
卡及接口控制單元控制 SDNAND的運行狀態,它包括 8 個寄存器
對外接口單元控制 SD NAND引腳的輸入輸出,一般包含SDIO接口和SPI接口
② 對外接口
SD NAND共有 9 個引腳,其中包括 3 根電源線、1 根時鐘線、1 根命令線和 4根數據線。如下:
CLK:同步時鐘線,由主機產生,即由主控制器(FPGA)輸出; 使用 SPI 模式 時,該引腳與 SPI 總線的 SCK 時鐘信號相連
CMD:命令控制線, SDIO 主機通過該線發送命令控制 SD NAND,如果命令要求 SD NAND 提供應答(響應), SD NAND也是通過該線傳輸應答信息; 使用 SPI 模式時,該引腳與 SPI總線的 MOSI 信號相連, SPI 主機通過它向 SD NAND發送命令及數據,但因為 SPI 總線 的 MOSI 僅用于主機向從機輸出信號,所以 SD NAND返回應答信息時不使用該信號線;
DAT0-3:在 SDIO 模式下,它們均為數據線,傳輸讀寫數據, SD NAND可將 D0 拉低表 示忙狀態; 在 SPI 模式下, DAT0 與 SPI 總線的 MISO 信號相連, SD NAND通過該信號線向主機發送數據或響應, DAT3 與總線的 CS 信號相連, SPI 主機通過該信號線選擇要通訊的 SD NAND。
VDD、VSS1、VSS2:電源和地信號。
③ 工作模式
SD NAND有兩種工作模式:SDIO 模式與SPI模式
在 SDIO 模式下,SD NAND共使用到 CLK、CMD、DAT[3:0] 6根信號線;SDIO 總線與多個 SD NAND連接時,可以共用 CLK 時鐘信號線,對于 CMD、DAT[3:0]信號線,每個 SD NAND都要獨立連接。SDIO 總線與 SD 卡連接方式,具體見下圖。此模式使用IO引腳多,但傳輸速度高。
在 SPI 模式下,SD NAND共使用到 CS(DAT[3])、CLK、MISO(DAT[0])、MOSI(CMD) 4根信號線;SPI 總線與多個 SD NAND連接時,除 CS 片選信號線不可共用外,其他信號均可公用。SPI 總線與 SD NAND連方式,具體見下圖。此模式使用IO引腳少,但傳輸速度慢。
④ 內部寄存器
SD NAND總共有 8 個寄存器,用于設定或表示 SD NAND信息,寄存器描述具體見下圖。 這些寄存器只能通過對應的命令訪問,對 SD NAND的控制操作是通過命令來執行的, SD NAND定義了 64 個命令(部分命令不支持 SPI 模式) ,每個命令都有特殊意義,可以實現某一特定功能, SD NAND接收到命令后,根據命令要求對 SD NAND內部寄存器進行修改,程序控制中只需要發送組合命令就可以實現 SD NAND的控制以及讀寫操作。
內部寄存器就不展開講了,我們用FPGA實現讀寫測試也不需要了解那么多寄存器。
5、SD NAND的控制時序
① 命令與讀寫時序
SD NAND的通信是基于命令和數據傳輸的。通訊由一個起始位(“0”)開始,由一個停止位(“1”)終止。SD NAND通信一般是主機發送一個命令(Command),從設備在接收到命令后作出響應(Response),如有需要會有數據(Data)傳輸參與。SD NAND的基本交互是命令與響應交互, 見下圖:
SD NAND數據是以塊(Block)形式傳輸的,SDHC 規格數據塊長度一般為 512 字節,數據可以從主機到芯片,也可以是從芯片到主機。數據塊需要 CRC 位來保證數據傳輸成功,CRC 位由 SD NAND系統硬件生成。單個數據塊的讀、寫時序分別見下2圖:
讀寫操作都是由主機發起的,主機發送不同的命令表示讀或寫, SD NAND接收到命令后先針對命令返回響應。在讀操作中, SD NAND返回一個數據塊,數據塊中包含 CRC校驗碼;在寫操作中,主機接收到命令響應后需要先發送一個標志(TOKEN)然后緊跟一個要寫入的數據塊,SD NAND接收完數據塊后會返回一個數據響應及忙碌標志,當 SD NAND把接收到的數據寫入到內部存儲單元完成后,會停止發送忙碌標志,主機確認 SD NAND空閑后,才可以發送下一個命令。
SD NAND數據傳輸支持單塊和多塊讀寫,它們分別對應不同的操作命令, 結束多塊讀寫時需要使用命令來停止操作。
② 命令格式
SD NAND命令由主機發出,命令格式固定為 48bit,通過 CMD 信號線連續傳輸。SD NAND命令格式,具體見下圖:
起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個數據位,起始位為 0,終止位為 1。
傳輸標志:用于區分傳輸方向,該位為 1 時表示命令,方向為主機傳輸到 SD NAND,該位為 0 時表示響應,方向為 SD NAND傳輸到主機。命令主體內容包括命令、地址信息/參數和 CRC 校驗三個部分。
命令號:它固定占用 6bit,所以總共有 64 個命令,每個命令都有特定的用途,部分命令不適用于 SPI 總線,或不適用于 SD NAND操作,只是專門用于 MMC 卡或者 SD I/O卡。
地址/參數:每個命令有 32bit 地址信息/參數用于命令附加內容,例如,廣播命令沒有地址信息,這 32bit 用于指定參數,而尋址命令這 32bit 用于指定目標 SD NAND的地址, 當使用 SDIO 驅動多個 SD NAND時,通過地址信息區分控制不同的SD NAND,使用 SPI 總線驅動時,通過片選引腳來選擇不同的SD NAND,所以使用這些命令時地址可填充任意值。
CRC7 校驗:長度為 7bit 的校驗位用于驗證命令傳輸內容正確性,如果發生外部干擾 導致傳輸數據個別位狀態改變將導致校準失敗,也意味著命令傳輸失敗, SD NAND不執行命令。 使用 SDIO 驅動時,命令中必須包含正確的 CRC7 校驗值;而使用 SPI 驅動時,命令中的 CRC7 校驗默認是關閉的,即這 CRC7 校驗位中可以寫入任意值而不影響通訊,僅在發送 CMD0 命令時需要強制帶標準的 CRC7 校驗。
③ 命令內容
SD NAND命令可分為標準命令 (如 CMD0)和特殊應用命令 (如 ACMD41),其中特殊應用命令只有在先寫入 CMD55 命令后才能被識別。按照指令類型又可將 SD NAND命令分為基本命令、數據塊寫命令、數據塊讀命令、擦除命令等 12 種(class0 ~ class11)。
本次實驗將會使用 SPI 模式實現 SD NAND的數據讀寫操作,所以接下來只列舉 SPI 模式下常用的 SD 卡命令,具體見下表:
SPI 模式下,上述各命令中,命令 CMD0 的 CRC7 校驗為固定的 1001_010;命令CMD8 的 CRC7 校驗為固定的 1000_011;其他命令的 CRC7 校驗在 SPI 模式下無作用,賦值為 1111_111 即可。
④ 響應格式
當 SD NAND接收到命令時,會向 SD NAND回傳命令響應。SD NAND有 5 種類型的命令響應:R1、R1b、R2、R3、R7;SDIO NAND還支持另外兩種命令響應:R4、R5。下文只對部分響應做介紹。
R1 響應格式,具體見下圖:
in idle state:當該位為 1 時,表示 SD NAND處于空閑狀態
erase reset:因為接收到無需擦除操作的命令,擦除操作被復位
illegal command:接收到一個無效的命令代碼
com crc error:接收到的上一個命令的 CRC 校驗錯誤
erase sequence error:擦除命令的控制順序錯誤
address error:讀寫的數據地址不對齊(數據地址需要按塊大小對齊)
parameter error:命令的參數錯誤
R3 響應格式,具體見下圖:
R3 響應包括 5 個字節,首先返回的第 1 個字節內容為 R1,剩下的其余字節為 OCR( Operation Conditions Register, 操作條件寄存器)寄存器的內容。
R7 響應格式,具體見下圖:
R7 響應包括 5 個字節,首先返回的第 1 個字節內容為 R1,R7 [31:28]位為命令版本,R7[27:12]為保留位,R7[11:8]為反饋的電壓范圍,最后 1 個字節為檢查模式。
6、FPGA實現SD NAND讀寫
接下來編寫FPGA的Verilog代碼實現向SD NAND的指定扇區中寫入512個字節的數據,寫完后將數據讀出,并通過指示燈的方式驗證數據是否被正確讀寫。需要說明的是,后文的讀寫操作均采用SPI模式。
6.1、設計思路
① 上電時序
SD NAND同其他的許多芯片一樣上電后需要保持一定的時間以便維持電壓穩定,這個時間通常是74+個時鐘周期,一般實際應用中可設置參數為74~100。只有經過這個過渡時間后,才可以執行后續的SD NAND初始化操作。
② 初始化時序
SD NAND在正常讀寫操作之前,必須先對SD NAND進行初始化,使其工作在預期的工作模式。初始化流程如下:
1.SD NAND完成上電后,主機FPGA先對從機SD NAND發送至少74個以上的同步時鐘,在上電同步期間,片選CS引腳和MOSI引腳必須為高電平(MOSI引腳除發送命令或數據外,其余時刻都為高電平);
2.拉低片選CS引腳,發送命令CMD0(0x40)復位SD NAND,命令發送完成后等待SD NAND返回響應數據;
3.SD NAND返回響應數據后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應數據。如果返回的數據為復位完成信號0x01,在接收返回信息期間片選CS為低電平, 此時SD NAND進入SPI模式,并開始進行下一步,如果返回的值為其它值,則重新執行第2步;
4.拉低片選CS引腳,發送命令CMD8(0x48)查詢SD NAND的版本號,只有SD2.0版本才支持此命令,命令發送完成后等待SD NAND返回響應數據;
5.SD NAND返回響應數據后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應數據。如果返回的電壓范圍為4’b0001即2.7V~3.6V,說明2.0版本,進行下一步,否則重新執行第4步;
6.拉低片選CS引腳,發送命令CMD55(0x77)告訴SD NAND下一次發送的命令是應用相關命令,命令發送完成后等待SD NAND返回響應數據;
7.SD NAND返回響應數據后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應數據。如果返回的數據為空閑信號0x01,開始進行下一步,否則重新執行第6步。
8.拉低片選CS引腳,發送命令ACMD41(0x69)查詢SD NAND是否初始化完成,命令發送完成后等待SD NAND返回響應數據;
9.SD NAND返回響應數據后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應數據。如果返回的數據為0x00,此時初始化完成,否則重新執行第6步。
③ 寫操作時序
至此,SD NAND完成了復位以及初始化操作,進入到SPI模式的讀寫操作。SD NAND讀寫一次的數據量必須為512字節的整數倍,即對SD NAND讀寫操作的最少數據量為512 個字節。我們可以通過命令CMD16來配置單次讀寫操作的數據長度,以使每次讀寫的數據量為 (n*512)個字節(n≥1),本次SD NAND的讀寫操作使用默認配置,即單次讀寫操作的數據量為512個字節。
SD NAND的寫操作時序圖如下圖所示:
拉低片選信號 CS_N,向 SD NAND寫入命令 CMD24,命令號為 0x58,攜帶參數為 4字節的 SD NAND寫扇區地址,CRC 校驗字節未使用直接寫入 0xFF,命令發送完成后 等待 SD NAND返回響應數據
若 SD NAND返回正確響應數據 R1 為 0x00,等待 8 個時鐘周期,向 SD NAND寫入令牌0xFE,緊隨其后寫入 512 個字節的數據
數據發送完成后,再向 SD NAND寫入 2 個字節的 CRC 校驗字節。SPI 模式下不對數據進行 CRC 校驗,直接寫入兩個字節的 0xFF
校驗數據發送完成后, SD NAND會有響應數據返回,隨后 SD NAND將 Miso 信號拉低進入寫忙狀態
MISO 信號再次拉高后 SD NAND退出寫忙狀態,等待 8 個時鐘周期后拉高片選信號,SD NAND數據寫操作完成,可以執行其它操作
④ 讀操作時序
SD NAND的讀操作時序圖如下圖所示:
1.拉低片選信號 CS_N, 向 SD NAND寫入命令 CMD17,命令號為 0x51,攜帶參數為 4字節的 SD NAND讀扇區地址,CRC 校驗字節未使用直接寫入 0xFF,命令發送完成后 等待 SD NAND返回響應數據
2.若 SD NAND返回正確響應數據 R1 為 0x00,以 SD NAND返回的數據頭 0xFE 為標志,接收自 SD NAND讀出的 512 字節數據和 2 字節的 CRC 校驗字節
3.解析到數據頭 0xFE 后,接下來接收 SD NAND返回的 512 個字節的數據
4.數據解析完成后,接下來接收2個字節的 CRC 校驗值。 由于 SPI 模式下不對數據進行 CRC 校驗,可直接忽略這兩個字節
5.CRC 校驗字節接收完畢,等待 8 個時鐘周期,拉高片選信號 CS_N,一次數據讀操作完成
⑤ 程序設計
通過前面介紹的SD NAND初始化、寫操作以及讀操作可知,SD NAND的這3個操作是相互獨立且不能同時進行的,因此我們可以將SD NAND的初始化、寫操作以及讀操作分別劃分為3個獨立的模塊,最后將這三個模塊例化在SD NAND的控制器模塊中,便于在其它工程項目中使用。
下圖是系統框圖,PLL時鐘模塊(PLL)為各個模塊提供驅動時鐘,SD NAND測試數據產生模塊產生測試數據寫入SD NAND,寫完后從SD NAND中讀出數據,最終讀寫測試結果由LED顯示模塊通過控制LED燈的顯示狀態來指示。
頂層模塊:頂層模塊完成了對其它四個模塊的例化,SD NAND測試數據產生模塊產生的開始寫入信號及數據連接至SD NAND控制器模塊,數據寫完后從SD NAND控制器中讀出數據, 并驗證數據的正確性,將驗證的結果連接至LED顯示模塊。
PLL時鐘模塊:PLL時鐘模塊通過調用鎖相環(PLL)IP核來實現,總共輸出2個時鐘,頻率都是50Mhz,但兩個時鐘相位相差180度。我們知道,SD卡的SPI通信模式為CPOL=1, CPHA=1;即SPI_CLK在空閑時為高電平,數據發送是在時鐘的第一個邊沿,也就是SPI_CLK由高 電平到低電平的跳變,所以數據采集是在上升沿,數據發送是在下降沿。為了在程序代碼中統 一使用上升沿,我們使用兩個相位相差180度的時鐘來對SD NAND進行操作。
SD NAND測試數據產生模塊:SD NAND測試數據產生模塊產生的開始寫入信號和數據寫入SD NAND控制器模塊中,數據寫完后從SD NAND控制器中讀出數據,并驗證數據的正確性,將驗證的結果發送給LED顯示模塊。
SD NAND控制器模塊:SD NAND控制器模塊例化了SD NAND初始化模塊、 SD NAND寫數據模塊和SD NAND讀數據模塊。SD NAND初始化模塊完成對SD NAND的上電初始化操作;SD NAND寫數據模塊完成對SD NAND的寫操作;SD NAND讀數據模塊完成對SD NAND的讀操作。 由于這三個模塊都操作了SD NAND的引腳信號,且這三個模塊在同一時間內不會同時操作,所以此模塊實現了對其它三個模塊的例化以及選擇SD NAND的引腳連接至其中某一個模塊。
LED顯示模塊:LED顯示模塊將SD NAND測試數據產生模塊輸出的驗證結果值, 通過控制LED燈的顯示狀態來指示。
SD NAND控制器部分代碼如下:
module sd_ctrl_top(
input clk_ref , //時鐘信號
input clk_ref_180deg, //時鐘信號,與clk_ref相位相差180度
input rst_n , //復位信號,低電平有效
//SD卡接口
input sd_miso , //SD卡SPI串行輸入數據信號
output sd_clk , //SD卡SPI時鐘信號
output reg sd_cs , //SD卡SPI片選信號
output reg sd_mosi , //SD卡SPI串行輸出數據信號
//用戶寫SD卡接口
input wr_start_en , //開始寫SD卡數據信號
input [31:0] wr_sec_addr , //寫數據扇區地址
input [15:0] wr_data , //寫數據
output wr_busy , //寫數據忙信號
output wr_req , //寫數據請求信號
//用戶讀SD卡接口
input rd_start_en , //開始讀SD卡數據信號
input [31:0] rd_sec_addr , //讀數據扇區地址
output rd_busy , //讀數據忙信號
output rd_val_en , //讀數據有效信號
output [15:0] rd_val_data , //讀數據
output sd_init_done //SD卡初始化完成信號
);
//wire define
wire init_sd_clk ; //初始化SD卡時的低速時鐘
wire init_sd_cs ; //初始化模塊SD片選信號
wire init_sd_mosi ; //初始化模塊SD數據輸出信號
wire wr_sd_cs ; //寫數據模塊SD片選信號
wire wr_sd_mosi ; //寫數據模塊SD數據輸出信號
wire rd_sd_cs ; //讀數據模塊SD片選信號
wire rd_sd_mosi ; //讀數據模塊SD數據輸出信號
//*****************************************************
//** main code
//*****************************************************
//SD卡的SPI_CLK
assign sd_clk = (sd_init_done==1'b0) ? init_sd_clk : clk_ref_180deg;
//SD卡接口信號選擇
always @(*) begin
//SD卡初始化完成之前,端口信號和初始化模塊信號相連
if(sd_init_done == 1'b0) begin
sd_cs = init_sd_cs;
sd_mosi = init_sd_mosi;
end
else if(wr_busy) begin
sd_cs = wr_sd_cs;
sd_mosi = wr_sd_mosi;
end
else if(rd_busy) begin
sd_cs = rd_sd_cs;
sd_mosi = rd_sd_mosi;
end
else begin
sd_cs = 1'b1;
sd_mosi = 1'b1;
end
end
//SD卡初始化
sd_init u_sd_init(
.clk_ref (clk_ref),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_clk (init_sd_clk),
.sd_cs (init_sd_cs),
.sd_mosi (init_sd_mosi),
.sd_init_done (sd_init_done)
);
//SD卡寫數據
sd_write u_sd_write(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (wr_sd_cs),
.sd_mosi (wr_sd_mosi),
//SD卡初始化完成之后響應寫操作
.wr_start_en (wr_start_en & sd_init_done),
.wr_sec_addr (wr_sec_addr),
.wr_data (wr_data),
.wr_busy (wr_busy),
.wr_req (wr_req)
);
//SD卡讀數據
sd_read u_sd_read(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (rd_sd_cs),
.sd_mosi (rd_sd_mosi),
//SD卡初始化完成之后響應讀操作
.rd_start_en (rd_start_en & sd_init_done),
.rd_sec_addr (rd_sec_addr),
.rd_busy (rd_busy),
.rd_val_en (rd_val_en),
.rd_val_data (rd_val_data)
);
endmodule
SD NAND控制器模塊輸出的sd_init_done(SD NAND初始化完成信號)連接至SD NAND測試數據產生模塊,只有在SD NAND初始化完成之后(sd_init_done為高電平),才能對SD NAND進行讀寫測試。SD NAND控制器模塊將SD NAND的初始化以及讀寫操作封裝成方便用戶調用的接口,SD NAND測試數據產生模塊只需對SD NAND控制器模塊的用戶接口進行操作即可完成對SD NAND的讀寫操作。
6.2、仿真結果
一般的測試中,我們都需要先進行仿真來觀察時序等測試行為。此次實驗由于找不到好的SD NAND的Verilog模型,所以仿真測試略。
6.3、實驗結果
上文已經說了常用的相機中的TF卡與工業級的SD NAND(貼片式T卡)的區別,所以本次實驗我選用的是深圳雷龍公司的一款SD NAND產品----CSNP32GCR01-AOW。
這是一家專業做存儲產品的公司,NAND Flash是其主要產品。 該公司專注NAND Flash設計研發13年,在這一塊可以說是相當專業。如果你對NAND Flash仍有疑惑的問題,或者你想在你的設計中使用NAND Flash產品,都可以直接聯系:深圳市雷龍發展有限公司
實驗結果其實沒什么好看的,LED燈常量表明說明從SD NAND讀出的512個字節(256個16位數據) 與寫入的數據相同,SD NAND讀寫測試程序下載驗證成功。
PS:有個小細節可以說下,雷龍公司的SD NAND開發板還是蠻用心的,封裝都是標準的Micro SD的封裝,只要你的FPGA開發板上有SD卡座,就可以直接插上使用了,即插即用十分方便,有心了。
【本文轉載自CSDN,作者:孤獨的單刀】
親愛的卡友們,歡迎光臨雷龍官網,如果看完文章之后還是有疑惑或不懂的地方,請聯系我們,自己去理解或猜答案是件很累的事,請把最麻煩的事情交給我們來處理,術業有專攻,聞道有先后,深圳市雷龍發展專注存儲行業13年,專業提供小容量存儲解決方案。
-
FPGA
+關注
關注
1626文章
21677瀏覽量
601995 -
NAND
+關注
關注
16文章
1678瀏覽量
136026 -
FlaSh
+關注
關注
10文章
1622瀏覽量
147775 -
SD卡
+關注
關注
2文章
560瀏覽量
63812
發布評論請先 登錄
相關推薦
評論