PC和FPGA間的串口通訊實現

應用筆記 編程

V1.0 2015/03/26緩存

PCFPGA間的串口通訊實現spa

 

概述3d

 

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

修訂歷史文檔

如下表格展現了本文檔的修訂過程 input

日期it

版本號table

修訂內容程序

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代碼略。

相關文章
相關標籤/搜索