Created
December 1, 2020 13:32
-
-
Save cathalmccabe/91096b49d18c34b2d219a05b806e9bfd to your computer and use it in GitHub Desktop.
Example ipynb on Gist
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Accumulate IP in AXI mode" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import datetime\n", | |
"from pynq import Overlay\n", | |
"from pynq import DefaultIP\n", | |
"from pynq import DefaultHierarchy\n", | |
"from pynq import allocate\n", | |
"from pynq import MMIO\n", | |
"from pynq.pl import *\n", | |
"import pynq.lib.dma\n", | |
"import numpy as np\n", | |
"import time" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Control registers address" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_AP_CTRL = 0x00\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_GIE = 0x04\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_IER = 0x08\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_ISR = 0x0c\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_IN1_V_DATA = 0x10\n", | |
"XACCUMULATE_ACCEL_CONTROL_BITS_IMG_IN1_V_DATA = 32\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_IN2_V_DATA = 0x18\n", | |
"XACCUMULATE_ACCEL_CONTROL_BITS_IMG_IN2_V_DATA = 32\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_OUT_V_DATA = 0x20\n", | |
"XACCUMULATE_ACCEL_CONTROL_BITS_IMG_OUT_V_DATA = 32\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_HEIGHT_DATA = 0x28\n", | |
"XACCUMULATE_ACCEL_CONTROL_BITS_HEIGHT_DATA = 32\n", | |
"XACCUMULATE_ACCEL_CONTROL_ADDR_WIDTH_DATA = 0x30\n", | |
"XACCUMULATE_ACCEL_CONTROL_BITS_WIDTH_DATA = 32" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"#------------------------Address Info-------------------\n", | |
"# 0x00 : Control signals\n", | |
"# bit 0 - ap_start (Read/Write/COH)\n", | |
"# bit 1 - ap_done (Read/COR)\n", | |
"# bit 2 - ap_idle (Read)\n", | |
"# bit 3 - ap_ready (Read)\n", | |
"# bit 7 - auto_restart (Read/Write)\n", | |
"# others - reserved\n", | |
"# 0x04 : Global Interrupt Enable Register\n", | |
"# bit 0 - Global Interrupt Enable (Read/Write)\n", | |
"# others - reserved\n", | |
"# 0x08 : IP Interrupt Enable Register (Read/Write)\n", | |
"# bit 0 - Channel 0 (ap_done)\n", | |
"# bit 1 - Channel 1 (ap_ready)\n", | |
"# others - reserved\n", | |
"# 0x0c : IP Interrupt Status Register (Read/TOW)\n", | |
"# bit 0 - Channel 0 (ap_done)\n", | |
"# bit 1 - Channel 1 (ap_ready)\n", | |
"# others - reserved\n", | |
"# 0x10 : Data signal of img_in1_V\n", | |
"# bit 31~0 - img_in1_V[31:0] (Read/Write)\n", | |
"# 0x18 : Data signal of img_in2_V\n", | |
"# bit 31~0 - img_in2_V[31:0] (Read/Write)\n", | |
"# 0x1c : reserved\n", | |
"# 0x20 : Data signal of img_out_V\n", | |
"# bit 31~0 - img_out_V[31:0] (Read/Write)\n", | |
"# 0x24 : reserved\n", | |
"# 0x28 : Data signal of height\n", | |
"# bit 31~0 - height[31:0] (Read/Write)\n", | |
"# 0x2c : reserved\n", | |
"# 0x30 : Data signal of width\n", | |
"# bit 31~0 - width[31:0] (Read/Write)\n", | |
"# 0x34 : reserved\n", | |
"# (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ol = Overlay(\"accum.bit\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ol?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ip = ol.accumulate_accel_0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"DIM = 128\n", | |
"\n", | |
"a = allocate(shape=((DIM, DIM)), dtype=np.uint8, cacheable=True)\n", | |
"b = allocate(shape=((DIM, DIM)), dtype=np.uint8, cacheable=True)\n", | |
"c = allocate(shape=((DIM, DIM)), dtype=np.uint16, cacheable=True)\n", | |
"\n", | |
"a[:] = np.ones((DIM,DIM)).astype('int') * 11\n", | |
"b[:] = np.ones((DIM,DIM)).astype('int') * 23\n", | |
"c[:] = np.zeros((DIM,DIM)).astype('int')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"\n", | |
"ip.write(XACCUMULATE_ACCEL_CONTROL_ADDR_HEIGHT_DATA, DIM) # dst rows\n", | |
"ip.write(XACCUMULATE_ACCEL_CONTROL_ADDR_WIDTH_DATA, DIM) # dst cols" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ip.write(0x00, 4)\n", | |
"fpga_state = ip.read(0x00)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"4\n" | |
] | |
} | |
], | |
"source": [ | |
"print(fpga_state)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"a_p_ptr = a.physical_address\n", | |
"b_p_ptr = b.physical_address\n", | |
"c_p_ptr = c.physical_address\n", | |
"\n", | |
"ip.write(0x00, 4)\n", | |
"\n", | |
"if fpga_state == 4:\n", | |
" ip.write(XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_IN1_V_DATA, a_p_ptr)\n", | |
" ip.write(XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_IN2_V_DATA, b_p_ptr)\n", | |
" ip.write(XACCUMULATE_ACCEL_CONTROL_ADDR_IMG_OUT_V_DATA, c_p_ptr)\n", | |
"else:\n", | |
" print(\"Can't write values, must be in IDLE state\")\n", | |
" raise KeyboardInterrupt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ERROR: Can't go ahead\n" | |
] | |
}, | |
{ | |
"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-27-64247938b2f4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_cell_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'\\nip.write(0x00, 0x81)\\nfpga_state = ip.read(0x00)\\n\\nmax_try = 100\\nwhile fpga_state != 6 and fpga_state != 4:\\n fpga_state = ip.read(0x00)\\n max_try = max_try -1\\n if max_try == 0:\\n print(\"ERROR: Can\\'t go ahead\")\\n ip.write(0x00, 4)\\n raise KeyboardInterrupt\\n \\nip.write(0x00, 4)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
"\u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2115\u001b[0m \u001b[0mmagic_arg_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvar_expand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2116\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2117\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2118\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<decorator-gen-59>\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell)\u001b[0m\n", | |
"\u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 188\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 189\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell)\u001b[0m\n\u001b[1;32m 1055\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1056\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1057\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1058\u001b[0m \u001b[0mworst_tuning\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworst_tuning\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1059\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 139\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 140\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m<magic-timeit>\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", | |
"\u001b[0;31mKeyboardInterrupt\u001b[0m: " | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"\n", | |
"ip.write(0x00, 0x81)\n", | |
"fpga_state = ip.read(0x00)\n", | |
"\n", | |
"max_try = 100\n", | |
"while fpga_state != 6 and fpga_state != 4:\n", | |
" fpga_state = ip.read(0x00)\n", | |
" max_try = max_try -1\n", | |
" if max_try == 0:\n", | |
" print(\"ERROR: Can't go ahead\")\n", | |
" ip.write(0x00, 4)\n", | |
" raise KeyboardInterrupt\n", | |
" \n", | |
"ip.write(0x00, 4)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"c.sync_from_device()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[[0 0 0 ... 0 0 0]\n", | |
" [0 0 0 ... 0 0 0]\n", | |
" [0 0 0 ... 0 0 0]\n", | |
" ...\n", | |
" [0 0 0 ... 0 0 0]\n", | |
" [0 0 0 ... 0 0 0]\n", | |
" [0 0 0 ... 0 0 0]]\n" | |
] | |
} | |
], | |
"source": [ | |
"print(c)" | |
] | |
}, | |
{ | |
"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.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment