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