應用筆記 V1.0 2015/03/26 |
PC和FPGA間的串口通信實現 |
概述 |
本文將介紹PC和FPGA間的串口通信實現的基本思路和Verilog代碼,對於通信而言,收發雙方都要有相應的控制。PC端采用MATLAB控制串口進行操作。本文檔將詳細介紹這一過程。 |
修訂歷史 |
以下表格展示了本文檔的修訂過程
|
簡介 |
PC端程序基於MATLAB 2014a 編寫,本文檔中提到的"MATLAB"均指該特定版本MATLAB。 為何要做一套PC和FPGA之間通信的程序?之前的文檔,包括《程序說明:MATLAB串口操作和GUI編程》和《應用筆記:采用FPGA實現UART轉SPI》說明可以通過PC來"控制"FPGA進行相應的操作。在LDPC譯碼誤碼率仿真過程中,我們希望通過FPGA強大的計算能力來輔助計算,這時我們希望要能夠完成PC傳送數據,FPGA處理后發送回PC機的過程。本文檔將介紹通過串口完成這一功能的整個過程。 當然,更廣泛的來說,數據的處理過程,就應該包括數據的輸入和輸出。也就是說,對於FPGA來說,很多情況下必須要考慮將外界的數據接收、緩存、處理、緩存、輸出的整個過程。這里數據的來源不僅僅能是PC,數據的格式或協議不僅僅能是串行通信協議。也就是說,本文檔所介紹的是這一過程的一個特例。 本文檔關注FPGA端的處理,對PC端處理不做詳細說明。FPGA端處理包括
其中數據接收和發送采用串行通信協議,幀格式如圖 1。
圖 1 串行數據幀格式 PC端通過MATLAB操作串口,僅僅只需要采取如下命令即可 s=serial('COM1'); fopen(s); fwrite(s,100); %寫一個字節 fread(s,[1 1],'unit8'); %讀一個字節 fclose(s); delete(s); |
程序結構 |
程序結構如圖 2所示
圖 2 程序結構示意圖
頂層文件僅僅只需要如下幾個端口 input clk; //時鍾 input rxd; //串口輸入 input rst; //復位,高有效 output rxt; //串口輸出 即輸入輸出數據即可。后文將詳細介紹各個模塊的功能。
圖 3 數據讀取、緩存
serialRead的輸入時鍾是16倍的波特率(時鍾不同源),輸出的是8bit的並行數據,同時有輸出有效的表示。此時輸出的時鍾也是16倍的波特率。 然而往往數據的處理模塊的時鍾是不同的。對於隔離時鍾域來說,FIFO是一個很好的選擇,但是這里由於考慮到譯碼需要接收到所有的數據之后才能夠開始,而且數據在整個譯碼過程中需要保持,所以選擇了雙口RAM來匹配不同速率的數據。當然還有一個原因是我不太記得FIFO這個核則么用了。 inputram的clka是16倍的波特率,通過輸入地址控制,每次接收到out_rdy有效后地址增1將data_in保存到RAM內部。Inputram的clkb是數據處理模塊的時鍾,通過相應的規則控制ram的addrb,控制data_out和data_out_enable信號,得到滿足數據處理要求的數據流。
圖 4 數據處理模塊
數據處理模塊接收數據后處理輸出data_out和data_out_enable
圖 5 數據緩存輸出
數據處理模塊通過接收並存儲data_out后,在滿足一定條件下發送dout和dout_enable信號。其中clka為數據處理模塊時鍾頻率,而clkb是1/16的波特率的頻率。 serialWrite模塊通過接收信號,在輸出使能情況下,輸出rxt。 |
信號說明 |
表格 1 confirm_top模塊信號說明
表格 2 serialRead模塊信號說明
剩余模塊比較簡單,不做說明,我也懶得寫了…… |
參考 |
|
代碼 |
注:以下代碼介紹2560個PC的8bit的幀,之后處理取后1024幀的最高數據為,分為128幀傳送回PC端。MATLAB代碼略。
|












