蒙宇霆,袁海英,丁 冬
(北京工業大學 信息學部微電子學院,北京 100124)
復雜電子系統設計對數據傳輸速率的要求日益嚴格,也帶來高功耗、高成本等問題,低壓差分信號(LVDS)[1]是一種高性能數據傳輸技術,它是速度、成本和功耗之間的最佳折中方案。在物理層電路設計方面,LVDS 的低壓擺幅(250 mV~450 mV)和快速過渡時間可以使數據傳輸速率達到100 Mb/s~3 Gb/s,能夠滿足現代復雜系統設計中對數據傳輸的需求。此外,這種低壓擺幅可以降低功耗消散,具備差分遠距離傳輸[2]的優點。在當今大量數據傳輸的諸多場景中,如芯片間的信息傳輸[3-4]、視頻圖像處理[5-6]、光通信[7]和LCD 面板[8]等,LVDS 已成為最有前景的解決方案之一。在數字邏輯功能設計方面,由于需求、協議和應用場景的差異[9-10],設計人員存在大量重復性的設計、調試工作。為提高系統開發效率,解決平臺間的兼容性問題,通常在FPGA 平臺上實現LVDS高速接口設計[11-13],文獻[11]在FPGA 上實現了LVDS 總線控制器,解決了多節點高速通信的故障隔離問題;文獻[12]實現了LVDS 接口的收發單元設計,在收發通路中加入數據與時鐘對齊機制,提高了平臺兼容性,并在FPGA 上驗證了方案。文獻[14]通過FPGA 設計了一種基于LVDS 接口的高速并行數據傳輸系統,并應用于實際專用網絡交換模塊。在實際芯片工程中,考慮到當LVDS控制器集成到SoC 系統上時存在兼容性問題,軟硬件間應有更高的操作靈活度,系統各模塊間數據傳輸應高速穩定。因此,為了提高系統可靠性,降低成本,設計一種高靈活度、高性能的LVDS 控制器具有很高的價值。
本文設計的控制器主要用于由攝像頭采集而來的數據與內存的交互,更加關注邏輯功能的實現。基于APB 總線的可配置通路可通過配置寄存器按照自定義協議傳輸數據,在數據讀寫方面選擇AXI 總線以提高數據傳輸速率,針對數據傳輸過程中常見的丟數等錯誤,在收發通路中加入了檢查模塊,實現了更加靈活準確的數據傳輸功能。
基于AXI 總線的LVDS 控制器總體結構設計如圖1所示,該控制器的數據流以及主要控制寄存器信號展示在圖中。電路內部主要由Rx_decoder、Tx_assemble、Axi_wr_ctrl、Axi_rd_ctrl、Configurable_reg 等模塊組成。為了在SoC 系統中利用軟件控制數據傳輸,加入了基于APB 總線接口的可配置模塊Configurable_reg,用于提供與CPU交互的接口,可通過APB 配置通路配置寄存器來控制LVDS 模塊收發數據幀。

圖1 LVDS 總體結構
為了靈活地控制數據傳輸,本文自定義了一種數據接收和發送的協議:數據是幀的形式傳輸,幀由命令包和數據包構成,如圖2 所示。命令包中包含了狀態、響應類型、幀數以及包數等字段。在數據接收過程中,Configurable_reg 模塊的使能寄存器Reg_rx_en 會控制是否接收數據。若將Reg_rx_en 配置為1,模塊Rx_decoder 將收到的第一個35 位命令包進行解析,若Rx_decoder 模塊檢測到FRAME_START 狀態,則開始接收數據。接下來收到數據包,為確保數據正確傳輸,35 位數據包中帶有兩位奇偶校驗位,最低位是1,表示此時接收的是數據包,最高32 位是數據字段。最后收到帶結束狀態FRAME_END 的CMD 命令包。相應地,數據發送使能由Configurable_reg 模塊的寄存器Reg_tx_en 控制,Tx_assemble 模塊則會將數據按照自定義的協議封裝、打包、發送出去。

圖2 數據傳輸格式
數據接收流程:LVDS 控制器接收到對端設備的數據幀,由Rx_decoder 模塊進行解析后,將數據傳輸到Axi_wr_ctrl 控制模塊。考慮到這兩個模塊在數據傳輸過程中時鐘域不一致,采用異步FIFO 做跨時鐘域處理。Axi_wr_ctrl 模塊將接收到的32 位數據轉化為64 位數據,并通過Axi 總線將其送到DDR 中。數據發送通路中的主要功能模塊介紹如下。
Rx_decoder 模塊的作用是解析對端設備傳來的數據幀中的命令包,并檢查數據包是否出錯,它的控制狀態機如圖3 所示,分別有S_IDLE、S_RECV、S_CKER、S_WAIT和S_STOP 五個狀態。S_IDLE 表示此時沒有數據幀正在接收,可以接收新的數據幀。當收到CMD 命令包的幀頭開始信號。

圖3 Rx_decoder 模塊狀態機
frame_start 時,會從S_IDLE 狀態跳到S_RECV 狀態,此時開始接收數據。為了避免在接收過程中發生數據丟失或數據傳輸錯誤的現象,增加了S_WAIT 和S_CKER 兩個狀態。當Rx_fifo_full 信號置1 時,表示此時接收FIFO是滿狀態,狀態機從S_RECV 跳轉到S_WAIT,等待接收FIFO 為空時再由S_WAIT 跳回S_RECV 繼續接收數據。
當奇偶校驗檢查到數據不一致時,狀態機會從S_RECV狀態跳轉到S_CKER 狀態,在S_CKER 狀態意味著數據傳輸發生錯誤,需要等待重新開始的信號,如果此時收到了frame_start 信號,表示要接收新的數據幀,因此狀態機從S_CKER 跳轉到S_RECV。每進來一個數據包都會進行奇偶校驗檢查,檢查正確則會繼續傳入剩余的數據包,直到收到CMD 命令包的幀尾結束信號frame_end,狀態機從S_RECV 狀態跳轉到S_IDLE 狀態,表示完成了這一幀數據的接收。CPU 中斷是最高優先級,不論在空閑狀態S_IDLE 還是S_RECV 數據接收狀態,當Rx_en 寄存器為0 時,會直接從S_IDLE 狀態或S_RECV 狀態跳到S_STOP 狀態。
Axi_wr_ctrl 模塊用來控制從Rx_decoder 模塊接收的數據通過AXI 寫通道寫到DDR,其控制狀態機如圖4所示,包括S_IDLE、S_WORK 和S_CLER 三個狀態。狀態機是否工作取決于rx2axi_start 和work_done 兩個信號,這兩個信號是Rx_decoder 模塊檢測到開始標志和結束標志時傳到Axi_wr_ctrl 模塊的控制信號。當rx2axi_start置1 時,由S_IDLE 狀態跳轉到S_WORK 狀態,S_WORK狀態下會將進來的32 位數據整合為64 位數據并送到AXI 寫通道,按照AXI 協議控制數據寫到DDR 中。如果AXI 寫回應通道發生錯誤響應,clear 信號會置1,狀態機由S_WORK 狀態跳轉到S_CKER 狀態,在S_CKER 狀態下,會將此時FIFO 里的數據全部清除,清除完畢后跳轉到S_IDLE 狀態,等待rx2axi_start 置1 時重新開始傳輸。此外,為了更加靈活地配置AXI 的功能,在Axi_wr_ctrl 模塊中加了兩個可配置寄存器用于改變AXI 通道中每次突發傳輸數據的個數和寫入DDR 的起始地址。

圖4 Axi_wr_ctrl 模塊狀態機
數據發送流程:Axi_rd_ctrl 模塊接收到來自DDR controller 的數據流后,開始進行數據位寬轉換,經過異步FIFO 的跨時鐘域處理,送到TX_assemble 模塊將數據進行打包,再發送到對端設備。數據發送通路中的主要功能模塊介紹如下。
Tx_assemble 模塊的功能由狀態機控制,如圖5 所示,分別有S_IDLE、S_SEND、S_ERRO、S_CLER 和S_WAIT 這5 個狀態。S_IDLE 表示此時沒有數據幀正在發送,當CPU 要發送數據的時候,會配置Tx_en 寄存器為1,從S_IDLE 狀態跳轉到S_SEND 狀態。同時,Tx_assemble 模塊會生成控制信號并通過握手協議發送到Axi_rd_ctrl 模塊。S_SEND 狀態表示即將發送數據。根據自定義協議,每個35 位的命令包中包含要發送的幀數、包數、響應類型和狀態信息,Tx_assemble 模塊會用計數器來統計發送的幀數、包數及狀態信息,然后將這些信息打包。每個35 位數據包中包含32 位數據、2 位奇偶校驗位及1 位說明位(指明是數據還是命令)。最后Tx_assemble 模塊將命令包和數據包合并為數據幀由狀態機控制發送。

圖5 TX_assemble 模塊狀態機
Axi_rd_ctrl 模塊接收來自Tx_assemble 模塊的命令并把當前狀態信息返回Tx_assemble 模塊。若Tx_assemble模塊開始發送數據的同時向Axi_rd_ctrl 模塊發送讀控制信號,那么Axi_rd_ctrl 模塊將會通過AXI 讀通道從DDR讀出數據并寫入讀FIFO 中。為了靈活配置,Axi_rd_ctrl模塊也包含了可配置寄存器來設置axi 起始的讀地址和突發式讀寫的數據數量。
為驗證本文提出的LVDS 控制器設計方案,搭建如圖6 所示的測試平臺,利用Synopsys 公司的仿真軟件VCS 和Verdi 進行功能仿真驗證。測試平臺的主要功能包括:提供與LVDS 控制器進行數據交互的BRAM(模塊級驗證用BRAM 代替DDR);為驗證APB 總線配置寄存器功能,根據APB 總線協議生成可配置環境;根據自定義的LVDS 控制器收發協議,在測試平臺內生成完整的數據幀,包括數據包和命令包等;將所有測試平臺所需的環境以及待測的LVDS 控制器集成,構建完整的驗證環境。

圖6 LVDS 控制器的測試平臺
為了簡化復雜的驗證過程,考慮到LVDS 控制器特有的收發通路,提出了一個高效的驗證方案:在驗證平臺上根據自定義協議配置環境,向LVDS 控制器發送完整的數據幀,數據由LVDS 控制器的接收通路收到之后通過AXI 接口寫入BRAM,此時再利用驗證平臺的APB環境通過配置寄存器將存到BRAM 里的數據幀讀出,由發送通路發送回驗證平臺,驗證平臺將發送出去的數據幀和收到的數據幀進行比對,最后給出驗證結果。根據上述驗證方案,將驗證流程分為以下三部分:
(1)驗證LVDS 控制器配置通路
通過APB 總線接口完成初始配置,設置收發數據包數量、AXI 總線突發式讀寫的數據數量和DDR 的基地址。仿真波形如圖7 所示,APB 通道分別對6 個地址進行讀寫,對應下面6 組寄存器改變為相應的值,表明APB 配置通路功能正確,能按照標準APB 協議對可配置寄存器進行讀寫操作。

圖7 APB 配置通路波形
(2)驗證LVDS 控制器接收通路
完成APB 配置通路的初始化后,將驗證平臺生成的數據幀按照自定義協議由lvds_rx_data 輸入端口發送到LVDS 控制器,發送數據幀前先通過配置通路配置lvds_rx_enable 寄存器,將接收通路的使能信號打開,其仿真波形如圖8 所示。APB總線地址0x10 的第一位寫入1 之后,lvds_rx_enable 信號被拉高,這意味著接收通路將要接收數據。隨后,lvds_rx_data 輸入端口收到數據幀的幀頭,即圖9 中lvds_rx_pdata信號的0x102,根據之前命令包的定義,0x102 表示發送的幀數為一幀,此包類型為開始狀態。接收到開始命令包后,等待10 個周期再開始接收128 個數據包。數據包接收完之后緊接著接收到幀尾命令包,即圖10 中lvds_rx_pdata 信號的0x104。接收過程中,接收通路的Rx_decoder 模塊會控制異步FIFO 和Axi_wr_ctrl 模塊將128 個32 位數據合并為64 個64 位數據寫到BRAM 中。圖11 顯示,接收到的數據通過AXI 寫通道全部寫入BRAM 里,說明接收通路功能實現正確。

圖8 配置lvds_rx_enable 寄存器波形圖

圖9 幀頭波形

圖10 幀尾波形

圖11 寫入BRAM 的數據波形
(3)驗證LVDS 控制器發送通路
根據所述驗證方案,首先通過配置通路配置lvds_tx_en寄存器將發送通路的使能信號打開,仿真波形如圖12 所示。APB 總線地址0x00 的第一位寫入1 之后,lvds_tx_en信號被拉高,這意味著發送通路將要發送數據。隨后,Tx_assemble 模塊發送控制信號控制Axi_rd_ctrl 模塊和異步FIFO,Axi_rd_ctrl 模塊先將64 個64 位數據轉化為128 個32 位數據,再經過異步FIFO 發送到Tx_assemble模塊中,最后,Tx_assemble 模塊將接收到的數據打包發回驗證平臺。圖13 顯示,Axi_rd_ctrl 模塊通過AXI 讀通道將BRAM 中的數據讀出。由圖14 和圖15 可見,Tx_assemble 模塊將幀頭、數據幀和幀尾發送回驗證平臺,且驗證平臺發出的數據與收到的數據一致,故發送通路功能實現正確。

圖12 配置lvds_tx_en 寄存器波形圖

圖13 讀出BRAM 的數據波形

圖14 幀頭波形

圖15 幀尾波形
本文設計了一種基于AXI 總線的可配置LVDS 控制器,可通過APB 總線配置寄存器按照自定義協議收發數據,具有與內存交互的AXI 高速總線通道,滿足高性能數據傳輸需求。最后,針對該控制器的接收通路和發送通路提出了高效的驗證方案。驗證結果表明該控制器可以在SoC 系統上使用自定義協議高效無誤地進行數據傳輸。該設計方案已經集成到基于ARM 的SoC 上并完成了系統級驗證,驗證過程充分體現了軟硬件協同工作的靈活性。LVDS 控制器內部工作時鐘頻率為50 MHz,外部串并轉換通道時鐘為350 MHz,滿足視頻數據傳輸需求;當LVDS 控制器在更高時鐘頻率下工作時,可通過改善電路設計進一步提升數據傳輸效率。