陳明正 韋昌輝



關鍵詞:Verilog HDL;UART ; FPGA
中圖分類號:TP391 文獻標識碼:A
文章編號:1009-3044(2022)36-0065-03
21世紀是智慧生活的時代,物聯網發展日趨完善又將普適計算和邊緣計算應用越來越廣,而智慧城市的建設使得各種設備、模塊之間的通信過程將增長到前所未有的規模,各種應用場景下的傳感器件同主控制器以及設備之間的通信和控制都要依靠各種接口實現,隨著電子工業的不斷發展,傳感器件的復雜程度以及傳輸數據量的不斷增長對通信方式有著比以往更高的要求,因此總線型通信方式成為控制信息和數據的主要傳輸手段。而受制于功耗、成本、體積、性能等一系列因素,盡可能少的功率消耗、簡單的接口邏輯以及合適的電氣特性都是必不可少的,因此占用大量I/O 資源的并行通信方式以及對時序要求嚴格且結構復雜的同步通信方式不可能在物聯網的各個節點設備中完全使用。相比較之下,只需兩個I/O 資源和一個信號地的異步串行通信總線無異于最優選擇[1]。自1970 年EIA(美國電子工業協會)牽頭貝爾和其他計算機終端廠商制定出RS-232 標準以后,RS-232 標準在異步傳輸應用中占據幾十年主導地位[2],直到RS-484、RS-422 等新型標準問世并發展成熟。
在未來的工業級市場將主要由傳輸距離遠并且較為穩定的RS-484/422 系列成為主流,未來異步串行通信的主要市場集中在板級通信。為此,本設計將基于FPGA 實現一個UART 接口并完成收發數據測試以及進行數據環回通信測試以驗證UART 接口功能和指標達成。主要包含通信協議分析、接口邏輯分析和設計、通信驗證三個方面的工作,實現了全雙工通信。
1異步串行通信設計方案
本設計的基本目標是在ZYNQ 平臺上通過邏輯門電路實現一個異步串行通信接口并成功通信,基于此目標再嘗試改變波特率參數將通信速率提升,并對提升效果進行分析。其中包含數據收發測試,穩定性分析等。
本設計的系統結構示意圖如圖1和圖2所示,圖1 為UART數據收發示意圖,RX 為接收端,TX 為發送端,RX_BUF 和TX_BUF 分別為接收端緩存隊列和發送端緩存隊列[5]。圖2 為UART 數據環回通信示意圖,環回通信的主要目的是檢測通信鏈路是否正常,具體操作為將數據發送到接收方再由接收方將數據原樣發回,若數據一致,則表示數據鏈路正常。環回通信示意圖中。RX接收上位機發送的串行數據并保存到緩沖隊列BUF 中,再由發送端TX 將BUF中的并行數據逐位轉為串行數據并傳輸;上位機通過串口調試工具將發出和收回的數據進行比對,判斷通信成敗和質量。
2 Xilinx 硬件方案
Xilinx 在行業中主要提供各類可編程邏輯器件,目前最先進的為28nm 工藝的7 系列且新增了包含SoC 的ZYNQ 家族。ZYNQ 是包含ARM Cortex-A9 處理器的基于Artix-7 系列的FPGA 器件。
本設計采用了Xilinx 近年推出的ZYNQ 家族成員之一的XC7Z020-2CLG400I 作為解決方案。
ZYNQ 從構成上看屬于嵌入式SoC 類型的平臺,Xilinx 推出這個家族的產品主要針對于視頻流處理、駕乘輔助以及工業級自動化等對計算性能和效率要求較高的高端嵌入式應用場景。在高端應用領域尤其是像導彈控制、航空航天等任務中的一些實時控制系統中,甚至會采用ARM 核心+FPGA+DSP 的協同實現作為解決方案。
本方案采用的XC7Z020-2CLG400I 是Xilinx 公司的Zynq7000 系列的芯片,該平臺的PS 系統端嵌入了兩個ARM Cortex?-A9 處理器核心,主頻最高可達767MHz;ARM核心通過AMBA 總線實現內部存儲器與外部存儲器接口和外設的互連。PL 端基于AR?TIX-7 架構,包含85K 邏輯單元Logic Cells、53.2K 觸發器、220個乘法器單元以及4.9Mb BLOCK RAM。下圖為ZYNQ-7000 系列的SoC 架構概況。本設計采用了Xilinx 近年推出的ZYNQ 家族成員之一的XC7Z020-2CLG400I 作為解決方案,如圖3 和圖4 所示。
本設計選用了微相科技推出的基于XC7Z020-2CLG400I 核心的開發板MicroZus,搭載1GB ddr3、128Mbit QSPI Flash、Wi-Fi 藍牙芯片以及各類接口,具有較多的功能和較強的性能。
3異步串行通信模塊設計
為了驗證本設計的實現情況,需要采用環回通信方式進行收發數據驗證,因此系統應該有一個串口接收模塊,用來接收發送端發送的數據;還要有一個串口發送模塊,用于將數據發回發送端,發送端利用上位機的串口調試工具實現;此外還需要有一個對數據幀進行環回控制的模塊,它負責把從串口接收模塊接收到的數據進行緩存以待合適時機再轉發給串口發送模塊,串口發送模塊再發送到接收端以實現串口數據的環回。由此可以畫出本設計的系統結構圖如圖5所示。
3.1 接收模塊
本設計所用平臺為50MHz,RX_data 是RX 信號線從接收到信號跳變開始記錄到的各個比特位,幀起始標志start 是RX 接到起始位下降沿電平跳變時拉高一個時鐘周期的信號,用于指示接收過程的開始,同事接收標志RX_flag 拉高,時鐘計數器置零并開始計數,bit_cnt 也被置零。當位計數器bit_cnt 的計數值達到8 時,標志著已經開始接收終止位,幀結束標志finish 位拉高一個位寬周期,同時將串行數據存入緩沖隊列BUF 之中,等到位計數器bit_cnt 為9 時fin?ish 位和RX_flag 置低,標志著一個數據幀接收完成,等到RX 信號線再一次出現下降沿的電平跳變時再開始接收新一幀數據。在接收過程中,位計數器bit_cnt 的計數依據是時鐘計數器clk_cnt 提供的,時鐘計數器的最大值通過系統時鐘頻率和波特率計算得來,表示傳輸一個bit 數據所需的系統時鐘周期數,clk_cnt 每達到一次最大值,bit_cnt 便自增1,之后clk_cnt 清零繼續計數,直到bit_cnt 達到9 之后,clk_bnt 不再計數。對數據幀每一位的采樣一般不會定在每一位的起始或者末尾位置,這主要是為了能夠準確無誤地接收上位機傳來的數據,因為器件本身建立狀態需要一定的時間,電平的跳變也不是在一個時刻內完成的,因而采樣時一般將采樣點定在數據位的正中央,此時是數據電平建立最穩定的時刻,可以在一定程度上降低誤碼率。
通過對接收模塊的接口和信號分析和建模,利用Verilog 進行硬件描述之后生成如下的門級網表圖。左端輸入接口分別為系統時鐘sys_clk,系統復位sys_rst_n 以及數據輸入端uart_rxd;右端輸出分別為并行數據接口uart_data[7: 0] 以及傳輸完成標志uart_done。
3.2 發送模塊
在發送模塊的系統結構中,用于標志串口發送過程的TX_flag 信號賦值給uart_tx_busy,并通過模塊端口輸出。這樣其他模塊就可以通過檢測uart_tx_busy 信號是否為低電平,從而判斷串口發送模塊是否處于空閑狀態。若uart_tx_busy 為高電平,那么uart_send 模塊正處于發送過程,外部模塊需要等待當前發送過程結束之后,環回模塊才能將發送使能信號通過uart_en 接口進入發送模塊,uart_en 信號用一個上升沿來啟動新的發送過程。而發送模塊內部也需要一個同樣的使能en_flag 信號作為發送開始的激勵。接到uart_en 后模塊首先將en_flag 拉高一個時鐘,在上升沿的同時,發送過程開始,時鐘計數器clk_cnt 置零并開始計數,直到計數值達到發送一個bit 所需的時鐘周期數完全達到,再將下一位數據接入發送信號線,實現數據的并串轉換。以此類推直到數據發送完成,當一幀數據發送結束時,TX_flag 拉低,此時uart_tx_busy 也會變為低電平傳輸到環回模塊。有一些信號出現重復的波形是因為其中有一個是內部信號,而另一個是外部接入或者要輸出的信號。
3.3 環回模塊
環回模塊是進行環回通信時用到的一個帶有判斷功能的緩沖隊列,在邏輯上也比較簡單:接收模塊在接收到一幀數據之后,由于發送模塊需要進行并串行轉換,所以發送時延較長,因此需要將來不及發送的數據再試存放在緩沖隊列中并設置相應的新數據標志recv_done;等到發送模塊發送完一幀數據后進入空閑狀態,此時環回模塊會接收到uart_tx_busy 的低電平信號,此時環回模塊會向發送模塊的uart_en 接口發送一個時鐘周期的脈沖,促使發送模塊繼續將緩沖隊列的數據發送出去。UART 接口環回通信結構圖如圖5所示。
環回模塊還解決的一個問題是全雙工環回通信時的數幀丟失問題,由于發送模塊需要將數據終止位完整發送,所以接收端接收進來的數據后發送端還有半個位寬的時鐘沒有完成,而此時接收端的數據已經放入了BUF 并行數據接口中了,而此時發送過程正在進行,uart_en 信號無法發揮作用,因此這一幀數據將會丟失。
4 UART 通信驗證及分析
4.1 基于IAL 的數據收發驗證
ILA 全稱集成邏輯分析儀,是vivado 開發平臺提供的一個強有力的分析工具,在工程中實例后就能對指定端口進行調試分析。本設計中數據單獨的收、發功能測試無法僅憑上位機串口調試工具完成對比和時序分析,所以采用ILA 完成。
使用上位機通過串口向開發板發送16 進制數55,在串口接收過程中ILA 抓取的波形圖6所示。圖中綠色的觸發線標識出了串口接收端uart_rxd 的起始位,在整個接收過程中rx_flag 保持為高電平,同時rx_cnt 對串口數據進行計數。當rx_cnt 計數到9 時,串口數據接收完成,uart_done 拉高,同時uart_data 給出接收到的數據。從圖6中可以看到,接收模塊能夠正確接收串口數據并完成串并轉換。
串口發送過程中ILA 抓取的波形圖如圖7所示為,使用開發板通過串口向上位機向發送16 進制數55。圖中的觸發線標識出了串口發送使能信號uart_en 的上升沿。在檢測到uart_en 的上升沿后,en_flag 會拉高一個時鐘周期,此時將uart_din 端口上的待發送數據寄存到tx_data 中,并進入串口發送過程。在整個發送過程中tx_flag 保持為高電平,tx_cnt 對串口數據進行計數,同時tx_data的各個數據位依次通過串口發送端uart_txd 發送出去。當tx_cnt 計數到9時,串口數據發送完成,開始發送停止位。在一個波特率周期的停止位發送完成后,串口發送過程結束,uart_tx_busy 信號拉低,表明串口發送模塊進入空閑狀態。
4.2 上位機與開發板環回通信測試
將開發板通過串口線連接到上位機,如圖8所示,通過串口調試工具XCOM向開發板發送“010203040506070809”共18位字符并設置以16進制發送,接收端設置為以16進制顯示,點擊發送按鈕之后,在接收窗口立即會顯示開發板傳回的數據,實現了雙工通信。
5 結束語
異步串行通信在未來的物聯網產業中會有比以往更廣闊的應用前景。本文采用基于Xilinx FPGA平臺的方案。設計了一種具有完全功能的異步串行通信收發器,通過實驗,驗證實現了收發雙方的全雙工通信。