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 hidden or 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