應用筆記 編程 V1.0 2015/03/26緩存 |
PC和FPGA間的串口通訊實現spa |
概述3d |
本文將介紹PC和FPGA間的串口通訊實現的基本思路和Verilog代碼,對於通訊而言,收發雙方都要有相應的控制。PC端採用MATLAB控制串口進行操做。本文檔將詳細介紹這一過程。 blog |
修訂歷史文檔 |
如下表格展現了本文檔的修訂過程 input
|
簡介 |
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代碼略。 |