以下內容均以Xilinx的Nexys3作為開發板
1. UART簡介
UART(即Universal Asynchronous Receiver Transmitter 通用異步收發器)是廣泛使用的串行數據傳輸協議。UART允許在串行鏈路上進行全雙工的通信。
串行外設用到RS232-C異步串行接口,一般采用專用的集成電路即UART實現。如8250、8251、NS16450等芯片都是常見的UART器件,這類芯片已經相當復雜,有的含有許多輔助的模塊(如FIFO),有時我們不需要使用完整的UART的功能和這些輔助功能。或者設計上用到了FPGA/CPLD器件,那么我們就可以將所需要的UART功能集成到FPGA內部。使用VHDL將UART的核心功能集成,從而使整個設計更加緊湊、穩定且可靠。本文應用EDA技術,基於FPGA/CPLD器件設計與實現UART。
以上內容摘自某位網友的熱心博文。
就我個人而言,UART就是一個異步串行接口,見過最多的就是RS232。而我們的開發板則是一個Mircro USB來模擬這樣一個接口,電路圖如下:

根據manual的介紹,我們可以通過指令來通過這個接口首發數據。Mircroblaze提供了這一接口的控制器,官網上也有着一接口的VHDL語言Demo。所以原理內容本人就不再贅述,主要還是注意串行異步通信協議,如下圖所示。

道理很簡單,但是這個Demo筆者卻研究了很久時間,因為我一直使用Verilog語言,VHDL語言和Verilog區別還是挺大的,為了方便其他使用Verilog研究本Demo,筆者現將Xilinx網站上的GPIO_UART Demo改寫為Verilog。
該Demo采用單工方式,開發板最為發送器,PC最為接收器。同時,該Demo還兼具了按鍵消抖,7段數碼管顯示等模塊,筆者也進行了改寫,但此處不做詳細介紹。
由於該源代碼注解較為詳細,現僅將功能介紹:其實由switch控制led顯示,同時switch[0]作為系統復位端。五個按鍵的中間按鍵也可作為復位端。程序燒錄后,啟動系統,系統將自動向PC發送27個16位字符串;當按其他按鍵時,開發板也將向PC發送24個16位字符串。字符串內容相同,但數據不同。其中筆者認為該程序按鍵消抖部分不是很好,但是本人並未修改,畢竟只是改寫人家的源代碼。Xilinx官網的大部分都是VHDL程序,看起來真的是很費力,希望對感興趣的同學有幫助吧。
2.程序源代碼介紹
其中,筆者使用IPcore生成rom,按鍵發送和初始發送的數據內容相同,但長度不同,作為測試依據。源碼打包在最后面。
3.實驗截圖
(1)狀態機截圖

圖1 頂層文件狀態機

圖2 子層狀態機
(2)測試截圖
驗證工具為網上下載的小工具——串口調試器。打開該工具前需要保證開發板已經與PC相連,否則無法找到串口COM3。測試前,別忘記將選擇串口選為COM3,波特率9600,數據位8,校驗位無,停止位1,單擊打開串口即可測試。如圖。

4.附件
(1)源代碼
以上內容均可以在百度網盤下載
http://pan.baidu.com/share/link?shareid=940132753&uk=1092766566。