如今,無線系統無處不在,無線設備和服務的數量也在持續增長。完整RF系統的設計是一項多學科設計挑戰,其中模擬RF前端是最關鍵的部分。然而,AD9361等集成RF收發器的可用性大大降低了此類設計的RF挑戰。這些收發器為模擬RF信號鏈提供數字接口,并允許輕松集成到ASIC或FPGA進行基帶處理?;鶐?a target="_blank">處理器(BBP)允許用戶數據在終端應用和收發器設備之間的數字域中進行處理。使用系統建模工具(如 Simulink)也可以輕松設計基帶處理器設計。但是,新手用戶可能會發現很難理解和填寫通信系統難題的這一部分。本文是設計和實現用于空中通信系統的簡單RF基帶處理器的適度嘗試。該設計采用AD9361 FPGA參考設計框架,在AD-FMCOMMS2-EBZ和Xilinx ZC706平臺上實現。
本文的第一部分詳細介紹了該基帶處理器的一般設計原則。本節主要是對BBP的理論介紹。在第二部分中,使用ADI公司的AD9361 FPGA參考設計討論BBP的實際硬件實現。需要注意的是,主要設計目標是使設計盡可能簡單,并在實驗室環境中演示快速無線數據傳輸。在使用并因此干擾RF頻譜方面存在法規和其他影響。
底座設計
典型的RF系統如圖1所示,直接RF系統除外。圖 1 中僅顯示了一條數據路徑,相反的方向是該數據路徑的鏡像。本文所討論的基帶處理器允許以這樣一種方式處理數據,即在RF兩個系統之間通過空中傳輸數據。下面討論基本設計要求。
圖1.射頻系統框圖。
數據在兩個正交信號 I&Q 上重復
請注意,載波是獨立且彼此異步的。因此,發射和接收載波之間存在相位和頻率偏移。這對接收器的解調有不利影響。一個重要的問題是信號反轉,正交信號可能會反轉它們的作用,因為偏移周期性地合并和漂移。克服這種模糊性的簡單方法是在兩個正交信號上重復相同的數據。
數據串行傳輸和接收(按位)
在大多數情況下,BBP的RF前端接口是DAC和ADC。這些是模擬信號的數字接口。因此,不可能簡單地將數據發送到DAC輸入,并期望在ADC輸出端獲得相同的數據。數據串行傳輸,將單比特數據映射到DAC的全分辨率。類似地,數據以串行方式接收,從ADC的全分辨率解映射。這提供了充足的冗余。如果這些是 16 位轉換器,接收器將從可能的 65536 數據集中做出 1 或 0 的決定。僅此一項就大大簡化了解碼。
I&Q信號彼此正交
RF前端器件(如AD9361)是I/Q收發器。如果輸入是正交信號,則這些設備工作得最好。這些器件通常沿兩條數據路徑具有內部I/Q匹配和校正功能,以抵消它們之間的任何變化。慣例是實數(I)信號是余弦函數,虛數(Q)信號是正弦函數。
調制方案為 BPSK
可以部署所有常見的方法,信號的幅度,頻率或相位調制。檢測相位差相對容易。由于數據是串行傳輸的,因此自然選擇二進制相移鍵控(BPSK)。
位間隔為 8 個樣本
數據需要時序信息,位間隔。最大可能的位間隔是采樣周期。為了使接收器保持簡單,需要充足的時間來解碼信號并做出決定。最簡單的時序恢復方法是過零和峰值檢測。在這種情況下,峰值將不一致。因此,選擇過零來檢測和跟蹤位間隔。兩個系統之間也存在載波差異。在某些情況下,樣本在用戶數據的任一端可能不明確。正弦信號的每半允許四個樣本,位間隔設置為八個樣本。因此,有效傳輸速率是采樣頻率除以 8。
數據沒有直流內容
定時和相對相位恢復基于信號的過零。因此,各個信號需要不含任何直流成分。它還要求信號允許每個位間隔至少跨越一個零點。正弦信號具有這兩種特性,并且非常適合上述BPSK調制方案。
數據被打亂
用戶數據是任意的,很可能是一長串 1 或 0。需要對數據進行加擾,以便接收器的定時和相位恢復能夠更有效地跟蹤信號。
數據以數據包形式傳輸
接收器上的信號預計具有幅度、頻率和相位誤差,因為系統彼此異步。解調信號是傳輸信號相對于本地載波的相位變化。運營商可能會跟蹤一段時間,接受數據命中,然后再次跟蹤。因此,設計需要準備好承受一些數據丟失。為了支持這一點,數據以數據包的形式傳輸。可以重復幾個數據包來代替整個數據。
使用 CRC 驗證數據包
數據包帶有循環冗余校驗 (CRC),以便允許接收方在不匹配時丟棄數據包并請求再次發送數據包。
在每個前導碼期間進行時序和相位校正
數據包標頭帶有一個前導碼,用于將其與接收到的數據流區分開來。接收器還使用該前導碼來復位信號的時序和相位信息,以解調數據包數據。
內置性能指標
接收方還支持統計計數器,例如接收、丟棄或更正的數據包數。這些計數器用于測量和監控性能指標,包括誤碼率和有效數據率。
總之,數據以數據包的形式串行傳輸和接收。數據包帶有前導碼和 CRC。數據在收發器設備之前的中間正交信號上進行BPSK調制和解調。中間信號頻率,因此數據的比特率是采樣率的八分之一。具有上述設計細節的基帶處理器模塊如圖2和圖3所示。
圖2.BBP傳輸功能框圖
圖3.BBP接收功能框圖。
發送器讀取數據字節(字符寬度),并將其轉換為帶有標頭或前導碼的數據包。CRC 被添加到數據包的尾端。然后對數據包數據進行加擾和序列化。然后,單比特數據在與收發器接口之前對余弦(I)和正弦(Q)功能進行相位調制。
在接收方向上,離線模塊恢復并跟蹤調制信號的時間間隔和相對相位。此信息用于從輸入的ADC樣本中恢復串行數據。然后將它們組裝成數據包并進行解擾。在數據包的末尾,比較CRC,如果不匹配,則丟棄數據包。如果CRC匹配,則數據將傳遞給最終用戶。
實現
BBP 設計在硬件中實現和測試。該硬件是兩塊評估板的組合:采用 Zynq FPGA 器件的賽靈思 ZC706 評估板和采用 AD9361 收發器的 AD-FMCOMMS3-EBZ 評估板。ADI公司提供了支持該硬件的完整參考設計。這種開源設計是免費提供的,完全支持,并在主要工具版本中更新。硬件詳細信息可在以下 URL 中找到:
ZC706
AD-FMCOMMS3-EBZ
Zynq SOC
AD9361
ADI GitHub 存儲庫
ZC706 和 AD-FMCOMMS3-EBZ HDL 參考設計
AXI AD9361 IP
ADI參考設計是支持Linux框架的嵌入式系統。它由ARM處理器周圍的各種外圍設備組成。AD9361器件與axi_AD9361 IP外設接口。它在RF器件和系統存儲器之間傳輸原始采樣數據。??
外圍設備和設備通過 Linux 內核驅動程序進行初始化和控制。BBP 作為與axi_AD9361接口的另一個 IP 外設實現。BBP IP因歷史原因被命名為axi_xcomm2ip。Linux 中的用戶空間應用程序用于控制、發送和接收系統之間的數據。
在ADI參考設計中,axi_AD9361 IP與發射方向的解包模塊(util_upack)和接收方向的包裝模塊(util_cpack)接口。在發射方向,BBP數據插入解包模塊和AD9361內核之間。為了不影響默認數據路徑,BBP 支持可選的數據路徑多路復用器來選擇解壓縮的數據源或 BBP 數據源。BBP 允許將參考設計數據路徑作為默認路徑,并且僅在啟用時選擇 BBP 數據源。在接收方向,BBP僅與AD9361內核接口。參考設計數據路徑不受影響。這允許框架工作不受阻礙地啟動和設置系統。系統設置完成后,BBP 將啟用,以通過覆蓋默認數據路徑來允許數據傳輸。ADI參考設計中BBP的框圖如圖4所示。
圖4.BBP IP 框圖。
本文中討論的設計、初始化和數據傳輸使用此硬件。該設置只需要一對HDMI顯示器,一個鍵盤和鼠標以及天線。這些系統彼此完全異步,但確實需要相同的設置。數據在每個方向上通過不同的載體傳輸。設備1的發射載波頻率和設備2的接收載波頻率相同,但在另一個方向上不同。但是,如果在環回中使用單個設備,則發射和接收載波必須具有相同的頻率。BBP的HDL設計采用ADI庫模塊。?
控制(微處理器)接口
AXI-Lite 接口用于控制和監視處理器的 BBP。該接口模塊使用ADI公共庫(hdl/library/common/up_axi.v)中的up_axi模塊簡單推斷。該模塊將 AXI-Lite 接口轉換為簡單的存儲器,如讀寫總線。內部寄存器和存儲器的添加方式與任何其他ADI IP一樣。寄存器映射詳見表1。
地址 | 寄存器名稱 | 類型 | ||
領域 | 名字 | 描述 | 違約 | |
0x000 | XCOMM2IP_VERSION | 反滲透 | ||
31:0 | 版本 | IP 版本。 | 0x40063 | |
0x008 | XCOMM2IP_SCRATCH | 烏爾曼 | ||
31:0 | 抓 | 刮刮樂寄存器 | 0x0 | |
0x800 | XCOMM2IP_TX_RESET | 烏爾曼 | ||
0 | TX_RESET | 如果設置為 0x1,則重置傳輸。此位必須設置為 0x0 才能正常運行。 | 0x1 | |
0x804 | XCOMM2IP_TX_ENABLE | 烏爾曼 | ||
0 | TX_ENABLE | 如果設置為 0x0,則數據路徑不受影響,解壓縮數據將傳輸到 DAC。如果設置為0x1,則BBP數據傳輸到DAC。 | 0x0 | |
0x808 | XCOMM2IP_TX_REQ | 烏爾曼 | ||
0 | TX_REQ | 如果由軟件設置,則在傳輸方向上啟動數據包傳輸。傳輸完成后,硬件會自行清除此位。 | 0x0 | |
0x80C-0x87C | XCOMM2IP_TX_PKT_DATA_3-XCOMM2IP_TX_PKT_DATA_31 | W | ||
7:0 | TX_PKT_DATA_3-TX_PKT_DATA_31 | 分組數據字節為3至31。硬件將前三個字節用于標頭,最后一個字節用于 CRC。 | W | |
0xC00 | XCOMM2IP_RX_RESET | 烏爾曼 | ||
0 | RX_RESET | 如果設置為 0x1,則重置接收。此位必須設置為 0x0 才能正常運行。 | 0x1 | |
0xC08 | XCOMM2IP_RX_REQ | 烏爾曼 | ||
0 | RX_REQ | 如果由硬件設置,則表示已收到數據包,需要由軟件讀取。軟件必須在讀取數據包數據后清除此位。所有后續數據包都將被丟棄,直到軟件清除此位。 | 0x0 | |
0xC0C-0xC7C | XCOMM2IP_RX_PKT_DATA_3-XCOMM2IP_RX_PKT_DATA_31 | W | ||
7:0 | RX_PKT_DATA_3-RX_PKT_DATA_31 | 分組數據字節為3至31。硬件將前三個字節用于標頭,最后一個字節用于 CRC。 | W |
下面介紹了up_axi模塊端口及其端口映射。
up_rstn:AXI 接口復位(異步低電平有效),連接到s_axi_aresetn。
up_clk:AXI 接口時鐘,連接到s_axi_aclk。
up_axi_*:AXI 接口信號,連接到等效的 s_axi_* 端口。
up_wreq、up_waddr、up_wdata up_wack:內部寫入接口,up_wreq信號被置位以指示寫入請求以及地址和數據。請求需要通過up_wack端口進行確認。
簡單的寄存器寫入實現如下。
always @(negedge up_rstn or posedge up_clk)
begin
if (up_rstn == 0) begin
up_wack <= ‘d0;
up_reg0 <= UP_REG0_RESET_VALUE;
end else begin
up_wack <= up_wreq_s;
if ((up_wreq_s == 1’b1) && (up_waddr == UP_ REG0_ADDRESS)) begin
up_reg0 <= up_wdata[UP_REG0_WIDTH-1:0];
end
end
end
該模塊在兩者之間執行地址轉換。AXI 接口使用字節地址,但內部總線使用 DWORD 地址。結果是up_axi模塊刪除 AXI 地址的兩個最低有效位以生成內部 DWORD 地址。
up_rreq、up_raddr、up_rdata up_rack:內部讀取接口(up_rreq信號)被斷言為指示讀取請求以及地址。請求需要通過up_rack端口以及讀取的數據進行確認。
上面為讀取實現的相同寄存器如下所示。
always @(negedge up_rstn or posedge up_clk)
begin
if (up_rstn == 0) begin
up_rack <= ‘d0;
up_rdata <= ‘d0;
end else begin
up_rack <= up_rreq_s;
if ((up_rreq_s == 1’b1) && (up_raddr == UP_ REG0_ADDRESS)) begin
up_rdata <= up_reg0;
end else begin
up_rdata <= 32‘d0;
end
end
end
相同的地址轉換也適用于讀取。讀取數據僅在請求時驅動,否則設置為零。這是因為up_axi模塊將各個地址塊的單個讀取數據傳遞到OR門。因此,未選擇的塊需要將讀取數據驅動為零。
BBP 有三個地址空間,如上面的寄存器映射表中所列。公共寄存器空間映射到0x000,發送(DAC)映射到0x800(0x200),接收(ADC)映射到0xC00(0x300)。軟件(Linux用戶空間應用程序)期望將傳輸的數據包數據寫入緩沖區,并從另一個緩沖區讀取接收到的數據包數據。數據包大小選擇為 32 字節,帶有 3 字節前導碼和 1 字節 CRC。
數據接口
AD9361接口內核由兩對16位I/Q數據組成,用于接收和發送方向的兩個通道。內核與AD9361數字接口的運行時鐘相同。在2R2T模式下,這是采樣率的4×。在1R1T模式下,這是采樣率的2×。有效數據速率由有效信號控制。因此,在2R2T模式下,每四個時鐘置位一次有效。在 1R1T 模式下,每兩個時鐘置位一次有效。BBP 設計用于支持 2R2T 和 1R1T 模式。它使用單個發射和接收通道。內部邏輯在2R2T和1R1T模式下均以采樣速率運行。然后,BBP 以時鐘頻率與接口內核傳輸數據。這樣做是為了演示BBP內的時鐘轉換。在許多情況下,用戶可能希望以采樣速率運行BBP邏輯,而不管收發器的接口速率如何。
采樣頻率下的內部時鐘使用 Xilinx 基元 BUFR 和 BUFG 生成。BUFR是一個分頻器,BUFG是一個高扇出時鐘緩沖器。也可以為此目的使用MMCM。內部時鐘的生成方式如下。
parameter XCOMM2IP_1T1R_OR_2T2R_N = 0; localparam XCOMM2IP_SCLK_DIVIDE = (XCOMM2IP_1T1R_OR_2T2R_N == 1) ? “2” : “4”;
BUFR #(.BUFR_DIVIDE(XCOMM2IP_SCLK_DIVIDE)) i_bufr (
.CLR (1’b0),
.CE (1’b1),
.I (clk),
.O (s_clk_s));
BUFG i_bufg (
.I (s_clk_s),
.O (s_clk));
使用BUFR和BUFG可確保時鐘的頻率鎖定,但會犧牲相位確定性。最大相位模糊度是接口時鐘的單個周期。這很容易通過帶有同步信號的四級寄存器陣列進行補償。但是,該設計使用雙端口RAM模塊來實現數據傳輸。這是有意作為常見信號處理要求的用例示例完成的。雙端口RAM元件使用ADI庫存儲器模塊(ad_mem)進行推斷。
傳輸接口
在傳輸方向上,處理器將數據包數據寫入緩沖區(參見上面的寄存器映射表)。然后,它請求硬件發送此數據包。BBP 不斷向設備發送數據包。在數據包的開頭,它會檢查是否有任何請求。如果沒有掛起的請求,它將傳輸空閑數據包。如果請求掛起,則會讀取并傳輸數據包緩沖區。
發送邏輯使用自由運行的位計數器以位寬運行。當位計數器0x0時,緩沖區讀取地址將更新。由于處理器請求可能在數據包傳輸期間的任何時間發生,因此會立即捕獲并在數據包傳輸開始時清除該請求。在數據包傳輸開始時,如果請求處于掛起狀態,則會將其確認回處理器接口。該請求用于在緩沖區數據或空閑數據之間進行選擇。
圖5.傳輸數據路徑。
數據包數據的前兩個字節設置為 0xfff0。第三個字節用于指示空閑 (0xc5) 或數據 (0xa6) 數據包。CRC 字節作為數據包的最后一個字節插入。CRC 多項式是 x8 + x2 + x + 1。除標頭外的所有字節都將被打亂。加擾多項式與 SONET/SDH (x7 + x6 + 1) 相同。
余弦和正弦查找表用于生成調制載波。位間隔等于八個樣本中信號的完整周期(0至2π)。位數據用于反轉信號。然后將數據寫入一個小緩沖器,并使用接口時鐘根據來自AD9361接口內核的有效信號進行讀取。
接收接口
在接收方向,I/Q數據被監視0xfff0的報頭模式。這是在數據包傳輸中出現一次的唯一模式??梢园l送數據包數據,以便加擾器輸出重復此模式。軟件不鼓勵和防止這種情況。該系列連續12位間隔的同相數據序列用于通過定時恢復模塊復位和跟蹤接收器時序和相位。因此,它重置其時序計數器并將其相位值設置為 0x1。此序列之后的第一個反轉被認為是0x0的。在此之后,定時恢復模塊在整個數據包傳輸過程中保持其狀態。
數據恢復模塊對信號進行平均,并對信號的當前相位做出決定。然后將其與時序恢復模塊跟蹤的相對相位進行比較。在發生沖突的情況下,決策基于過去對信號的變化。這是因為沖突通常由相位切換引起。
圖6.接收數據路徑。
然后將解調的位數據組裝成字節并進行解擾。如果數據為空,則數據將寫入傳輸緩沖區。CRC 在數據包末尾進行驗證。如果匹配并且寫入了傳輸緩沖區,則會通知處理器接口。該軟件應監視此請求,如果設置,則通過讀取其內容來清空緩沖區。然后,它必須清除請求以允許進一步的數據包傳輸。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19259瀏覽量
229651 -
收發器
+關注
關注
10文章
3424瀏覽量
105960 -
RF
+關注
關注
65文章
3050瀏覽量
166963
發布評論請先 登錄
相關推薦
評論