李 淼 吳必旗 李娟娟 王興波
南京熊貓漢達科技有限公司
隨著衛星通信系統規模擴大、復雜程度加深,兩個或多個芯片的集成在邏輯設計中的應用也越來越多。在芯片之間,數據的互相傳遞是經常會遇到的問題。兩個不同的芯片之間會存在硬件電路的開銷有限,為了使數據能夠成功、可靠傳輸,本文在設計FPGA接口時,選擇了同步串行接口(Serial Peripheral Inter face,SPI)的高速分時復用/解復用的方式。
與I2C、UART、HDLC等總線接口相比,SPI有全雙工模式、電路結構簡單、速度快、通信可靠等優點,在集成電路飛速發展的近幾年應用非常廣泛。利用SPI接口具有硬件開銷小的特點,本文設計了一種基于SPI接口高速復用模塊的方法,此外,采用XILINX公司的Kintex-7系列開發芯片,實現了電路的硬件驗證。在應用于通信系統時,設計過程中很多變量(如:變量1,變量2,變量3等)都采用參數形式,在應用于具體的工程實踐中,可以根據實際需要更改參數。FPGA的SPI高速分時復用/解復用實現流程如圖1所示,由復用模塊、解復用模塊、保密機共3個功能模塊組成。

圖1 FPGA實現流程
復用模塊和解復用模塊的FPGA設計思路:(1)復用模塊,主要功能是通過提速實現數據的分時復用。首先,在復用模塊(即FPGA 1)中用主時鐘分頻的業務速率鐘對4路(可變參數1)SPI總線數據,分別采用兩個異步fifo進行32 bit(可變參數2)的乒乓緩存,使數據的速率提升至10 MB級別;其次,在每小包前加上8 bit(可變參數3)的接口協議,包括業務類型及包序號,進行4∶1復用。復用輸出的1路SPI總線數據以快時鐘下降沿輸出。(2)解復用模塊,主要功能是通過降速還原4路SPI數據。首先,在解復用模塊(即FPGA 2)中將快時鐘同步至主時鐘,并用快時鐘上升沿對SPI總線數據進行采樣;其次,采用異步雙口ram讀寫進行1∶4解復用,使數據的速率下降到原來的業務速率,從而保證了bit流不會斷。解復用將模塊FPGA 1中輸出的1路SPI總線數據還原成4路SPI總線數據,并將其送入保密機進行加解密。
需要說明的是,快時鐘的周期T是主時鐘的整數倍,為了保證主時鐘能夠進行可靠的采樣,本文推薦快時鐘的周期至少大于6個主時鐘周期。
利用該設計方法在XILINX FPGA器件上實現兩個Kintex-7芯片之間的SPI總線數據傳輸,如圖2所示,其中,圖2(a)展示了一組利用復用方法實現SPI總線數據高速傳輸過程的仿真波形圖,4路數據同一時刻發送,傳輸的數據為7 bit固定數“1110100”,方便觀察。
(1)復用模塊先用主時鐘分頻的時鐘上升沿脈沖clken1、clken2、clken3、clken4分別對4路待發送數據din1、din2、din3、din4進行32 bit的循環計數,并做乒乓緩存,最終實現4∶1高速復用輸出。圖2中的cout、eout、dout為復用的輸出SPI總線,前8 bit為接口協議。圖2(b)展示了放大后的時序圖,可觀察到使能和數據與輸出時鐘下降沿對齊。

圖2 FPGA實例利用復用實現數據傳輸過程仿真波形圖
(2)復用模塊中的關鍵技術難點在于異步fifo需要同時讀數時優先級的選擇,需要用狀態機進行讀請求的輪詢,實現SPI接口的分時復用。仿真得到的波形如圖3所示。仿真代碼是通過三段式狀態機來實現的,當前狀態(current_state)包括4種循環狀態:idle = 3'b000,wait = 3'b001,read1 = 3'b011,read2 = 3'b100,其中,idle為初始態,wait等待是對fifo的讀請求進行輪詢。首先,將8個fifo的讀請求從低到高分別存入8位寄存器ok_reg中;其次,輪詢方式為flag循環計數,計數器的計數范圍為0~8,當ok_reg[flag]=1時,響應讀請求,狀態跳變至讀取狀態read1,加上8 bit接口協議,完成后跳變至fifo讀取狀態read2,對應fifo的讀使能拉高,讀至fifo為空,并在狀態機外清空對應的ok_reg[flag]。上述狀態完成后,再次進入初始態idle,開始第二次輪詢。FPGA狀態機實現過程仿真波形圖如圖3所示。
(3)進入解復用模塊后,先將SPI接口總線同步到模塊FPGA 2的主時鐘中;然后,將cin上升沿采樣輸入的SPI數據,并用異步雙口ram進行1∶4解復用,從1路SPI數據中還原出4路解復用后的數據SPI1、SPI2、SPI3和SPI4;最后,經下降沿對齊后送入保密機。
為了展示該方法的實用性,本文還對編寫好的程序經JTAG端口下載到FPGA開發板上進行實驗驗證,并利用調制解調進行中頻自環,CPU通過hdlc接口與FPGA接口進行數據交互,實驗結果顯示中頻自環無丟包、無誤碼。
從仿真數據和實驗結果可以看出,本文提出的SPI接口復用、解復用實現數據傳輸的方法不僅適用于芯片之間的傳輸,也適用于跨板子之間的數據傳輸,且延時小、操作簡單。此外,本方法在無丟包、無誤碼的前提下還可以有效節省硬件線路的開銷(如實例:在模塊FPGA 1中節省了3路SPI總線數據),從而大大提高了數據傳輸效率,具有較強的可操作性和應用價值。