[[Include(WikiToC)]] = IBM 28GHz PAAM: Link Rate vs. SNR = === Description === In this tutorial, we demonstrate the example use case of MAMBAS, a novel system that maneuvers analog MUBF using an ASA to support simultaneous communication with multiple users located in close proximity using the 28 GHz IBM PAAM board. * The instructions for the MAMBAS can be found [https://github.com/functions-lab/MAMBAS-MobiCom2024 here] The following papers describe the integration of the IBM 28 GHz PAAMs with MAMBAS in the COSMOS testbed. We would appreciate it if you cite this paper when publishing results obtained using the PAAMs deployed in COSMOS. * Z. Gao, Z. Qi, and T. Chen, "Mambas: Maneuvering Analog Multi-User Beamforming using an Array of Subarrays in mmWave Networks". in Proc. ACM MobiCom'24, 2023 * Z. Qi, Z. Gao, C. Tung, and T. Chen, "Programmable Millimeter-Wave MIMO Radios with Real-Time Baseband Processing". in Proc. ACM MobiCom'23 Workshop on Wireless Network Testbeds, Experimental evaluation & Characterization (WiNTECH '23), 2023 Authors: \\ Zhihui Gao, Duke University \\ Zhenzhou (Tom) Qi, Duke University \\ Tingjun Chen, Duke University Last updated: Mar. 21, 2024 === Prerequisites === In order to access COSMOS-SB2, create a reservation in COSMOS testbed and have it approved by the reservation service. Access to the resources is granted after the reservation is confirmed. Please follow the process shown on the COSMOS getting [https://wiki.cosmos-lab.org/wiki/GettingStarted started page] to get started. === Resources Required === * 2 USRP N310 SDRs ({{{sdr1-s1-lg1}}} and {{{sdr1-md1}}} in SB2) * 2 IBM 28GHz PAAMs ({{{rfdev2-1}}} and {{{rfdev2-2}}} in SB2 ) * 1 Server ({{{srv1-lg1}}}) The current hardware connection in SB2 as shown below * {{{sdr1-s1-lg1}}} RF2 TX/RX -- {{{rfdev2-1}}} IC0/TX/H, {{{sdr1-s1-lg1}}} RF2 RX2 -- {{{rfdev2-1}}} IC1/RX/H * {{{sdr1-s1-lg1}}} RF3 TX/RX -- {{{rfdev2-1}}} IC0/TX/V, {{{sdr1-s1-lg1}}} RF3 RX2 -- {{{rfdev2-1}}} IC1/RX/V * {{{sdr1-md1}}} RF2 TX/RX -- {{{rfdev2-2}}} IC0/TX/H, {{{sdr1-md1}}} RF2 RX2 -- {{{rfdev2-2}}} IC1/RX/H * {{{sdr1-md1}}} RF3 TX/RX -- {{{rfdev2-2}}} IC0/TX/V, {{{sdr1-md1}}} RF2 RX2 -- {{{rfdev2-2}}} IC1/RX/V || [[Image(PAAM-2_2 .png, 600px)]] || The required software components used in this demo are already loaded to the {{{.ndz}}} node image, the node image includes: * Ubuntu 20.04, UHD 4.1.0 * PAAM Control to initialize the PAAM boards to integrate with USRPs. * PAAM CFO calibration. * MAMBAS: === Tutorial Setup === Follow the steps below to gain access to the sandbox console and set up nodes with appropriate images. 1. If you don't have one already, sign up for a [https://www.cosmos-lab.org/portal-2/ COSMOS account] 1. [wiki:/GettingStarted#MakeaReservation Create a resource reservation] on COSMOS SB2 1. [Documentation/Short/Login Login] into sandbox console {{{console.sb2.cosmos-lab.org}}}) with **four** SSH sessions. 1. In **terminal 1**, make sure all the nodes and devices used in the experiment are turned off. Use the following command for SB2 {{{#!shell omf tell -a offh -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1 }}} 1. Load {{{.ndz}}} on the server. {{{#!shell omf load -i .ndz -t srv1-lg1 -r 0 }}} 1. Turn all the required resources on and check the status of all the resources. Use the following commands for SB2. {{{#!shell omf tell -a on -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1 }}} {{{#!shell omf stat -t all }}} 1. {{{ssh}}} to the server with option -Y for using GUI for our live demo. {{{#!shell ssh -X root@srv1-lg1 }}} ==== Find and prepare USRPs ==== * Upon logging into the server, set up the 10G data interfaces DATA1, DATA2 in **terminal 1**. {{{#!shell ifconfig DATA1 10.117.1.1 netmask 255.255.0.0 mtu 9000 up ifconfig DATA2 10.118.1.1 netmask 255.255.0.0 mtu 9000 up }}} {{{#!shell sudo sysctl -w net.core.rmem_max=536870912 sudo sysctl -w net.core.wmem_max=536870912 }}} After running the above commands, you should see that the data interfaces have the appropriate IP addresses assigned. {{{#!shell root@srv1-lg1:~# ifconfig DATA1 DATA1: flags=4163 mtu 1500 inet6 fe80::1e34:daff:fe42:d4c prefixlen 64 scopeid 0x20 ether 1c:34:da:42:0d:4c txqueuelen 1000 (Ethernet) RX packets 21092 bytes 1881634 (1.8 MB) RX errors 0 dropped 19183 overruns 0 frame 0 TX packets 686 bytes 204975 (204.9 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@srv1-lg1:~# ifconfig DATA2 DATA2: flags=4163 mtu 1500 inet6 fe80::1e34:daff:fe42:d4d prefixlen 64 scopeid 0x20 ether 1c:34:da:42:0d:4d txqueuelen 1000 (Ethernet) RX packets 21091 bytes 1881530 (1.8 MB) RX errors 0 dropped 19184 overruns 0 frame 0 TX packets 690 bytes 226549 (226.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 }}} * Run {{{uhd_find_devices}}} to make sure that both USRP N310s can be reached: {{{#!shell [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.1.0.HEAD-0-g25d617ca -------------------------------------------------- -- UHD Device 3 -------------------------------------------------- Device Address: serial: 315A35A addr: 10.117.2.1 claimed: False fpga: XG mgmt_addr: 10.116.2.1 mgmt_addr: 10.117.2.1 product: n310 type: n3xx -------------------------------------------------- -- UHD Device 4 -------------------------------------------------- Device Address: serial: 3176DF7 addr: 10.118.3.1 claimed: False fpga: XG mgmt_addr: 10.116.3.1 mgmt_addr: 10.118.3.1 product: n310 type: n3xx }}} ==== Configure IBM 28GHz PAAM ==== COSMOS uses the IBM 28GHz PAAM API to configure and initialize the PAAM boards. Under {{{PAAM_Control}}}, use the following command to configure the PAAM boards in **terminal 1**: {{{#!shell root@srv1-lg1:~/PAAM_Control# python3 main.py }}} The following message will print out to indicate that the PAAM board is being successfully configured: {{{#!shell Opened port to FPGA Logged in to Petalinux Started command parser on Zynq sdpar_prog.py /version: Version is PAWR_v1.2.0 Using baseline FPGA control IP Reset the Phased Array Initialization of IC 0 was successful Initialization of IC 1 was successful Initialization of IC 2 was successful Initialization of IC 3 was successful IC0 current: 2.2629521016617793 status: On IC1 current: 1.3685239491691104 status: On IC2 current: 0.19550342130987292 status: Off IC3 current: 0.07820136852394917 status: Off Closed port to Zynq Opened port to FPGA Logged in to Petalinux Started command parser on Zynq sdpar_prog.py /version: Version is PAWR_v1.2.0 Using baseline FPGA control IP Reset the Phased Array Initialization of IC 0 was successful Initialization of IC 1 was successful Initialization of IC 2 was successful Initialization of IC 3 was successful IC0 current: 2.29227761485826 status: On IC1 current: 1.3587487781036167 status: On IC2 current: 0.15640273704789834 status: Off IC3 current: 0.16617790811339198 status: Off Closed port to Zynq Experiment Started! }}} Notice this program will **hang** there to indicate that the PAAM board is on, if you wish to turn off the ICs on the PAAM boards, please **press {{{CTRL+C}}} once**. === Experiment Execution === ==== Download code from GitHub ==== First, create a new folder {{{workarea}}} and enter this folder by {{{#!shell root@srv1-lg1:~# mkdir workarea root@srv1-lg1:~# cd workarea/ }}} Download codes from GitHub repository and enter the repository folder by {{{#!shell root@srv1-lg1:~/workarea# git clone https://github.com/functions-lab/MAMBAS-MobiCom2024 root@srv1-lg1:~/workarea# cd MAMBAS-MobiCom2024/ }}} Open MATLAB interface as background as {{{#!shell root@srv1-lg1:~/workarea/MAMBAS-MobiCom2024# matlab & }}} ==== Configure USRP parameters ==== In MATLAB, open {{{GetParam.m}}}, and configure the parameters below: {{{#!shell % USRP Setting param.carrier = 3.0e9; param.subdevTx = "B:1"; param.deviceTx = "10.117.2.1"; param.gainTx = 30; param.deviceRx = "10.117.3.1"; param.subdevRx = "B:1"; param.gainRx = 40; }}} {{{param.carrier}}}: the carrier frequency of the TX and RX. Please set it as {{{3.0e9}}} for 3 GHz carrier frequency to the IBM 28 GHz PAAM. {{{param.deviceTx}}} and {{{param.deviceRx}}}: the IP address of the TX/RX USRP, which is {{{10.117.2.1}}} and {{{10.117.3.1}}}. {{{param.subdevTx}}} and {{{param.subdevRX}}}: the subdevice settings of the TX/RX USRP. The connection on the sb2 requires to set both parameters as {{{B:1}}} to use the port {{{RF3}}}. {{{param.gainTx}}} and {{{param.gainRx}}}: the TX/RX gain of the USRPs, whose range varies over different USRP types, which can be found by running {{{uhd_usrp_probe}}} command in the terminal. In sb2, the recommended value for {{{param.gainTx}}} is {{{30}}}, for {{{param.gainRx}}} is {{{40}}}. ==== Conduct the transmission ==== In MATLAB, open {{{main.m}}}, and directly run this script. The displayed information includes: {{{CFO}}}: carrier frequency offset {{{SNR}}}: signal-to-noise ratio {{{EVM}}}: error vector magnitude {{{BLER}}}: block error rate (only one block is transmitted and it can be either 0 for success and 1 for failure); {{{BER}}}: bit error rate {{{Constel.png}}}: the saved constellation plot. ==== Change the SNR/MCS ==== To change SNR, you may either Change the amplitude (by default, {{{0.5}}}) of the generated waveform in line 13 of {{{main.m}}}, or Change the TX gain {{{param.gainTx}}} in {{{GetParam.m}}}. To change MCS, open {{{GetParam.m}}} and customize {{{param.modu}}} for modulation and {{{param.code}}} for code rate. For the 28 levels of MCSs in 5G, you may refer to the table {{{Table 5.1.3.1-2: MCS index table 2 for PDSCH}}} in the link below: [https://www.sharetechnote.com/html/5G/5G_MCS_TBS_CodeRate.html]