應用筆記 編程 V1.1 2015/2/10app |
採用FPGA實現UART轉SPIspa |
概述設計 |
本文提供了實現UART轉SPI的Verilog代碼的功能描述。這份筆記將介紹UART和SPI的基本知識,代碼設計的基本思路,以及代碼的具體實現及其描述。本程序的具體功能在於配合AD9512_Serial_GUI完成AD9512寄存器的配置,包括讀及寫過程。3d |
修訂歷史blog |
如下表格展現了本文檔的修訂過程 文檔
[1]. 代碼修訂包括更改了實現方式,採用了狀態機描述方法是下了UART2SPI的過程,同時增長了SPI2UART的功能。 |
簡介 |
本程序基於ISE14.7編寫,PC機程序採用MATLAB編寫,具體參考《程序說明-MATLAB串口操做和GUI編程》。閱讀本文檔內容前建議先閱讀《程序說明-MATLAB串口操做和GUI編程》。 串行通訊的幀格式以下所示
圖 1 串行數據幀格式
對於AD9512而言,SPI的時序要求以下所示
圖 2 AD9512寫控制
UART轉SPI的過程是經過上位機配置AD9512的過程,咱們的目的在於將圖 1中的幀格式轉換爲圖 2所示的數據流。對應圖二咱們須要考慮三路信號
SDIO的數據不止8比特,可控制,簡單起見咱們每次寫入1字節的數據。那麼此時SDIO的數據流一次有24比特。對應可取串行通訊的幀長爲8比特,24比特至關於3幀。一旦肯定了SDIO,經過FPGA能夠很容易肯定CSB和SCLK。 所以咱們須要採用一個24位的寄存器來存儲接收到的數據。那麼問題是,咱們該如何接收數據呢? 咱們能夠經過判斷第一個降低沿來肯定幀的起始,兩個寄存器就能夠知足這一要求。因爲通訊過程時鐘不一樣源,咱們但願採樣點儘量在中間,採用以高倍于波特率的時鐘很容易就能夠知足這一點。這裏咱們選擇16倍波特率採樣。咱們須要一個計數器來判斷接收了幾個比特,同時還須要計數這是接收的第幾幀。一旦咱們接收到24比特的有效數據,就能夠開始配置AD9512的寄存器了。 在設計以前咱們須要考慮一下讀寄存器的需求,V1.0版本的程序沒有考慮這一點,因此V1.1的程序重寫了。所以,作事以前考慮全面是頗有必要的。
圖 3 AD9512讀控制
咱們注意到實際上發送兩幀數據就能夠開始讀數了,但爲了和寫控制一致,咱們選擇了在發送端發送一幀無心義的數據。一旦地址寫入,在SCLK降低沿SDO開始串行輸出寄存器的取值。 針對這些控制,咱們以爲採用狀態機來實現,狀態包括:
狀態設置不是特別合理,但基本完成功能,獨熱碼設計。 |
信號說明 |
圖 4 UART轉SPI模塊
表格 1 UART轉SPI模塊的信號說明
|
參考 |
AD9512數據手冊 MATLAB幫助 Xilinx應用手冊(xapp341) |