Skip to content

Instantly share code, notes, and snippets.

@cathalmccabe
Created December 1, 2020 13:32
Show Gist options
  • Save cathalmccabe/91096b49d18c34b2d219a05b806e9bfd to your computer and use it in GitHub Desktop.
Save cathalmccabe/91096b49d18c34b2d219a05b806e9bfd to your computer and use it in GitHub Desktop.
Example ipynb on Gist
Display the source blob
Display the rendered blob
Raw
{
"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