李 淼 吳必旗 李娟娟 王興波
南京熊貓漢達科技有限公司
隨著衛(wèi)星通信系統(tǒng)規(guī)模擴大、復(fù)雜程度加深,兩個或多個芯片的集成在邏輯設(shè)計中的應(yīng)用也越來越多。在芯片之間,數(shù)據(jù)的互相傳遞是經(jīng)常會遇到的問題。兩個不同的芯片之間會存在硬件電路的開銷有限,為了使數(shù)據(jù)能夠成功、可靠傳輸,本文在設(shè)計FPGA接口時,選擇了同步串行接口(Serial Peripheral Inter face,SPI)的高速分時復(fù)用/解復(fù)用的方式。
與I2C、UART、HDLC等總線接口相比,SPI有全雙工模式、電路結(jié)構(gòu)簡單、速度快、通信可靠等優(yōu)點,在集成電路飛速發(fā)展的近幾年應(yīng)用非常廣泛。利用SPI接口具有硬件開銷小的特點,本文設(shè)計了一種基于SPI接口高速復(fù)用模塊的方法,此外,采用XILINX公司的Kintex-7系列開發(fā)芯片,實現(xiàn)了電路的硬件驗證。在應(yīng)用于通信系統(tǒng)時,設(shè)計過程中很多變量(如:變量1,變量2,變量3等)都采用參數(shù)形式,在應(yīng)用于具體的工程實踐中,可以根據(jù)實際需要更改參數(shù)。FPGA的SPI高速分時復(fù)用/解復(fù)用實現(xiàn)流程如圖1所示,由復(fù)用模塊、解復(fù)用模塊、保密機共3個功能模塊組成。
圖1 FPGA實現(xiàn)流程
復(fù)用模塊和解復(fù)用模塊的FPGA設(shè)計思路:(1)復(fù)用模塊,主要功能是通過提速實現(xiàn)數(shù)據(jù)的分時復(fù)用。首先,在復(fù)用模塊(即FPGA 1)中用主時鐘分頻的業(yè)務(wù)速率鐘對4路(可變參數(shù)1)SPI總線數(shù)據(jù),分別采用兩個異步fifo進行32 bit(可變參數(shù)2)的乒乓緩存,使數(shù)據(jù)的速率提升至10 MB級別;其次,在每小包前加上8 bit(可變參數(shù)3)的接口協(xié)議,包括業(yè)務(wù)類型及包序號,進行4∶1復(fù)用。復(fù)用輸出的1路SPI總線數(shù)據(jù)以快時鐘下降沿輸出。(2)解復(fù)用模塊,主要功能是通過降速還原4路SPI數(shù)據(jù)。首先,在解復(fù)用模塊(即FPGA 2)中將快時鐘同步至主時鐘,并用快時鐘上升沿對SPI總線數(shù)據(jù)進行采樣;其次,采用異步雙口ram讀寫進行1∶4解復(fù)用,使數(shù)據(jù)的速率下降到原來的業(yè)務(wù)速率,從而保證了bit流不會斷。解復(fù)用將模塊FPGA 1中輸出的1路SPI總線數(shù)據(jù)還原成4路SPI總線數(shù)據(jù),并將其送入保密機進行加解密。
需要說明的是,快時鐘的周期T是主時鐘的整數(shù)倍,為了保證主時鐘能夠進行可靠的采樣,本文推薦快時鐘的周期至少大于6個主時鐘周期。
利用該設(shè)計方法在XILINX FPGA器件上實現(xiàn)兩個Kintex-7芯片之間的SPI總線數(shù)據(jù)傳輸,如圖2所示,其中,圖2(a)展示了一組利用復(fù)用方法實現(xiàn)SPI總線數(shù)據(jù)高速傳輸過程的仿真波形圖,4路數(shù)據(jù)同一時刻發(fā)送,傳輸?shù)臄?shù)據(jù)為7 bit固定數(shù)“1110100”,方便觀察。
(1)復(fù)用模塊先用主時鐘分頻的時鐘上升沿脈沖clken1、clken2、clken3、clken4分別對4路待發(fā)送數(shù)據(jù)din1、din2、din3、din4進行32 bit的循環(huán)計數(shù),并做乒乓緩存,最終實現(xiàn)4∶1高速復(fù)用輸出。圖2中的cout、eout、dout為復(fù)用的輸出SPI總線,前8 bit為接口協(xié)議。圖2(b)展示了放大后的時序圖,可觀察到使能和數(shù)據(jù)與輸出時鐘下降沿對齊。
圖2 FPGA實例利用復(fù)用實現(xiàn)數(shù)據(jù)傳輸過程仿真波形圖
(2)復(fù)用模塊中的關(guān)鍵技術(shù)難點在于異步fifo需要同時讀數(shù)時優(yōu)先級的選擇,需要用狀態(tài)機進行讀請求的輪詢,實現(xiàn)SPI接口的分時復(fù)用。仿真得到的波形如圖3所示。仿真代碼是通過三段式狀態(tài)機來實現(xiàn)的,當(dāng)前狀態(tài)(current_state)包括4種循環(huán)狀態(tài):idle = 3'b000,wait = 3'b001,read1 = 3'b011,read2 = 3'b100,其中,idle為初始態(tài),wait等待是對fifo的讀請求進行輪詢。首先,將8個fifo的讀請求從低到高分別存入8位寄存器ok_reg中;其次,輪詢方式為flag循環(huán)計數(shù),計數(shù)器的計數(shù)范圍為0~8,當(dāng)ok_reg[flag]=1時,響應(yīng)讀請求,狀態(tài)跳變至讀取狀態(tài)read1,加上8 bit接口協(xié)議,完成后跳變至fifo讀取狀態(tài)read2,對應(yīng)fifo的讀使能拉高,讀至fifo為空,并在狀態(tài)機外清空對應(yīng)的ok_reg[flag]。上述狀態(tài)完成后,再次進入初始態(tài)idle,開始第二次輪詢。FPGA狀態(tài)機實現(xiàn)過程仿真波形圖如圖3所示。
(3)進入解復(fù)用模塊后,先將SPI接口總線同步到模塊FPGA 2的主時鐘中;然后,將cin上升沿采樣輸入的SPI數(shù)據(jù),并用異步雙口ram進行1∶4解復(fù)用,從1路SPI數(shù)據(jù)中還原出4路解復(fù)用后的數(shù)據(jù)SPI1、SPI2、SPI3和SPI4;最后,經(jīng)下降沿對齊后送入保密機。
為了展示該方法的實用性,本文還對編寫好的程序經(jīng)JTAG端口下載到FPGA開發(fā)板上進行實驗驗證,并利用調(diào)制解調(diào)進行中頻自環(huán),CPU通過hdlc接口與FPGA接口進行數(shù)據(jù)交互,實驗結(jié)果顯示中頻自環(huán)無丟包、無誤碼。
從仿真數(shù)據(jù)和實驗結(jié)果可以看出,本文提出的SPI接口復(fù)用、解復(fù)用實現(xiàn)數(shù)據(jù)傳輸?shù)姆椒ú粌H適用于芯片之間的傳輸,也適用于跨板子之間的數(shù)據(jù)傳輸,且延時小、操作簡單。此外,本方法在無丟包、無誤碼的前提下還可以有效節(jié)省硬件線路的開銷(如實例:在模塊FPGA 1中節(jié)省了3路SPI總線數(shù)據(jù)),從而大大提高了數(shù)據(jù)傳輸效率,具有較強的可操作性和應(yīng)用價值。