Examples on James, the first BondMachine prototype


James, the first BondMachine prototype

This section contains examples for James, the first BondMachine prototype. James is a set of 4 interconnected FPGA boards, all Basys3, that can be used to experiment with BondMachine architectures. The boards can be interconnected in several ways, via ethernet, direct wiring, or wifi.

Direct wiring : the boards can be connected via jumper wires, using the PMOD connectors on the boards. A protocol, called bondirect, has been developed to allow the boards to communicate with each other via the PMOD connectors. The protocol needs a file describing the connections between the boards, the mesh file. The mesh file is a JSON file that contains all these information. The mesh file needs to be written by hand. James’s mesh file is shown below:

{
   "Transceivers": [
      {
         "Type": "bondirect",
         "Name": "bsend",
         "Signals": {
            "clk": {
               "Type": "clock",
               "Name": "jb1"
            },
            "data0": {
               "Type": "data",
               "Name": "jb2"
            }
         },
         "Data": {}
      },
      {
         "Type": "bondirect",
         "Name": "brecv",
         "Signals": {
            "clk": {
               "Type": "clock",
               "Name": "jb3"
            },
            "data0": {
               "Type": "data",
               "Name": "jb4"
            }
         },
         "Data": {}
      },
      {
         "Type": "bondirect",
         "Name": "xarecv",
         "Signals": {
            "clk": {
               "Type": "clock",
               "Name": "jxa1"
            },
            "data0": {
               "Type": "data",
               "Name": "jxa2"
            }
         },
         "Data": {}
      },
      {
         "Type": "bondirect",
         "Name": "xasend",
         "Signals": {
            "clk": {
               "Type": "clock",
               "Name": "jxa3"
            },
            "data0": {
               "Type": "data",
               "Name": "jxa4"
            }
         },
         "Data": {}
      }
   ],
   "Nodes": {
      "peer0": {
         "PeerId": 0,
         "Data": { "DEVICE_ID": "localhost:3121/xilinx_tcf/Digilent/210183A8A23DA"}
      },
      "peer1": {
         "PeerId": 1,
         "Data": { "DEVICE_ID": "localhost:3121/xilinx_tcf/Digilent/210183A8A252A"}
      },
      "peer2": {
         "PeerId": 2,
         "Data": { "DEVICE_ID": "localhost:3121/xilinx_tcf/Digilent/210183A8A276A"}
      },
      "peer3": {
         "PeerId": 3,
         "Data": { "DEVICE_ID": "localhost:3121/xilinx_tcf/Digilent/210183A8A266A"}
      }
   },
   "Edges": {
      "wire0": {
         "NodeA": "peer0",
         "NodeB": "peer1",
         "FromAtoB": {
            "ATransceiver": "bsend",
            "BTransceiver": "xarecv",
            "Data": {}
         },
         "FromBtoA": {
            "ATransceiver": "brecv",
            "BTransceiver": "xasend",
            "Data": {}
         },
         "Data": {
	    "CountersLen": "32"
	 }
      },
      "wire1": {
         "NodeA": "peer1",
         "NodeB": "peer2",
         "FromAtoB": {
            "ATransceiver": "bsend",
            "BTransceiver": "xarecv",
            "Data": {}
         },
         "FromBtoA": {
            "ATransceiver": "brecv",
            "BTransceiver": "xasend",
            "Data": {}
         },
         "Data": {}
      },
      "wire2": {
         "NodeA": "peer2",
         "NodeB": "peer3",
         "FromAtoB": {
            "ATransceiver": "bsend",
            "BTransceiver": "xarecv",
            "Data": {}
         },
         "FromBtoA": {
            "ATransceiver": "brecv",
            "BTransceiver": "xasend",
            "Data": {}
         },
         "Data": {}
      }
   }
}

The 4 boards are connected in a line, with peer0 connected to peer1, peer1 connected to peer2, and peer2 connected to peer3. The connections beetween peerN and peerN+1 are made using the JB pmod on peerN and the JX pmod on peerN+1. The connections are bidirectional, so wireN connects peerN to peerN+1 and peerN+1 to peerN, since each board has a bondirect transceiver for sending and one for receiving.

Following are the examples available for James. Each example contains a description of the architecture, the BASM code, and the instructions to build and run the example on James.