?

基于龍芯Local IO 接口的UART IP 核設計

2022-03-27 11:02李森李中袁強唐建
智能物聯技術 2022年5期
關鍵詞:龍芯波特率寄存器

李森,李中,袁強,唐建

(中國兵器裝備集團自動化研究所有限公司 特種計算機事業部,四川 綿陽 621000)

0 引言

隨著國產處理器在各種電子設備中的應用越來越廣泛,以國產CPU 龍芯系列為主的各種計算機不斷得到普及,但龍芯系列芯片自帶的UART 接口有限,在計算機硬件系統的設計中常常需要使用FPGA(Field Programmable Gate Array)或CPLD(Complex Programmable Logic Device)擴展多路串口[1],以滿足設計需要。但Xilinx 官方[2]的UART IP核為AXI(Advanced eXtensible Interface)總線接口,操作比較繁瑣,不能直接與Local IO 接口適配。為了解決與龍芯Local IO 接口適配以及UART 接口參數可在線配置的問題,本文設計了一種基于Local IO 接口的UART IP核,能夠實現串口協議參數、中斷系統參數在線配置功能,解決了龍芯系列CPU 在系統設計中的串口擴增問題,增強了龍芯CPU 的兼容性。

1 IP 核整體設計

UART IP 核由發送模塊(UART_TX)、接收模塊(UART_RX)、發送FIFO(TX_FIFO)、接收FIFO(RX_FIFO)、時鐘模塊(UART_CLK)、中斷系統(UART_INTR_CTRL)、配置模塊(UART_CONFIG)、Local IO 模塊8 部分組成[3],如圖1 所示。

圖1 UART IP 整體結構Figure 1 Overall structure of UART IP

2 IP 核設計實現

2.1 發送模塊UART_TX 設計

UART IP 核的發送模塊主要實現將待發送的并行數據按照串口協議轉化為串行數據,并將串行數據發送到總線上,該發送模塊具有數據位長度、奇偶校驗、停止位長度可配置的功能。其關鍵端口的具體設計如下:

(1)data_length [1:0]:數據位長度配置,2’b00(5bit)、2’b01(6bit)、2’b10(7bit)、2’b11(8bit),數據位長度默認為8bit。

(2)parity_set[1:0]:校驗位設置,2’b11(奇校驗)、2’b10(偶校驗)、2’b00(無校驗),默認為無校驗。

(3)stop_length [1:0]:停止位長度設置,2’b11(2bit)、2’b10(1.5bit)、2’b00(1bit),默認停止位長度為1bit。

(4)data_in[7:0]:8bit 并行數據輸入。

(5)tx_out:串口發送器,串行數據輸出。

按照以上設計思路,對UART 發送模塊設計實現,并進行仿真驗證。如圖2 所示為data_length=2’b11、parity_set=2’b10、stop_length=2’b00、data_in=8’b10110011 以及data_length=2’b10、parity_set=2’b11、stop_length=2’b00、data_in=8’b1001010的仿真結果。由仿真結果可知,設計正確。

圖2 UART_TX 仿真結果Figure 2 UART_ TX simulation results

2.2 接收模塊UART_RX 設計

UART IP 核的接收模塊主要實現將串行數據按照串口協議與預設的波特率轉化為并行數據輸出[4]。當檢測到總線上有起始位產生時,按照設定的波特率與配置模式,對總線數據進行采樣。由于串口總線在空閑時保持為高,而停止位也為高電平,因此在設計接收模塊的狀態機中,當接收完數據位與校驗位后就直接跳轉到空閑態,等待下一幀串口數據的起始位。其關鍵端口的具體設計如下:

(1)data_length [1:0]:數據位長度配置,2’b00(5bit)、2’b01(6bit)、2’b10(7bit)、2’b11(8bit),數據位長度默認為8bit。

(2)parity_set[1:0]:校驗位設置,2’b11(奇校驗)、2’b10(偶校驗)、2’b00(無校驗),默認為無校驗。

(3)rx_in:串口接收模塊,串行數據輸入端口。

(4)data_out[7:0]:串口接收器并行數據輸出。

(5)parity_error:校驗錯誤為1,校驗正確為0。

按照以上設計思路,對UART 接收模塊設計實現,并進行仿真驗證。如圖3 所示為data_length=2’b11、parity_set=2’b10 以 及data_length=2’b10、parity_set=2’b10 的仿真結果。其中send_data為發送的測試數據,data_out 為接收到的數據,parity_error 為接收的校驗脈沖,parity_error=1’b0 表示校驗正確,parity_error=1’b1 表示校驗錯誤。由仿真結果可知,設計正確。

圖3 UART_RX 模塊仿真結果Figure 3 UART_ RX module simulation results

2.3 時鐘模塊UART_CLK 設計

為了增強IP 核擴展的靈活性,在設計時采用模塊化設計的思想,將發送器與接收器使用的波特率時鐘設計為一個獨立的模塊,以便對時鐘模塊進行修改時不會影響系統中其他模塊的功能[5]。時鐘模塊實現在UART_TX 發送數據時,使輸出數據按照設定的波特率輸出,發送時鐘設計為占空比為50%的時鐘信號;在UART_RX 接收數據時,在接收時鐘的控制下對總線上的數據進行采樣,接收時鐘設計為每個波特率時鐘周期產生一個系統時鐘周期高脈沖的時鐘。UART_CLK 模塊的關鍵端口設計如下:

(1)baud_set[15:0]:波特率設置的數據輸入端口,用于設置發送時鐘與接收時鐘的波特率大小。baud_set 的計算公式為:baud_set=0.5 fclk/Baud,其中fclk 為FPGA 的系統時鐘,單位為Hz;Baud 為串口的波特率,單位為bps。

(2)rx_in_reg:串口接收端口下降沿檢測輸入端口。串口處于空閑時,當檢測到該接口為1時,就立刻產生接收時鐘,從uart_rx_clk 端口輸出。

(3)receive_done:串口每一幀數據接收完畢的脈沖信號輸入。當檢測到該信號為1時,就結束uart_rx_clk 時鐘的輸出。

(4)uart_tx_clk:串口發送時鐘的輸出端口。

(5)uart_rx_clk:串口接收時鐘的輸出端口。

按照以上設計思路,對UART_CLK 模塊設計實現,并進行仿真驗證,如圖4 所示為baud_set=5時的仿真結果。由仿真結果可知,發送時鐘uart_tx_clk 持續輸出;當rx_in_reg=1時,啟動接收時鐘uart_rx_clk 的輸出,當receive_done=1時,關閉接收時鐘的輸出。

圖4 UART_CLk 模塊仿真結果Figure 4 UART_ CLk module simulation results

2.4 FIFO 設計

為了解決在發送的過程中CPU 輸出數據的速度與UART 傳送數據的速度不匹配的問題,需要設計發送FIFO(TX_FIFO)。在發送的過程中,CPU 只需通過LocalIO 總線向TX_FIFO 中寫入數據,當TX_FIFO 不為空時,TX_FIFO 中的數據就會被UART_TX 模塊自動發送出去,直到TX_FIFO 空為止。在接收數據的過程中,如果沒有接收FIFO,則串口每接收完一個數據后,FPGA 就會產生一次接收中斷輸出,如果進行大量數據的持續傳輸,則會導致CPU 一直進入中斷,造成CPU 死機。為了避免在數據接收過程中的頻繁中斷問題,需要在接收側設計接收FIFO(RX_FIFO)。在該UART IP 核中,TX_FIFO 與RX_FIFO 的容量設計為256Byte,FIFO使用Xilinx 自帶的IP 核實現。TX_FIFO 自動發送與RX_FIFO 自動接收的狀態機設計,如圖5 所示。

圖5 FIFO 讀寫控制狀態機a)TX_FIFO 自動發送狀態機;b)RX_FIFO 自動接收狀態機Figure 5 FIFO read and write control state machine a)TX_FIFO automatic receiving state machine b)RX_FIFO automatic transmission machine

2.5 中斷系統設計

一個系統是否具有中斷功能,決定了該系統對外部資源的消耗情況以及該系統的兼容性。如果一個系統沒有中斷功能,則需要消耗大量的CPU 資源去查詢該系統的當前狀態,同時也會降低該系統的對外兼容性。為了降低UART IP 核對CPU 資源的消耗,提高串口通信的實時性,該UART IP 核設計了接收中斷系統[6],該接收中斷具有閾值機制與超時機制。閾值機制的功能是:當接收數據的字節個數小于設定的閾值時,不產生中斷;當接收數據的字節數大于設定的閾值后,產生中斷,它可用于基于串口幀的自定義通信協議中斷適配。超時機制用于在通信的過程中接收數據一直無法達到設定閾值進而無法正常產生中斷,導致中斷一直無法輸出的情況。該UART IP 核的中斷系統由中斷寄存器與中斷控制邏輯兩部分組成。中斷寄存器包括中斷使能寄存器、中斷狀態寄存器、閾值配置寄存器、超時配置寄存器。中斷控制的處理邏輯如圖6 所示。該中斷采用電平的方式輸出,并且具有自動清除中斷的功能。當UART IP 核的接收中斷產生時,中斷輸出引腳置為高電平,當CPU 讀取RX_FIFO 中的數據后中斷輸出自動清除,同時中斷狀態寄存器的相應標志位自動清零,不需要CPU 手動清除中斷標志。

圖6 中斷生成控制流程Figure 6 Control flow of interrupt generation

2.6 配置模塊設計

為了使FPGA 運行過程中CPU 能夠在線對UART IP 核的參數進行配置[7],設計了獨立的配置模塊(UART_ CONFIG 模塊),用于保存UART IP核的各種配置參數。配置模塊由各種配置寄存器構成,CPU 通過Local IO 接口可以對這些寄存器進行讀寫操作。配置參數主要包括UART 協議基本配置參數、中斷配置參數等[8]。配置模塊的寄存器詳細設計如表1 所示。

表1 寄存器名稱、含義及訪問地址Table 1 Register name,meaning and access address

2.7 Local IO 接口模塊設計

Local IO 處理模塊用于實現UART IP 核與龍芯CPU Local IO 接口的適配。龍芯Local IO 接口的讀時序如圖7 所示,寫時序如圖8 所示。按照Local IO 的驅動時序,編寫Local IO 的驅動,并對讀寫驅動進行仿真,其結果分別如圖9 和圖10 所示,由仿真結果可知讀寫驅動時序正確。

圖7 Local IO 讀時序Figure 7 Local IO read timing

圖8 Local IO 寫時序Figure 8 Local IO write timing

圖9 Local IO 讀數據仿真結果Figure 9 Local IO read data simulation results

圖10 Local IO 寫數據仿真結果Figure 10 Local IO write data simulation results

3 方案測試

為了驗證UART IP 核設計的正確性,將程序下載到FPGA中[9-10]。首先測試UART IP 核的接收功能,利用串口調試助手向FPGA 的一號通道發送數據,FPGA 收到數據后產生中斷,并通過Local IO接口將數據發送給龍芯CPU,龍芯CPU 讀取數據并打印出讀取的結果,隨機抽取兩組測試結果如圖11 所示,每組結果中上方為串口調試助手發送的數據,下方為CPU 接收的數據。由結果可知,功能正確。接著測試UART IP 核的發送功能,龍芯CPU通過Local IO 接口向FPGA 的1 號通道發送數據,FPGA 收到數據后將數據發送給串口調試助手,隨機抽取4 組數據,其結果如圖12 所示。圖12 中上方為CPU 發送的數據,下方為串口調試助手接收的數據。由圖12 可知,發送與接收的數據一致,表明設計正確。

圖11 串口數據接收測試結果a)測試結果1 b)測試結果2Figure 11 Serial port data receiving test result a)test result 1 b)test result 2

圖12 串口數據發送測試結果Figure 12 Serial port data transmission test results

4 結語

本文根據龍芯CPU Local IO 接口的特點,設計了適配Local IO 接口的UART IP核,解決了龍芯CPU 通過FPGA 擴展UART 接口的需求。在設計時采用模塊化設計的思想,增強了IP 核的可裁剪性。在設計中斷系統時引入接收閾值機制與接收超時機制,避免頻繁產生中斷的現象發生,提高了IP 核與CPU 的兼容性,增強了龍芯CPU 在設計中的普適性。該IP 核在Vivado 中綜合實現后,消耗的資源情況為:LUT 1212個,LUTRAM 26個,FF 1822個,BRAM 1 個。

猜你喜歡
龍芯波特率寄存器
基于國產化龍芯的動環數據采集系統
STM32和51單片機寄存器映射原理異同分析
CAN 總線波特率自適應程序設計
Lite寄存器模型的設計與實現
“龍芯之父”胡偉武
龍芯發布新一代處理器產品
C*Core芯片SCI串口波特率容限優化
高速數模轉換器AD9779/AD9788的應用
UART波特率發生電路設計
一種可重構線性反饋移位寄存器設計
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合