:CameraLink接口與萬兆網(wǎng)系統(tǒng)設(shè)計全解析)
如果你正在找一套能跑起來的 FPGA 高速接口實戰(zhàn)項目特別是想搞懂 CameraLink 圖像怎么通過萬兆網(wǎng)傳出來那這個項目演示值得你花時間看。它不是一個簡單的概念介紹而是從硬件板卡、FPGA 邏輯、驅(qū)動到上位機軟件的一整套流程。最核心的價值在于你能看到一個完整的“圖像采集-高速傳輸-上位機接收”鏈路是如何被打通的這對于想從理論學(xué)習(xí)轉(zhuǎn)向?qū)嶋H系統(tǒng)開發(fā)的 FPGA 工程師或嵌入式開發(fā)者來說是個很好的參考。很多人學(xué) FPGA 接口卡在不知道怎么把各個模塊如 CameraLink 解碼、DDR 緩存、萬兆網(wǎng) MAC/IP 棧連成一個穩(wěn)定工作的系統(tǒng)。這個項目演示恰好展示了這個整合過程。我會基于常見的開發(fā)流程幫你拆解這里面的關(guān)鍵環(huán)節(jié)、實操步驟以及最容易踩坑的地方。1. 先拆解項目CameraLink 采集卡與萬兆網(wǎng)到底要解決什么問題這個項目的標題點出了兩個核心硬件接口CameraLink和萬兆網(wǎng)。這不是簡單的接口學(xué)習(xí)而是一個典型的高速數(shù)據(jù)流采集與傳輸系統(tǒng)。CameraLink是一種專門用于工業(yè)相機的高速串行視頻接口標準。它的數(shù)據(jù)速率很高基礎(chǔ)配置Base就能到 2.04 Gbps更別說 Medium 或 Full 配置了。FPGA 在這里的首要任務(wù)就是通過專用的 CameraLink 接收芯片如 DS90CR287/288 等或者 FPGA 的高速串并轉(zhuǎn)換器SERDES將相機傳來的高速串行數(shù)據(jù)流可靠地還原成并行的圖像像素數(shù)據(jù)。萬兆網(wǎng)10GbE則是解決數(shù)據(jù)“出口”問題。圖像數(shù)據(jù)從 CameraLink 進來后如果只在 FPGA 內(nèi)部處理或者通過低速接口如 USB3.0、千兆網(wǎng)傳出會成為瓶頸。萬兆網(wǎng)提供了高達 10 Gbps 的帶寬足以實時傳輸來自 CameraLink 的高分辨率、高幀率圖像數(shù)據(jù)流。所以這個項目的本質(zhì)是搭建一個管道一端CameraLink高速吞入圖像數(shù)據(jù)經(jīng)過 FPGA 的緩沖與調(diào)度另一端萬兆網(wǎng)高速吐出數(shù)據(jù)到上位機。整個系統(tǒng)的穩(wěn)定性、實時性和數(shù)據(jù)完整性是衡量項目成功與否的關(guān)鍵。1.1 為什么選擇這個組合作為進階項目對于已經(jīng)掌握 Verilog/VHDL 基礎(chǔ)語法和簡單外設(shè)如 UART、SPI控制的開發(fā)者來說這個項目是很好的“能力躍遷”訓(xùn)練。它強迫你去面對和解決幾個高階問題跨時鐘域處理CDCCameraLink 的像素時鐘和萬兆網(wǎng)的 MAC 層時鐘通常是不同源、不同頻率的。數(shù)據(jù)從 CameraLink 時鐘域安全地傳遞到萬兆網(wǎng)時鐘域是必須精心設(shè)計的。高速數(shù)據(jù)緩沖CameraLink 數(shù)據(jù)是突發(fā)、連續(xù)的而萬兆網(wǎng)傳輸受網(wǎng)絡(luò)協(xié)議影響可能有間隙。必須使用大容量、高帶寬的緩存通常是 FPGA 片外 DDR SDRAM作為“蓄水池”平滑數(shù)據(jù)流。復(fù)雜協(xié)議棧實現(xiàn)萬兆網(wǎng)不僅僅是物理層還需要實現(xiàn)完整的以太網(wǎng) MAC 層、IP 層通常是 UDP/IP因為追求低延遲、甚至可能的部分傳輸層。這涉及到數(shù)據(jù)封裝、CRC 校驗、幀間隔管理等。系統(tǒng)資源與時序收斂將 CameraLink 接收、DDR 控制器、萬兆網(wǎng) MAC/IP 封裝等模塊集成在一個 FPGA 工程里對邏輯資源、布線資源和時序要求極高。如何劃分模塊、進行時序約束、優(yōu)化關(guān)鍵路徑是項目成敗的硬件邏輯核心。1.2 項目演示通常包含哪些環(huán)節(jié)一個完整的演示閉環(huán)通常包含以下軟硬件環(huán)節(jié)這也是你評估任何一個類似項目是否“靠譜”的檢查清單硬件平臺包含 CameraLink 輸入接口、FPGA 芯片、DDR 內(nèi)存芯片、萬兆網(wǎng) PHY 芯片或光模塊接口的板卡。FPGA 邏輯設(shè)計CameraLink 解碼模塊。DDR 內(nèi)存控制器通常使用 IP 核。?萬兆網(wǎng) MAC/IP 協(xié)議棧模塊可能使用 IP 核或開源實現(xiàn)。?數(shù)據(jù)流調(diào)度與控制模塊核心中的核心負責(zé)指揮數(shù)據(jù)從哪里來到哪里去。驅(qū)動與上位機軟件在接收端通常是 PC需要萬兆網(wǎng)卡驅(qū)動、以及一個能接收 UDP 數(shù)據(jù)包、解析圖像數(shù)據(jù)并顯示/存儲的軟件。如果演示只給你看 FPGA 的代碼或一個板卡照片那是不完整的。必須看到從相機出圖到 PC 軟件上穩(wěn)定顯示圖像這個完整鏈路才算一個有效的演示。2. 環(huán)境準備與硬件平臺選擇你的起點在哪里在動手復(fù)現(xiàn)或?qū)W習(xí)之前先明確你的硬件條件。這個項目對硬件有明確要求不能隨便找一塊開發(fā)板就開始。2.1 核心硬件組件清單FPGA 開發(fā)板或定制板卡這是主體。板卡上必須包含CameraLink 接口通常是 26 針或 2626 針的 MDR 插座。確保其電平標準與你的相機匹配。萬兆網(wǎng)接口通常是 SFP 光口或 10G BASE-T 電口。SFP 更常見你需要準備相應(yīng)的光模塊和光纖。DDR 內(nèi)存至少要有 1GB 以上的 DDR3 或 DDR4用于幀緩沖。帶寬要足夠例如 64 位位寬時鐘頻率在 800MHz 以上。時鐘系統(tǒng)能為 CameraLink 接收器和萬兆網(wǎng) MAC 提供所需的高質(zhì)量、低抖動時鐘。配置與調(diào)試接口如 JTAG、UART 串口用于下載程序和輸出調(diào)試信息。工業(yè)相機支持 CameraLink 輸出并明確其輸出配置Base/Medium/Full、分辨率、幀率、像素格式如 Mono8, RGB24。上位機PC需要配備萬兆網(wǎng)卡如 Intel X520/X540 系列并安裝好官方驅(qū)動。確保操作系統(tǒng)Windows/Linux支持。線纜與模塊CameraLink 線纜、SFP 光模塊、LC-LC 光纖、電源等。注意對于初學(xué)者直接購買集成所有這些接口的商用 FPGA 圖像采集卡價格昂貴是最快的方式。但對于學(xué)習(xí)而言也可以選擇像 Xilinx VC709、Intel Stratix 10 GX 開發(fā)板這類高端板卡它們通常有 FMC 子卡接口可以連接 CameraLink FMC 子卡和 10G Ethernet FMC 子卡來組合實現(xiàn)。這更靈活但需要自己處理子卡間的協(xié)同。2.2 軟件與工具鏈準備FPGA 開發(fā)工具根據(jù)你選擇的 FPGA 芯片Xilinx 或 Intel安裝對應(yīng)的 Vivado 或 Quartus Prime 套件。確保版本支持你的芯片型號。IP 核許可萬兆網(wǎng) MAC IP、DDR 控制器 IP 等可能是需要額外購買或申請評估許可的。Xilinx 和 Intel 也提供部分免費的三態(tài)以太網(wǎng) MAC IP但功能可能有限。這是項目前期必須確認清楚的一點。上位機開發(fā)環(huán)境用于編寫接收軟件。常用選擇有C with Boost.Asio / Pcap高性能跨平臺。Python with Scapy/socket快速原型驗證。LabVIEW / MATLAB如果側(cè)重快速圖像顯示和分析。專用 SDK如果購買的是商用采集卡廠商會提供。調(diào)試工具Vivado/Quartus 的 ILA (ChipScope) / SignalTap 邏輯分析儀用于抓取 FPGA 內(nèi)部信號。網(wǎng)絡(luò)封包分析工具如 Wireshark用于驗證上位機收到的數(shù)據(jù)包格式。3. 實操流程從零搭建系統(tǒng)的關(guān)鍵步驟假設(shè)你已經(jīng)準備好了硬件和軟件環(huán)境下面是一個從零開始的典型實操流程。我建議嚴格按照這個順序進行不要跳步每一步都驗證通過后再進入下一步。3.1 第一步硬件驗證與“點燈”測試在寫任何圖像處理代碼之前先確保你的 FPGA 基礎(chǔ)系統(tǒng)是活的。給 FPGA 下載最簡單的測試程序比如一個讓板上 LED 閃爍的.bit文件。確保 JTAG 連接正常下載功能正常。驗證時鐘和復(fù)位使用邏輯分析儀ILA/SignalTap確認 FPGA 從晶振或時鐘芯片得到的時鐘信號是穩(wěn)定的復(fù)位電路工作正常。驗證 DDR 內(nèi)存運行 FPGA 工具提供的 DDR 內(nèi)存測試示例如 MIG IP 核自帶的示例工程。進行簡單的寫-讀測試確保 DDR 控制器初始化成功讀寫數(shù)據(jù)正確。這是后續(xù)所有緩存操作的基礎(chǔ)必須穩(wěn)。驗證萬兆網(wǎng) PHY如果可能運行萬兆網(wǎng) PHY 芯片的回環(huán)測試Loopback或者嘗試用 IP 核示例工程產(chǎn)生一些簡單的網(wǎng)絡(luò)流量在 PC 端用 Wireshark 抓包看是否能收到。這一步先不追求協(xié)議正確只確認物理鏈路光路/電路是通的。3.2 第二步分模塊構(gòu)建與仿真不要試圖一次性集成所有模塊。應(yīng)該采用“分而治之逐個擊破”的策略。CameraLink 解碼模塊輸入根據(jù)你的相機配置編寫或配置 CameraLink 接收器模塊。重點處理串并轉(zhuǎn)換、通道對齊、解碼控制信號如 FVAL, LVAL, DVAL。仿真使用測試平臺Testbench模擬相機發(fā)送標準的圖像數(shù)據(jù)如彩條、漸變圖。在仿真中驗證模塊能正確輸出像素數(shù)據(jù)、行場同步信號。上板調(diào)試將編譯好的模塊下載到 FPGA用 ILA 抓取實際的 CameraLink 輸入信號和解碼后的并行數(shù)據(jù)與相機規(guī)格書對比確保解碼無誤。萬兆網(wǎng) UDP 發(fā)送模塊脫離圖像先發(fā)數(shù)據(jù)先實現(xiàn)一個最簡單的 UDP 發(fā)送器??梢怨潭òl(fā)送一個遞增的計數(shù)器值或“Hello World”字符串。配置 IP 核正確配置萬兆網(wǎng) MAC IP 核的本地 MAC 地址、IP 地址、子網(wǎng)掩碼以及目標 MAC/IP 地址和端口。驗證鏈路在 PC 端用網(wǎng)絡(luò)調(diào)試工具如netcat或簡單的 UDP 接收程序監(jiān)聽對應(yīng)端口看是否能收到 FPGA 發(fā)來的測試數(shù)據(jù)。用 Wireshark 確認以太網(wǎng)幀、IP 包、UDP 報文格式都正確。DDR 緩存控制器模塊這個模塊通常是連接 CameraLink 輸出和萬兆網(wǎng)輸入的中樞。它需要實現(xiàn)**乒乓緩沖Ping-Pong Buffer或環(huán)形緩沖Ring Buffer**機制。寫端口接收 CameraLink 解碼后的圖像數(shù)據(jù)按照幀、行組織寫入 DDR 的某個“塊”。讀端口根據(jù)萬兆網(wǎng)的發(fā)送能力從 DDR 的另一個“塊”中讀取數(shù)據(jù)封裝成 UDP 包發(fā)送出去。關(guān)鍵點寫和讀的時鐘域不同需要通過異步 FIFO 進行隔離。同時需要精巧的狀態(tài)機來管理緩沖區(qū)的切換防止寫覆蓋未讀數(shù)據(jù)或讀空緩沖區(qū)。3.3 第三步系統(tǒng)集成與聯(lián)調(diào)這是最考驗設(shè)計功力的階段。數(shù)據(jù)流打通將 CameraLink 模塊的輸出連接到 DDR 控制器的寫端口將 DDR 控制器的讀端口連接到萬兆網(wǎng) UDP 發(fā)送模塊。先發(fā)送一幅靜態(tài)圖像比如將一幅圖片預(yù)存到 FPGA 的 ROM 里模擬 CameraLink 輸入看 PC 端能否完整接收并顯示。實時流接入斷開靜態(tài)圖像源接入真實的 CameraLink 工業(yè)相機。調(diào)整相機參數(shù)分辨率、幀率使其輸出速率在萬兆網(wǎng)的理論帶寬之內(nèi)需考慮協(xié)議開銷有效載荷約 9.4 Gbps。流量控制與背壓這是穩(wěn)定性的關(guān)鍵。萬兆網(wǎng)發(fā)送速度可能受網(wǎng)絡(luò)擁堵、PC 端接收不及時等因素影響。必須在 DDR 讀控制邏輯中實現(xiàn)背壓機制當發(fā)送緩沖區(qū)滿或網(wǎng)絡(luò)擁塞時暫停從 DDR 讀取數(shù)據(jù)防止數(shù)據(jù)丟失。同時也要監(jiān)控 DDR 寫端如果緩沖區(qū)快滿了理論上應(yīng)該向相機發(fā)送觸發(fā)信號暫停采集如果相機支持或者丟棄幀并記錄錯誤。參數(shù)化與配置將圖像分辨率、幀率、目標 IP/端口等參數(shù)設(shè)計成可通過寄存器如通過 UART 或 PCIe配置的形式提高靈活性。3.4 第四步上位機接收軟件編寫FPGA 側(cè)穩(wěn)定發(fā)送后需要一個可靠的“接收端”。原始數(shù)據(jù)接收編寫 UDP Socket 程序持續(xù)監(jiān)聽特定端口。收到數(shù)據(jù)后根據(jù)預(yù)先定義好的協(xié)議例如每個 UDP 包包含幀頭、幀序號、行號、像素數(shù)據(jù)、校驗和將數(shù)據(jù)包重組為完整的圖像幀。處理丟包與亂序UDP 是不可靠協(xié)議可能丟包、亂序。你的軟件需要能通過幀序號和行號檢測丟包并進行處理例如丟棄不完整的幀或請求重傳——如果協(xié)議支持。圖像顯示與存儲將重組后的圖像數(shù)據(jù)轉(zhuǎn)換成標準圖像格式如 OpenCV 的 Mat 對象進行實時顯示。同時提供保存為圖片文件如 BMP, PNG或視頻文件如 AVI的功能。性能監(jiān)控在軟件界面顯示實時幀率、接收帶寬、丟包率等關(guān)鍵指標用于系統(tǒng)性能評估和故障排查。4. 核心細節(jié)與避坑指南那些容易出問題的地方在實際操作中以下幾個點是高頻故障區(qū)需要特別關(guān)注。4.1 時鐘與復(fù)位設(shè)計問題系統(tǒng)不穩(wěn)定隨機出現(xiàn)數(shù)據(jù)錯誤或死機。排查檢查所有時鐘是否滿足 FPGA 全局時鐘資源的輸入要求電壓、頻率。檢查跨時鐘域信號是否都通過了正確的同步器如兩級寄存器同步。檢查復(fù)位信號是否滿足全局復(fù)位的時序要求是否進行了去抖和同步釋放。異步復(fù)位同步釋放是黃金準則。使用 ILA 抓取關(guān)鍵時鐘和復(fù)位信號觀察上電和運行過程中的波形。4.2 DDR 控制器時序約束與帶寬問題圖像傳輸卡頓丟幀或者 DDR 讀寫錯誤。排查時序約束確保對 DDR 接口如 MIG IP的引腳分配和時序約束Input/Output Delay完全按照官方指南設(shè)置。這是保證 DDR 穩(wěn)定工作的前提。帶寬計算估算你的數(shù)據(jù)流量。例如1280x1024 60fps 的 Mono8 圖像數(shù)據(jù)率約為1280*1024*1*60 ≈ 78.6 MB/s。DDR 的理論帶寬遠高于此但實際有效帶寬受控制器效率、訪問模式影響。確保你的設(shè)計留有足夠余量通常建議利用率低于70%。突發(fā)傳輸DDR 對突發(fā)訪問友好。盡量將 CameraLink 的像素數(shù)據(jù)在 FPGA 內(nèi)部先緩存成一行或一個更大的塊再以突發(fā)模式寫入 DDR。讀取時也一樣。仲裁與調(diào)度如果讀寫請求同時發(fā)生DDR 控制器內(nèi)部有仲裁機制。理解其策略避免讀寫頻繁切換導(dǎo)致效率低下。4.3 萬兆網(wǎng)協(xié)議棧與數(shù)據(jù)封裝問題PC 端收不到包或收到包但格式錯誤無法解析。排查MAC/IP 核配置雙檢查本地 MAC/IP、目標 MAC/IP、子網(wǎng)掩碼、默認網(wǎng)關(guān)。確保 FPGA 和 PC 在同一子網(wǎng)內(nèi)。幀結(jié)構(gòu)用 ILA 抓取 MAC 層發(fā)送前的數(shù)據(jù)與標準以太網(wǎng)幀結(jié)構(gòu)逐字節(jié)對比前導(dǎo)碼幀起始定界符、目的MAC、源MAC、類型/長度、數(shù)據(jù)、FCS。最常見的錯誤是長度字段算錯或 FCS 校驗和計算錯誤。UDP 封裝確認 UDP 頭部的源端口、目的端口、長度、校驗和計算正確。UDP 長度是整個 UDP 報文頭數(shù)據(jù)的長度。MTU 與分片標準以太網(wǎng) MTU 是 1500 字節(jié)。如果你的圖像行數(shù)據(jù)很大一個 UDP 包可能超過 MTU導(dǎo)致 IP 層分片。分片會降低效率并增加丟包風(fēng)險。更好的做法是在應(yīng)用層就將一行數(shù)據(jù)分割成多個小于 MTU 的 UDP 包并為每個包添加序號。流量控制關(guān)注萬兆網(wǎng) MAC 的tx_axis_tready信號對于 AXI-Stream 接口。當tready為低時必須暫停發(fā)送數(shù)據(jù)。忽略這個信號會導(dǎo)致數(shù)據(jù)丟失。4.4 數(shù)據(jù)流控制與背壓問題系統(tǒng)運行一段時間后DDR 緩沖區(qū)溢出或讀空導(dǎo)致圖像錯亂或丟失。設(shè)計要點緩沖區(qū)深度設(shè)計DDR 中的幀緩沖區(qū)要足夠深以抵消網(wǎng)絡(luò)瞬時擁堵或 PC 端處理延遲。例如設(shè)計為能緩存 5-10 幀圖像。水位線預(yù)警為緩沖區(qū)設(shè)置“高水位線”和“低水位線”。當寫指針接近高水位線時向采集端發(fā)出“慢下來”的警告如果可能當讀指針接近低水位線時說明發(fā)送過快可以適當插入空閑周期。狀態(tài)監(jiān)控在設(shè)計中添加計數(shù)器監(jiān)控丟幀數(shù)、緩沖區(qū)溢出次數(shù)、網(wǎng)絡(luò)暫停次數(shù)等并通過 UART 或 LED 輸出便于調(diào)試。4.5 上位機接收性能問題FPGA 發(fā)送正常但 PC 端軟件卡頓、丟包嚴重。排查接收緩沖區(qū)設(shè)置足夠大的 Socket 接收緩沖區(qū)。多線程處理用一個線程專責(zé)收包高頻循環(huán)放入隊列用另一個線程處理隊列中的數(shù)據(jù)包進行圖像重組和顯示。避免在收包線程中進行耗時操作。網(wǎng)卡設(shè)置在 Windows 下可以嘗試調(diào)整網(wǎng)卡的高級屬性如“接收緩沖區(qū)”、“中斷節(jié)流率”等。在 Linux 下可以調(diào)整net.core.rmem_max等內(nèi)核參數(shù)。CPU 親和性與優(yōu)先級將接收線程綁定到特定 CPU 核心并提高其優(yōu)先級減少被其他任務(wù)打斷的可能。使用專用庫對于極限性能要求可以考慮使用 DPDKData Plane Development Kit或 PF_RING 等旁路內(nèi)核協(xié)議棧的技術(shù)但這會大大增加復(fù)雜性。5. 項目擴展與進階思考當基礎(chǔ)功能穩(wěn)定后可以考慮以下方向進行深化這能讓項目從“演示”升級為“產(chǎn)品原型”。5.1 功能擴展多通道采集支持多個 CameraLink 相機同時輸入在 FPGA 內(nèi)進行同步或異步采集并通過萬兆網(wǎng) multiplex 傳輸。圖像預(yù)處理在 FPGA 內(nèi)集成實時預(yù)處理算法如去噪、濾波、色彩空間轉(zhuǎn)換、簡單的特征提取如邊緣檢測等再將處理結(jié)果或特征數(shù)據(jù)數(shù)據(jù)量更小發(fā)送出去減輕上位機負擔(dān)。壓縮傳輸集成 JPEG 或 H.264 編碼 IP 核在 FPGA 內(nèi)對圖像進行壓縮大幅降低網(wǎng)絡(luò)帶寬占用實現(xiàn)更遠距離或更多路數(shù)的傳輸。協(xié)議增強將簡單的 UDP 協(xié)議替換為帶確認和重傳機制的可靠 UDPRUDP或者直接使用 TCP/IP但 FPGA 實現(xiàn) TCP 棧復(fù)雜度高通常用軟核或?qū)S?IP。也可以定義更豐富的應(yīng)用層協(xié)議支持命令控制、參數(shù)配置、狀態(tài)查詢等。5.2 性能優(yōu)化降低延遲分析從相機曝光到上位機顯示的全鏈路延遲。優(yōu)化 DDR 的緩沖策略如使用行緩沖而非幀緩沖減少數(shù)據(jù)排隊時間。提高帶寬利用率優(yōu)化 UDP 包大小使其接近但不超過 MTU減少協(xié)議開銷。使用 Jumbo Frame巨型幀需要交換機和支持。資源優(yōu)化使用 Vivado/Quartus 的布局布線優(yōu)化策略提高時序裕量降低功耗??紤]將部分控制邏輯用 FPGA 內(nèi)的軟核處理器如 MicroBlaze, Nios II實現(xiàn)提高靈活性。5.3 工程化與調(diào)試自動化測試編寫腳本自動化完成從 FPGA 綜合實現(xiàn)、下載到上位機接收驗證的全流程方便回歸測試。遠程更新與監(jiān)控實現(xiàn) FPGA 比特流的遠程更新例如通過萬兆網(wǎng)或千兆管理口以及系統(tǒng)運行狀態(tài)溫度、電壓、錯誤計數(shù)的遠程監(jiān)控。文檔與注釋為關(guān)鍵模塊編寫詳細的設(shè)計文檔在代碼中添加清晰的注釋。這對于團隊協(xié)作和后期維護至關(guān)重要。這個 CameraLink 采集卡萬兆網(wǎng)版本項目就像一座連接 FPGA 邏輯設(shè)計與實際高速系統(tǒng)應(yīng)用的橋梁。它涉及的每一個環(huán)節(jié)——高速串行接口、大容量存儲管理、高速網(wǎng)絡(luò)協(xié)議——都是現(xiàn)代 FPGA 應(yīng)用中的核心技能。通過親手實現(xiàn)它你收獲的不僅僅是一個能跑起來的演示更是一套應(yīng)對復(fù)雜系統(tǒng)級設(shè)計挑戰(zhàn)的方法論和調(diào)試經(jīng)驗。我建議在動手時準備好邏輯分析儀和網(wǎng)絡(luò)抓包工具因為大部分問題最終都要靠信號和數(shù)據(jù)的“真相”來定位。先從最小的、可驗證的子系統(tǒng)開始像搭積木一樣逐步構(gòu)建你的信心和系統(tǒng)。