李森,李中,袁強,唐建
(中國兵器裝備集團自動化研究所有限公司 特種計算機事業(yè)部,四川 綿陽 621000)
隨著國產處理器在各種電子設備中的應用越來越廣泛,以國產CPU 龍芯系列為主的各種計算機不斷得到普及,但龍芯系列芯片自帶的UART 接口有限,在計算機硬件系統(tǒng)的設計中常常需要使用FPGA(Field Programmable Gate Array)或CPLD(Complex Programmable Logic Device)擴展多路串口[1],以滿足設計需要。但Xilinx 官方[2]的UART IP核為AXI(Advanced eXtensible Interface)總線接口,操作比較繁瑣,不能直接與Local IO 接口適配。為了解決與龍芯Local IO 接口適配以及UART 接口參數(shù)可在線配置的問題,本文設計了一種基于Local IO 接口的UART IP核,能夠實現(xiàn)串口協(xié)議參數(shù)、中斷系統(tǒng)參數(shù)在線配置功能,解決了龍芯系列CPU 在系統(tǒng)設計中的串口擴增問題,增強了龍芯CPU 的兼容性。
UART IP 核由發(fā)送模塊(UART_TX)、接收模塊(UART_RX)、發(fā)送FIFO(TX_FIFO)、接收FIFO(RX_FIFO)、時鐘模塊(UART_CLK)、中斷系統(tǒng)(UART_INTR_CTRL)、配置模塊(UART_CONFIG)、Local IO 模塊8 部分組成[3],如圖1 所示。
圖1 UART IP 整體結構Figure 1 Overall structure of UART IP
UART IP 核的發(fā)送模塊主要實現(xiàn)將待發(fā)送的并行數(shù)據(jù)按照串口協(xié)議轉化為串行數(shù)據(jù),并將串行數(shù)據(jù)發(fā)送到總線上,該發(fā)送模塊具有數(shù)據(jù)位長度、奇偶校驗、停止位長度可配置的功能。其關鍵端口的具體設計如下:
(1)data_length [1:0]:數(shù)據(jù)位長度配置,2’b00(5bit)、2’b01(6bit)、2’b10(7bit)、2’b11(8bit),數(shù)據(jù)位長度默認為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 并行數(shù)據(jù)輸入。
(5)tx_out:串口發(fā)送器,串行數(shù)據(jù)輸出。
按照以上設計思路,對UART 發(fā)送模塊設計實現(xiàn),并進行仿真驗證。如圖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
UART IP 核的接收模塊主要實現(xiàn)將串行數(shù)據(jù)按照串口協(xié)議與預設的波特率轉化為并行數(shù)據(jù)輸出[4]。當檢測到總線上有起始位產生時,按照設定的波特率與配置模式,對總線數(shù)據(jù)進行采樣。由于串口總線在空閑時保持為高,而停止位也為高電平,因此在設計接收模塊的狀態(tài)機中,當接收完數(shù)據(jù)位與校驗位后就直接跳轉到空閑態(tài),等待下一幀串口數(shù)據(jù)的起始位。其關鍵端口的具體設計如下:
(1)data_length [1:0]:數(shù)據(jù)位長度配置,2’b00(5bit)、2’b01(6bit)、2’b10(7bit)、2’b11(8bit),數(shù)據(jù)位長度默認為8bit。
(2)parity_set[1:0]:校驗位設置,2’b11(奇校驗)、2’b10(偶校驗)、2’b00(無校驗),默認為無校驗。
(3)rx_in:串口接收模塊,串行數(shù)據(jù)輸入端口。
(4)data_out[7:0]:串口接收器并行數(shù)據(jù)輸出。
(5)parity_error:校驗錯誤為1,校驗正確為0。
按照以上設計思路,對UART 接收模塊設計實現(xiàn),并進行仿真驗證。如圖3 所示為data_length=2’b11、parity_set=2’b10 以 及data_length=2’b10、parity_set=2’b10 的仿真結果。其中send_data為發(fā)送的測試數(shù)據(jù),data_out 為接收到的數(shù)據(jù),parity_error 為接收的校驗脈沖,parity_error=1’b0 表示校驗正確,parity_error=1’b1 表示校驗錯誤。由仿真結果可知,設計正確。
圖3 UART_RX 模塊仿真結果Figure 3 UART_ RX module simulation results
為了增強IP 核擴展的靈活性,在設計時采用模塊化設計的思想,將發(fā)送器與接收器使用的波特率時鐘設計為一個獨立的模塊,以便對時鐘模塊進行修改時不會影響系統(tǒng)中其他模塊的功能[5]。時鐘模塊實現(xiàn)在UART_TX 發(fā)送數(shù)據(jù)時,使輸出數(shù)據(jù)按照設定的波特率輸出,發(fā)送時鐘設計為占空比為50%的時鐘信號;在UART_RX 接收數(shù)據(jù)時,在接收時鐘的控制下對總線上的數(shù)據(jù)進行采樣,接收時鐘設計為每個波特率時鐘周期產生一個系統(tǒng)時鐘周期高脈沖的時鐘。UART_CLK 模塊的關鍵端口設計如下:
(1)baud_set[15:0]:波特率設置的數(shù)據(jù)輸入端口,用于設置發(fā)送時鐘與接收時鐘的波特率大小。baud_set 的計算公式為:baud_set=0.5 fclk/Baud,其中fclk 為FPGA 的系統(tǒng)時鐘,單位為Hz;Baud 為串口的波特率,單位為bps。
(2)rx_in_reg:串口接收端口下降沿檢測輸入端口。串口處于空閑時,當檢測到該接口為1時,就立刻產生接收時鐘,從uart_rx_clk 端口輸出。
(3)receive_done:串口每一幀數(shù)據(jù)接收完畢的脈沖信號輸入。當檢測到該信號為1時,就結束uart_rx_clk 時鐘的輸出。
(4)uart_tx_clk:串口發(fā)送時鐘的輸出端口。
(5)uart_rx_clk:串口接收時鐘的輸出端口。
按照以上設計思路,對UART_CLK 模塊設計實現(xiàn),并進行仿真驗證,如圖4 所示為baud_set=5時的仿真結果。由仿真結果可知,發(fā)送時鐘uart_tx_clk 持續(xù)輸出;當rx_in_reg=1時,啟動接收時鐘uart_rx_clk 的輸出,當receive_done=1時,關閉接收時鐘的輸出。
圖4 UART_CLk 模塊仿真結果Figure 4 UART_ CLk module simulation results
為了解決在發(fā)送的過程中CPU 輸出數(shù)據(jù)的速度與UART 傳送數(shù)據(jù)的速度不匹配的問題,需要設計發(fā)送FIFO(TX_FIFO)。在發(fā)送的過程中,CPU 只需通過LocalIO 總線向TX_FIFO 中寫入數(shù)據(jù),當TX_FIFO 不為空時,TX_FIFO 中的數(shù)據(jù)就會被UART_TX 模塊自動發(fā)送出去,直到TX_FIFO 空為止。在接收數(shù)據(jù)的過程中,如果沒有接收FIFO,則串口每接收完一個數(shù)據(jù)后,F(xiàn)PGA 就會產生一次接收中斷輸出,如果進行大量數(shù)據(jù)的持續(xù)傳輸,則會導致CPU 一直進入中斷,造成CPU 死機。為了避免在數(shù)據(jù)接收過程中的頻繁中斷問題,需要在接收側設計接收FIFO(RX_FIFO)。在該UART IP 核中,TX_FIFO 與RX_FIFO 的容量設計為256Byte,F(xiàn)IFO使用Xilinx 自帶的IP 核實現(xiàn)。TX_FIFO 自動發(fā)送與RX_FIFO 自動接收的狀態(tài)機設計,如圖5 所示。
圖5 FIFO 讀寫控制狀態(tài)機a)TX_FIFO 自動發(fā)送狀態(tài)機;b)RX_FIFO 自動接收狀態(tài)機Figure 5 FIFO read and write control state machine a)TX_FIFO automatic receiving state machine b)RX_FIFO automatic transmission machine
一個系統(tǒng)是否具有中斷功能,決定了該系統(tǒng)對外部資源的消耗情況以及該系統(tǒng)的兼容性。如果一個系統(tǒng)沒有中斷功能,則需要消耗大量的CPU 資源去查詢該系統(tǒng)的當前狀態(tài),同時也會降低該系統(tǒng)的對外兼容性。為了降低UART IP 核對CPU 資源的消耗,提高串口通信的實時性,該UART IP 核設計了接收中斷系統(tǒng)[6],該接收中斷具有閾值機制與超時機制。閾值機制的功能是:當接收數(shù)據(jù)的字節(jié)個數(shù)小于設定的閾值時,不產生中斷;當接收數(shù)據(jù)的字節(jié)數(shù)大于設定的閾值后,產生中斷,它可用于基于串口幀的自定義通信協(xié)議中斷適配。超時機制用于在通信的過程中接收數(shù)據(jù)一直無法達到設定閾值進而無法正常產生中斷,導致中斷一直無法輸出的情況。該UART IP 核的中斷系統(tǒng)由中斷寄存器與中斷控制邏輯兩部分組成。中斷寄存器包括中斷使能寄存器、中斷狀態(tài)寄存器、閾值配置寄存器、超時配置寄存器。中斷控制的處理邏輯如圖6 所示。該中斷采用電平的方式輸出,并且具有自動清除中斷的功能。當UART IP 核的接收中斷產生時,中斷輸出引腳置為高電平,當CPU 讀取RX_FIFO 中的數(shù)據(jù)后中斷輸出自動清除,同時中斷狀態(tài)寄存器的相應標志位自動清零,不需要CPU 手動清除中斷標志。
圖6 中斷生成控制流程Figure 6 Control flow of interrupt generation
為了使FPGA 運行過程中CPU 能夠在線對UART IP 核的參數(shù)進行配置[7],設計了獨立的配置模塊(UART_ CONFIG 模塊),用于保存UART IP核的各種配置參數(shù)。配置模塊由各種配置寄存器構成,CPU 通過Local IO 接口可以對這些寄存器進行讀寫操作。配置參數(shù)主要包括UART 協(xié)議基本配置參數(shù)、中斷配置參數(shù)等[8]。配置模塊的寄存器詳細設計如表1 所示。
表1 寄存器名稱、含義及訪問地址Table 1 Register name,meaning and access address
Local IO 處理模塊用于實現(xiàn)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 讀數(shù)據(jù)仿真結果Figure 9 Local IO read data simulation results
圖10 Local IO 寫數(shù)據(jù)仿真結果Figure 10 Local IO write data simulation results
為了驗證UART IP 核設計的正確性,將程序下載到FPGA中[9-10]。首先測試UART IP 核的接收功能,利用串口調試助手向FPGA 的一號通道發(fā)送數(shù)據(jù),F(xiàn)PGA 收到數(shù)據(jù)后產生中斷,并通過Local IO接口將數(shù)據(jù)發(fā)送給龍芯CPU,龍芯CPU 讀取數(shù)據(jù)并打印出讀取的結果,隨機抽取兩組測試結果如圖11 所示,每組結果中上方為串口調試助手發(fā)送的數(shù)據(jù),下方為CPU 接收的數(shù)據(jù)。由結果可知,功能正確。接著測試UART IP 核的發(fā)送功能,龍芯CPU通過Local IO 接口向FPGA 的1 號通道發(fā)送數(shù)據(jù),F(xiàn)PGA 收到數(shù)據(jù)后將數(shù)據(jù)發(fā)送給串口調試助手,隨機抽取4 組數(shù)據(jù),其結果如圖12 所示。圖12 中上方為CPU 發(fā)送的數(shù)據(jù),下方為串口調試助手接收的數(shù)據(jù)。由圖12 可知,發(fā)送與接收的數(shù)據(jù)一致,表明設計正確。
圖11 串口數(shù)據(jù)接收測試結果a)測試結果1 b)測試結果2Figure 11 Serial port data receiving test result a)test result 1 b)test result 2
圖12 串口數(shù)據(jù)發(fā)送測試結果Figure 12 Serial port data transmission test results
本文根據(jù)龍芯CPU Local IO 接口的特點,設計了適配Local IO 接口的UART IP核,解決了龍芯CPU 通過FPGA 擴展UART 接口的需求。在設計時采用模塊化設計的思想,增強了IP 核的可裁剪性。在設計中斷系統(tǒng)時引入接收閾值機制與接收超時機制,避免頻繁產生中斷的現(xiàn)象發(fā)生,提高了IP 核與CPU 的兼容性,增強了龍芯CPU 在設計中的普適性。該IP 核在Vivado 中綜合實現(xiàn)后,消耗的資源情況為:LUT 1212個,LUTRAM 26個,F(xiàn)F 1822個,BRAM 1 個。