郭永超 李淯陽 潘波
(重慶金美通信有限責任公司 重慶市 400030)
多路遠傳信號跨單元板傳輸時,若把所有的信號線一對一連接,由于線數太多造成PCB 布線困難,且占用大量FPGA 管腳,因此需要把多路的串行碼流復接成一路TDM 幀進行跨單元板傳輸,從而達到減少線數,節(jié)約資源的目的。
板間傳輸的難點有二,一是時鐘抖動造成滑碼[1],二是時鐘和數據的相位偏移造成誤碼。時鐘抖動主要由于遠傳模塊時鐘質量不好引起,時鐘和數據的相位偏移主要由于時鐘和數據PCB 布線長度不一致以及各種干擾引起。
有線傳輸模塊共有8 路遠傳,可實現256kbit/s、512kbit/s、1024kbit/s、2048kbit/s 的傳輸速率。本方案設計了三個單元板,有線傳輸模塊位于單元板一,該單元板完成有線傳輸模塊的數據收發(fā)、TDM 成幀、解幀。單元板二完成遠傳數據收發(fā)、TDM 成幀、解幀,遠傳數據處理。單元板一、二的區(qū)別在于一個做主模塊,一個做從模塊。另有一塊聯絡板,為單元板一和二供電,并把兩者之間的相關信號連接起來。
TDM 幀由tdm_clk、tdm_fs、tdm_txd、tdm_rxd 這四個信號組合實現。tdm_clk 是時鐘信號,頻率為32MHz,其它信號均與之對齊;tdm_fs 是幀起始信號,表示一幀的開始,其脈沖寬度為一個tdm_clk 周期;tdm_txd 和tdm_rxd 表示發(fā)送和接收的TDM 數據。采用自定義的幀格式[2],一幀劃分為16 個時隙,每個時隙8 個bit,前8 個時隙發(fā)送8 路遠傳數據,后8 個時隙發(fā)送單元板之間的控制維護消息,每路遠傳的波特率為2Mbps,,如要調整傳輸速率,只需要調整tdm_clk 即可,但是要注意與遠傳時鐘匹配。
發(fā)送模塊主要完成遠傳時鐘、數據同步,串并轉換,block-RAM 讀寫,時隙分配,TDM 幀發(fā)送等功能。其具體數據處理流程如圖1所示,可分為九個步驟。
圖1:TDM 發(fā)送模塊數據處理流程
(1)打拍緩存,消除亞穩(wěn)態(tài)[3]。采用上升沿檢測的方式把遠傳時鐘和數據同步到系統(tǒng)時鐘上來,數據放到寄存器組txdata_temp。
(2)移位寄存。為每一路遠傳都設置一個32bit 的移位寄存器,在遠傳時鐘的上升沿把txdata_temp[1]放入移位寄存器的最低位txdata_shift[0],同時txdata_shift 左移一位。
(3)串并轉換。每一路遠傳都有一個計數器對移位寄存器接收的數據進行計數,每記滿32bit 就把txdata_shift 中的數據放入txdata_parallel,實現了串并轉換為寫入block-RAM 做好了準備。
(4)數據寫入block-RAM 進行緩存。為了消除遠傳時鐘的抖動造成的滑碼,采用block-RAM 來緩存數據,本設計所采用的FPGA 芯片是xilinx 公司的K7 系列,一個block-RAM 的數據寬度為36 位(實際只用到低32 位,高4 位置0);尋址范圍0-511,9位地址線[4,5]。對于一路遠傳而言,它的時鐘頻率較低,數據量不大,較小的緩存容量就足以應對時鐘抖動引起的滑碼問題。為了節(jié)約block-RAM 資源,把一個block-RAM 做地址分割,共分為8 個緩存通路,高3 位地址線作為通路地址,低6 位地址線作為通路內地址,這樣每一路的緩存容量為32bit*64=2048bit。為了避免數據溢出,為每一通路設置一個門限,只有在門限內才允許對通路內的數據進行讀寫。門限由三個參數組成,寫上限、讀開始、讀下限,比如設置寫上限為2000bit、讀開始門限為1000bit、讀下限為50bit,當通道內的數據量大于2000bit 時不允許寫入,數據量大于1000bit 時開始讀出數據,數據量小于50bit 時不允許讀數據,理想情況下通道的讀寫速率是一致的,這樣通道內的數據量就會保持在中間值左右,從而最大限度的發(fā)揮“緩沖”作用。txdata_parallel 每更新一次,產生一次寫使能信號,相應通路的寫使能有效且通道內數據量未達到寫上限時,數據才能夠寫入。
(5)數據從block-RAM 讀出。讀使能信號有效時,在幀定位信號tdm_fs 的節(jié)拍下,遠傳數據從block-RAM 讀出并放入寄存器組dataout_temp,控制維護消息由FPGA 內部模塊產生,與遠傳數據相互獨立。
(6)打一拍時序對齊。數據從block-RAM 到dataout_temp 的過程,因為各通道的讀使能信號不一定同時有效,所以dataout_temp 數組中各通路的數據不一定同時變化,后一級寄存器組需要做雙字到字節(jié)轉換,每一個tdm_fs 周期要分四次從前一級的寄存器組取一個字節(jié)的數據,有可能四個字節(jié)還沒取完dataout_temp 中的數據就改變了,導致數據丟失,因此有必要插入一個寄存器組dataout_temp2,在tdm_fs 的節(jié)拍下把dataout_temp 賦值給dataout_temp2,為雙字到字節(jié)轉換做準備。
(7)雙字到字節(jié)轉換。因為TDM 幀格式的每一個時隙有8bit,而block-RAM 出來的數據是32bit,需把四字節(jié)的數據轉成單字節(jié),轉換后的數據放入寄存器組dataout_toByte。
(8)按時隙順序把各通道數據放入移位寄存器。dataout_toByte 的16 個寄存器對應16 個時隙,計數器每計滿8 個bit 就從dataout_toByte 中取一個字節(jié)數據出來,其數據位D7 放入tdmdata,D6~D0 放入tdmdata_shift 的D7~D1。
(9)在tdm_clk 的節(jié)拍下,把tdmdata_shift 的最高數據位D7放入tdmdata,同時tdmdata_shift 整體左移一位,這樣就完成了八路遠傳數據,及八路控制消息的成幀和發(fā)送過程。
接收模塊完成遠傳時鐘、數據同步,移位寄存,解幀,數據發(fā)送等功能。在數據的接收端,因為TDM 信號經過了跨板傳輸,受PCB 布線等因素影響,TDM 時鐘、幀定位、數據信號之間的相位關系難免發(fā)生偏移,需對遠傳數據做一定處理才能正確解碼。數據處理流程如圖2所示。
圖2:TDM 接收模塊數據處理流程
(1)打拍緩存,消除亞穩(wěn)態(tài)。首先用一個高倍時鐘對tdm_clk、tdm_fs、tdm_rxd 進行同步,同步數據放入tdmdata_temp 寄存器。
(2)移位寄存。在tdm_clk 的節(jié)拍下把同步后的數據依次存入一個8 位的移位寄存器,每8bit 取一個時隙的數據出來放入寄存器組byte_temp。
(3)打一拍時序對齊。為了便于后續(xù)處理,把寄存器組byte_temp 的值在tdm_fs 的節(jié)拍下賦給寄存器組byte_temp2,byte_temp2的前8 路是遠傳數據,要對外發(fā)送,后面8 路是兩個單元板的控制維護消息,內部使用。
(4)移位寄存,并串轉換。在每一個tdm_fs 的上升沿把byte_temp2 的前8 個通道的數據賦值給移位寄存器組txdata_shift,在每一個遠傳時鐘的上升沿(2MHz,FPGA 內部產生),把rxdata_shift 的每一路的最高位賦值給相應的rxdata 管腳,至此完成了TDM 接收模塊的解幀和遠傳數據對外發(fā)送。
接收模塊沒有用block-RAM 做數據緩存,因為接收端主要解決的問題是相位對齊,因此只需要打拍消除亞穩(wěn)態(tài),并用系統(tǒng)時鐘進行邊沿采樣,就能正確的接收數據,同時接收端的遠傳數據處理模塊的收時鐘是由FPGA 內部產生,不存在時鐘抖動的問題,因此解碼后的數據也不需緩存就可直接發(fā)出。
tdm_clk 和tdm_fs 都是單向的,所以兩個單元板必須一個做主一個做從。時鐘預處理模塊通過參數化的配置實現主從切換,當配置為主時,模塊自身生成tdm_clk 和tdm_fs,除了給板內的收發(fā)模塊提供以外還對外提供;配置為從時接收板外的tdm_clk 和tdm_fs,與板內主時鐘同步后提供給板內的收發(fā)模塊。
TDM 數據在發(fā)送端成幀之前需要經過block-RAM 緩存,緩存大小及門限值影響時延大小。每個通道的緩存容量為2048bit,寫上限為2000bit、讀開始門限為1000bit、讀下限為50bit,數據時鐘為2MHz。最小時延Tmin=25us,典型時延Ttyp=500us,最大時延Tmax=1000us。
本文提出了一種基于FPGA 實現多路遠傳TDM 數據幀板間傳輸的方案, 在TDM 幀的發(fā)送端使用一個雙端口RAM,實現了8路遠傳數據的緩存及跨時鐘域同步,既節(jié)約了資源又有效的解決了滑碼的問題,采用自定義的幀格式,在傳輸遠傳數據的同時還能傳輸單元板間的控制維護消息,具有一定的擴展性。