Examples on 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.