PC和FPGA間的串口通信實現


應用筆記

V1.0 2015/03/26

PCFPGA間的串口通信實現

 

概述

 

本文將介紹PC和FPGA間的串口通信實現的基本思路和Verilog代碼,對於通信而言,收發雙方都要有相應的控制。PC端采用MATLAB控制串口進行操作。本文檔將詳細介紹這一過程。

修訂歷史

以下表格展示了本文檔的修訂過程

日期

版本號

修訂內容

2015/03/26

V1.0

初始版本,運行正確

 

簡介

 

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模塊信號說明

信號

類型

功能

clk

input

時鍾

rst

input

復位信號,高有效

rxd

input

串行信號輸入

rst

output

串行信號輸出

clk_count

reg[12:0]

計數分頻

serial_out

wire[7:0]

串行數據並行輸出(8bit)

serial_out_rdy

wire

輸出數據有效

inputram_data_out

wire[7:0]

輸入存儲器輸出

inputram_data_out_enable

wire

輸入存儲器輸出有效

dataProcess_out

wire

數據處理輸出

dataProcess_out_enable

wire

數據處理輸出有效

outputram_out

wire[7:0]

輸出存儲器輸出

outputram_out_enable

wire

輸出存儲器輸出有效

 

表格 2 serialRead模塊信號說明

信號

類型

功能

clk16x

input

16倍串口通信波特率的采樣時鍾

rst

input

復位信號,高有效

rxd

input

串口輸入信號

serial_out

wire[7:0]

串行數據並行輸出(8bit)

serial_out_rdy

wire

輸出數據有效

clk1x_enable

reg

串口接收數據時鍾使能

clk1x

wire

串口數據的采樣時鍾

 

剩余模塊比較簡單,不做說明,我也懶得寫了……

 

參考

 

代碼

 

注:以下代碼介紹2560個PC的8bit的幀,之后處理取后1024幀的最高數據為,分為128幀傳送回PC端。MATLAB代碼略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM