{ "cells": [ { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [], "source": [ "from pynq import Overlay\n", "from pynq import DefaultHierarchy\n", "import pynq.lib.dma\n", "from pynq import allocate\n", "import numpy as np\n", "from kamene.all import *\n" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [], "source": [ "overlay=Overlay('babel_overlay_test.bit')" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['UDP/udp_meta', 'UDP/udp_data', 'network_stack/ethernet_dma', 'axi_dma_0', 'UDP/udp_stack/ipv4_0', 'UDP/udp_stack/udp_0', 'network_stack/arp_server_subnet_0', 'network_stack/ip_handler_0', 'network_stack/mac_ip_encode_0', 'processing_system7_0'])" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "overlay.ip_dict.keys()" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [], "source": [ "overlay.download()" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "udp_meta = overlay.UDP.udp_meta\n", "udp_data = overlay.UDP.udp_data\n", "ethernet = overlay.network_stack.ethernet_dma\n", "overlay.UDP.udp_stack.ipv4_0.local_ipv4_address_V = 0xDEADBEEF\n", "overlay.UDP.udp_stack.protocol_V = 0x11\n", "overlay.UDP.udp_stack.udp_0.reg_ip_address_V_1 = 0xDEADBEEF\n", "overlay.UDP.udp_stack.udp_0.reg_ip_address_V_2 = 0xDEADBEEF\n", "overlay.UDP.udp_stack.udp_0.reg_ip_address_V_3 = 0xDEADBEEF\n", "overlay.UDP.udp_stack.udp_0.reg_ip_address_V_4 = 0xDEADBEEF\n", "overlay.UDP.udp_stack.udp_0.reg_listen_port_V = 54001\n", "overlay.network_stack.arp_server_subnet_0.myMacAddress_V_1 = 0xEEEEEEEE\n", "overlay.network_stack.arp_server_subnet_0.myMacAddress_V_2 = 0xEEEEEEEE\n", "overlay.network_stack.arp_server_subnet_0.myIpAddress_V = 0xDEADBEEF\n", "overlay.network_stack.ip_handler_0.myIpAddress_V = 0xDEADBEEF\n", "overlay.network_stack.mac_ip_encode_0.myMacAddress_V_1 = 0xEEEEEEEE\n", "overlay.network_stack.mac_ip_encode_0.myMacAddress_V_2 = 0xEEEEEEEE\n", "overlay.network_stack.mac_ip_encode_0.regSubNetMask_V= 0x00FFFFFF\n", "overlay.network_stack.mac_ip_encode_0.regDefaultGateway_V= 0xDEADBEEF" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "udp_data_buffer_out = allocate(shape=(1), dtype=np.uint64)\n", "udp_metadata_buffer_out = allocate(shape=(32), dtype=np.uint8)\n", "udp_data_buffer_in = allocate(shape=(1), dtype=np.uint64)\n", "udp_metadata_buffer_in = allocate(shape=(4), dtype=np.uint64)\n", "raw_packet_in = allocate(shape=(128), dtype=np.uint8)\n", "raw_packet_out = allocate(shape=(128), dtype=np.uint8)" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "udp_data_buffer_out[0] = 0xDEADBEEFDEADBEEF\n", "for i in range(32):\n", " udp_metadata_buffer_out[i] = 0xac" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "udp_meta.recvchannel.start()\n", "udp_meta.sendchannel.start()\n", "udp_data.recvchannel.start()\n", "udp_data.sendchannel.start()\n", "ethernet.recvchannel.start()\n", "ethernet.sendchannel.start()" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [], "source": [ "udp_meta.sendchannel.transfer(udp_metadata_buffer_out)\n", "udp_data.sendchannel.transfer(udp_data_buffer_out)\n", "udp_meta.sendchannel.wait()\n", "udp_data.sendchannel.wait()" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "ethernet.recvchannel.transfer(raw_packet_in)\n", "ethernet.recvchannel.wait()" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ff ff ff ff ff ff 00 00 00 00 00 00 08 06 00 01 08 00 06 04 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ] } ], "source": [ "for item in raw_packet_in:\n", " print('{:02x}'.format(item), end=\" \")\n" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ee ee ee ee ee ee 00 05 6b 01 1a cb 08 00 45 00 00 1c 00 01 00 00 40 11 1b c2 c0 a8 00 c9 de ad be ef 00 35 d2 f1 00 08 cd a8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-97-2db318aa1f6d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mudp_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecvchannel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransfer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mudp_data_buffer_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0methernet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msendchannel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mudp_meta\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecvchannel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mudp_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecvchannel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/pynq/lib/dma.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0merror\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mmio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_offset\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merror\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;36m0x10\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m raise RuntimeError(\n", "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/pynq/lib/dma.py\u001b[0m in \u001b[0;36merror\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 115\u001b[0m \"\"\"True if DMA engine is in an error state\n\u001b[1;32m 116\u001b[0m \"\"\"\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mmio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_offset\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;36m0x70\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0x0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/pynq/mmio.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, offset, length, word_order)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;31m# Read data out\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 148\u001b[0;31m \u001b[0mlsb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 149\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlength\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m8\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mword_order\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'little'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "packet = Ether(dst='ee:ee:ee:ee:ee:ee')/IP(dst=\"222.173.190.239\")/UDP(dport=54001)\n", "i = 0\n", "for b in bytes(packet):\n", " raw_packet_out[i] = b\n", " i+=1\n", "for item in raw_packet_out:\n", " print('{:02x}'.format(item), end=\" \")\n", "ethernet.sendchannel.transfer(raw_packet_out)\n", "udp_meta.recvchannel.transfer(udp_metadata_buffer_in)\n", "udp_data.recvchannel.transfer(udp_data_buffer_in)\n", "ethernet.sendchannel.wait()\n", "udp_meta.recvchannel.wait()\n", "udp_data.recvchannel.wait()" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0 0 0 0 " ] } ], "source": [ "for item in udp_data_buffer_in:\n", " print('{:x}'.format(item), end=\" \")\n", "for item in udp_metadata_buffer_in:\n", " print('{:x}'.format(item), end=\" \")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "udp_meta.recvchannel.stop()\n", "udp_meta.sendchannel.stop()\n", "udp_data.recvchannel.stop()\n", "udp_data.sendchannel.stop()\n", "ethernet.recvchannel.stop()\n", "ethernet.sendchannel.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }