├── Host_summernet ├── images │ ├── 0.jpg │ └── 1.jpg ├── summernet.bin ├── overlay │ ├── summernet.bit │ └── summernet.tcl └── summer_processing.py ├── LICENSE ├── HLS_summernet ├── summernet_hls.h ├── dwconv_pwconv.cc └── summernet_hls.cc ├── README.md ├── setup.py ├── summer_processing.py └── summer_school.ipynb /Host_summernet/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA/HEAD/Host_summernet/images/0.jpg -------------------------------------------------------------------------------- /Host_summernet/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA/HEAD/Host_summernet/images/1.jpg -------------------------------------------------------------------------------- /Host_summernet/summernet.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA/HEAD/Host_summernet/summernet.bin -------------------------------------------------------------------------------- /Host_summernet/overlay/summernet.bit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA/HEAD/Host_summernet/overlay/summernet.bit -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 ZhangYuQAQ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /HLS_summernet/summernet_hls.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "hls_stream.h" 5 | #include 6 | #include 7 | 8 | 9 | //#define CSIM_DEBUG 10 | 11 | 12 | typedef ap_uint<8> uint8; 13 | //typedef ap_uint<16> uint16; 14 | 15 | 16 | 17 | 18 | typedef ap_fixed<16, 6, AP_TRN_ZERO, AP_SAT> FIX_FM; //fix point for feature map 19 | typedef ap_fixed<8, 1, AP_TRN_ZERO, AP_SAT> FIX_WT; //fix point for weights 20 | typedef ap_fixed<16, 1, AP_TRN_ZERO, AP_SAT> FIX_16_1; //fix point for weights 21 | typedef ap_fixed<32,16, AP_TRN_ZERO, AP_SAT> FIX_32_16; //fix point 22 | typedef ap_fixed<32,12, AP_TRN_ZERO, AP_SAT> FIX_32_12; 23 | typedef ap_fixed<32, 4, AP_TRN_ZERO, AP_SAT> FIX_32_4; //fix point 24 | typedef ap_fixed<32,25, AP_TRN_ZERO, AP_SAT> FIX_32_25; //fix point 25 | 26 | 27 | 28 | 29 | 30 | 31 | void summernet(uint8 image_in_raw_pad[3][162][322], 32 | 33 | FIX_16_1 fix_conv_weight_1x1_all[405][16][16], 34 | FIX_16_1 fix_conv_weight_3x3_all[22][16][3][3], 35 | FIX_16_1 fix_bias_all[67][16], 36 | 37 | FIX_FM DDR_pool_3_out_PL[48][82][162], 38 | FIX_FM DDR_pool_6_out_PL[96][42][82], 39 | 40 | //FIX_FM DDR_pool_out_PL[96][82][162], 41 | 42 | FIX_FM DDR_buf[36][16][22][42], 43 | 44 | float predict_box[5] 45 | 46 | ); 47 | 48 | void CONV_3x3_group(FIX_FM bottom[16][22][42], 49 | FIX_FM top[16][22][42], 50 | FIX_WT weight[16][3][3]); 51 | 52 | void CONV_1x1(FIX_FM bottom[16][22][42], 53 | FIX_FM top[16][22][42], 54 | FIX_WT weights[16][16]); 55 | 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hardware Acceleration Circuit Design of Object Detection Network Based on FPGA 2 | 2020 xilinx summer school 3 | 4 | # Instruction 5 | 6 |  In this project, according to the construction principle of iSmart2, a lightweight convolutional neural network is designed to complete the target detection task, which is mainly composed of 3×3 channel convolution and 1×1 point convolution. Then, FPGA hardware acceleration circuit modules are designed for these two types of convolutions to improve the speed of convolution operation, and the development board resources are saved by multiplexing the convolution operation modules. 7 | 8 |  The hardware acceleration circuit designed on the PYNQ-Z2 development board can accomplish the target detection task well, and the output boundary box can accurately select the pedestrian or object in the picture. 9 | 10 | # Improvements 11 |  Summernet is improved on the basis of ismart2, with the following two main improvements: 12 | - **Summernet has more 1*1 pointwise convolution calculation units than ismart2** 13 | - **The bounding box can be read and marked on the input picture** 14 | 15 | # Organization 16 | - HLS_summernet: The summernet model is implemented by using HLS 17 | 18 | - Host_summernet: The bit and tcl file for FPGA configuration, and host code for FPGA control. 19 | 20 | # References 21 | - https://github.com/onioncc/iSmartDNN 22 | - https://github.com/ZhangYuQAQ/SkyNet 23 | 24 | # Quick Start 25 | 26 | Open a terminal on your PYNQ board and run: 27 | 28 | ```python 29 | sudo pip3 install --upgrade git+https://github.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA.git 30 | ``` 31 | 32 | or ofline install: 33 | 34 | ```python 35 | sudo pip3 install --upgrade 36 | ``` 37 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | from distutils.dir_util import copy_tree 4 | 5 | from setuptools import find_packages, setup 6 | 7 | # global variables 8 | board = os.environ['BOARD'] 9 | repo_board_folder = f'Host_summernet' 10 | board_notebooks_dir = os.environ['PYNQ_JUPYTER_NOTEBOOKS'] 11 | board_project_dir = os.path.join(board_notebooks_dir, 'summernet_deploy') 12 | 13 | # check whether board is supported 14 | def check_env(): 15 | if not board == 'PYNQ-Z2': 16 | raise ValueError("Board {} is not supported.".format(board)) 17 | 18 | # check if the path already exists, delete if so 19 | def check_path(): 20 | if os.path.exists(board_project_dir): 21 | shutil.rmtree(board_project_dir) 22 | 23 | # copy overlays to python package 24 | def copy_overlays(): 25 | src_ol_dir = os.path.join(repo_board_folder, 'overlay') 26 | dst_ol_dir = os.path.join(board_project_dir, 'overlay') 27 | copy_tree(src_ol_dir, dst_ol_dir) 28 | 29 | # copy notebooks to jupyter home 30 | def copy_notebooks(): 31 | src_nb_dir = os.path.join(repo_board_folder) 32 | dst_nb_dir = os.path.join(board_project_dir) 33 | copy_tree(src_nb_dir, dst_nb_dir) 34 | 35 | check_env() 36 | check_path() 37 | copy_overlays() 38 | copy_notebooks() 39 | 40 | setup( 41 | name="Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA", 42 | version='1.0', 43 | install_requires=[ 44 | 'pynq>=2.3', 45 | ], 46 | url='https://github.com/ZhangYuQAQ/Hardware-Acceleration-Circuit-Design-of-Object-Detection-Network-Based-on-FPGA', 47 | license='MIT License', 48 | author="zhangyu", 49 | author_email="1433213806@qq.com", 50 | packages=find_packages(), 51 | description="PYNQ example of a Hardware-Acceleration.") -------------------------------------------------------------------------------- /HLS_summernet/dwconv_pwconv.cc: -------------------------------------------------------------------------------- 1 | 2 | 3 | // conv 3x3 for group (depth-wise convolutions) 4 | 5 | #include 6 | #include 7 | #include 8 | #include "hls_stream.h" 9 | #include "summernet_hls.h" 10 | 11 | 12 | void load_weights(FIX_WT weight_buf[16], 13 | FIX_WT weights[16][3][3], 14 | int i, int j) 15 | { 16 | #pragma HLS ARRAY_PARTITION variable=weights dim=1 factor=16 17 | 18 | for(int coo = 0; coo < 16; coo++){ 19 | #pragma HLS unroll 20 | weight_buf[coo] = weights[coo][i][j]; 21 | 22 | } 23 | } 24 | 25 | 26 | void CONV_3x3_group(FIX_FM bottom[16][22][42], 27 | FIX_FM top[16][22][42], 28 | FIX_WT weights[16][3][3]) 29 | { 30 | 31 | FIX_WT weight_buf[16]; 32 | 33 | #pragma HLS ARRAY_PARTITION variable=bottom cyclic dim=1 factor=16 34 | #pragma HLS ARRAY_PARTITION variable=top cyclic dim=1 factor=16 35 | #pragma HLS ARRAY_PARTITION variable=weight_buf complete 36 | 37 | 38 | for(int i = 0; i < 3; i++){ 39 | for(int j = 0; j < 3; j++){ 40 | 41 | #pragma HLS dataflow 42 | 43 | load_weights(weight_buf, weights, i, j); 44 | 45 | for(int h = 1; h <= 20; h++){ 46 | for(int w = 1; w <= 40; w++){ 47 | #pragma HLS pipeline 48 | for(int co = 0; co < 16; co++){ 49 | #pragma HLS unroll 50 | 51 | top[co][h][w] += weight_buf[co] * bottom[co][h+i-1][w+j-1]; 52 | } 53 | } 54 | } 55 | } 56 | } 57 | 58 | } 59 | 60 | // Conv 1x1 PE 61 | 62 | FIX_32_12 compute_engine_16(FIX_WT w0, FIX_FM b0, 63 | FIX_WT w1, FIX_FM b1, 64 | FIX_WT w2, FIX_FM b2, 65 | FIX_WT w3, FIX_FM b3, 66 | FIX_WT w4, FIX_FM b4, 67 | FIX_WT w5, FIX_FM b5, 68 | FIX_WT w6, FIX_FM b6, 69 | FIX_WT w7, FIX_FM b7, 70 | FIX_WT w8, FIX_FM b8, 71 | FIX_WT w9, FIX_FM b9, 72 | FIX_WT w10, FIX_FM b10, 73 | FIX_WT w11, FIX_FM b11, 74 | FIX_WT w12, FIX_FM b12, 75 | FIX_WT w13, FIX_FM b13, 76 | FIX_WT w14, FIX_FM b14, 77 | FIX_WT w15, FIX_FM b15) 78 | { 79 | FIX_32_12 mul0, mul1, mul2, mul3, mul4, mul5, mul6, mul7; 80 | FIX_32_12 mul8, mul9, mul10, mul11, mul12, mul13, mul14, mul15; 81 | FIX_32_12 add0, add1, add2, add3, add4, add5, add6; 82 | FIX_32_12 add7, add8, add9, add10, add11, add12, add13, add14; 83 | 84 | mul0 = w0 * b0; 85 | mul1 = w1 * b1; 86 | mul2 = w2 * b2; 87 | mul3 = w3 * b3; 88 | mul4 = w4 * b4; 89 | mul5 = w5 * b5; 90 | mul6 = w6 * b6; 91 | mul7 = w7 * b7; 92 | mul8 = w8 * b8; 93 | mul9 = w9 * b9; 94 | mul10 = w10 * b10; 95 | mul11 = w11 * b11; 96 | mul12 = w12 * b12; 97 | mul13 = w13 * b13; 98 | mul14 = w14 * b14; 99 | mul15 = w15 * b15; 100 | 101 | 102 | add0 = mul0 + mul1; 103 | add1 = mul2 + mul3; 104 | add2 = mul4 + mul5; 105 | add3 = mul6 + mul7; 106 | add4 = mul8 + mul9; 107 | add5 = mul10 + mul11; 108 | add6 = mul12 + mul13; 109 | add7 = mul14 + mul15; 110 | 111 | add8 = add0 + add1; 112 | add9 = add2 + add3; 113 | add10 = add4 + add5; 114 | add11 = add6 + add7; 115 | 116 | add12 = add8 + add9; 117 | add13 = add10 + add11; 118 | 119 | add14 = add12 + add13; 120 | 121 | return add14; 122 | 123 | } 124 | 125 | 126 | 127 | 128 | 129 | 130 | void CONV_1x1(FIX_FM bottom[16][22][42], 131 | FIX_FM top[16][22][42], 132 | FIX_WT weights[16][16]) 133 | { 134 | FIX_WT weight_buf[16][16]; 135 | FIX_32_12 tmp[16]; 136 | 137 | #pragma HLS ARRAY_PARTITION variable=bottom cyclic dim=1 factor=16 138 | #pragma HLS ARRAY_PARTITION variable=top cyclic dim=1 factor=16 139 | #pragma HLS ARRAY_PARTITION variable=weight_buf dim=1 factor=16 140 | #pragma HLS ARRAY_PARTITION variable=weight_buf dim=2 factor=16 141 | #pragma HLS ARRAY_PARTITION variable=tmp complete 142 | 143 | #pragma HLS ALLOCATION instances=compute_engine_16 limit=9 function 144 | 145 | for(int i = 0; i < 16; i++) 146 | for(int j = 0; j < 16; j++) 147 | weight_buf[i][j] = weights[i][j]; 148 | 149 | 150 | for(int h = 1; h <= 20; h++){ 151 | for(int w = 1; w <= 40; w++) { 152 | 153 | 154 | #pragma HLS pipeline 155 | 156 | for(int coo = 0; coo < 16; coo++) { 157 | #pragma HLS unroll 158 | 159 | tmp[coo] = compute_engine_16( 160 | weight_buf[coo][0], bottom[0][h][w], 161 | weight_buf[coo][1], bottom[1][h][w], 162 | weight_buf[coo][2], bottom[2][h][w], 163 | weight_buf[coo][3], bottom[3][h][w], 164 | weight_buf[coo][4], bottom[4][h][w], 165 | weight_buf[coo][5], bottom[5][h][w], 166 | weight_buf[coo][6], bottom[6][h][w], 167 | weight_buf[coo][7], bottom[7][h][w], 168 | weight_buf[coo][8], bottom[8][h][w], 169 | weight_buf[coo][9], bottom[9][h][w], 170 | weight_buf[coo][10], bottom[10][h][w], 171 | weight_buf[coo][11], bottom[11][h][w], 172 | weight_buf[coo][12], bottom[12][h][w], 173 | weight_buf[coo][13], bottom[13][h][w], 174 | weight_buf[coo][14], bottom[14][h][w], 175 | weight_buf[coo][15], bottom[15][h][w]); 176 | } 177 | 178 | for(int coo = 0; coo < 16; coo++) 179 | #pragma HLS unroll 180 | top[coo][h][w] += tmp[coo]; 181 | 182 | // } 183 | } 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /summer_processing.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import xml.dom.minidom 4 | 5 | 6 | BATCH_SIZE = 500 7 | DAC_CONTEST = '/home/xilinx/jupyter_notebooks/summer_school' 8 | IMG_DIR = '/home/xilinx/jupyter_notebooks/summer_school/images' 9 | OVERLAY_DIR = '/home/xilinx/jupyter_notebooks/summer_school/overlay' 10 | RESULT = '/home/xilinx/jupyter_notebooks/summer_school/result' 11 | TIME_DIR = '/home/xilinx/jupyter_notebooks/summer_school/result/time' 12 | COORD_DIR = '/home/xilinx/jupyter_notebooks/summer_school/result/coordinate' 13 | XML_PATH = '/home/xilinx/jupyter_notebooks/summer_school/result/xml' 14 | 15 | def path_mkdir(): 16 | if not os.path.isdir(DAC_CONTEST): 17 | os.mkdir(DAC_CONTEST) 18 | if not os.path.isdir(IMG_DIR): 19 | os.mkdir(IMG_DIR) 20 | if not os.path.isdir(OVERLAY_DIR): 21 | os.mkdir(OVERLAY_DIR) 22 | if not os.path.isdir(RESULT): 23 | os.mkdir(RESULT) 24 | if not os.path.isdir(TIME_DIR): 25 | os.mkdir(TIME_DIR) 26 | if not os.path.isdir(COORD_DIR): 27 | os.mkdir(COORD_DIR) 28 | if not os.path.isdir(XML_PATH): 29 | os.mkdir(XML_PATH) 30 | 31 | 32 | 33 | 34 | # Get image name list 35 | def get_image_names(): 36 | names_temp = [f for f in os.listdir(IMG_DIR) if f.endswith('.jpg')] 37 | names_temp.sort(key= lambda x:int(x[:-4])) 38 | return names_temp 39 | 40 | 41 | # Process the images in batches, may help when write to XML 42 | def get_image_batch(): 43 | image_list = get_image_names() 44 | batches = list() 45 | for i in range(0, len(image_list), BATCH_SIZE): 46 | batches.append(image_list[i:i+BATCH_SIZE]) 47 | return batches 48 | 49 | 50 | # Get image paths in batches 51 | def get_image_path(image_name): 52 | return os.path.join(IMG_DIR, image_name) 53 | 54 | 55 | # Return a batch of image dir when `send` is called 56 | class Agent: 57 | def __init__(self, teamname): 58 | self.batch_count = 0 59 | self.dac_contest = DAC_CONTEST 60 | self.img_dir = IMG_DIR 61 | self.overlay_dir = OVERLAY_DIR 62 | self.overlay_dir_team = OVERLAY_DIR + '/' + teamname 63 | self.result = RESULT 64 | self.time_dir = TIME_DIR 65 | self.coord_dir = COORD_DIR 66 | self.xml_path = XML_PATH 67 | self.coord_team = COORD_DIR + '/' + teamname 68 | self.xml_team = XML_PATH + '/' + teamname 69 | self.contestant = DAC_CONTEST + '/' + teamname 70 | folder_list = [self.dac_contest, self.img_dir, self.overlay_dir, 71 | self.overlay_dir_team, 72 | self.result, 73 | self.time_dir, self.coord_dir, self.xml_path, 74 | self.coord_team, self.xml_team, self.contestant] 75 | for folder in folder_list: 76 | if not os.path.isdir(folder): 77 | os.mkdir(folder) 78 | self.img_list = get_image_names() 79 | self.img_batch = get_image_batch() 80 | 81 | def send(self, interval_time, batches): 82 | time.sleep(interval_time) 83 | tmp = batches[self.batch_count] 84 | self.batch_count += 1 85 | return tmp 86 | 87 | def reset_batch_count(self): 88 | self.batch_count = 0 89 | 90 | def write(self, t_batch, total_img, teamname): 91 | fps = total_img / t_batch 92 | with open(self.time_dir + '/' + teamname + '.txt', 'a+') as f: 93 | f.write("\n" + teamname + " Frames per second: " + 94 | str(fps) + '\n') 95 | 96 | def save_results_xml(self, result_rectangle): 97 | if len(result_rectangle) != len(self.img_list): 98 | raise ValueError("Result length not equal to number of images.") 99 | for i in range(len(self.img_list)): 100 | doc = xml.dom.minidom.Document() 101 | root = doc.createElement('annotation') 102 | 103 | doc.appendChild(root) 104 | name_e = doc.createElement('filename') 105 | name_t = doc.createTextNode(self.img_list[i]) 106 | name_e.appendChild(name_t) 107 | root.appendChild(name_e) 108 | 109 | size_e = doc.createElement('size') 110 | node_width = doc.createElement('width') 111 | node_width.appendChild(doc.createTextNode("640")) 112 | node_length = doc.createElement('length') 113 | node_length.appendChild(doc.createTextNode("360")) 114 | size_e.appendChild(node_width) 115 | size_e.appendChild(node_length) 116 | root.appendChild(size_e) 117 | 118 | object_node = doc.createElement('object') 119 | node_name = doc.createElement('name') 120 | node_name.appendChild(doc.createTextNode("NotCare")) 121 | node_bnd_box = doc.createElement('bndbox') 122 | node_bnd_box_xmin = doc.createElement('xmin') 123 | node_bnd_box_xmin.appendChild( 124 | doc.createTextNode(str(result_rectangle[i][0]))) 125 | node_bnd_box_xmax = doc.createElement('xmax') 126 | node_bnd_box_xmax.appendChild( 127 | doc.createTextNode(str(result_rectangle[i][1]))) 128 | node_bnd_box_ymin = doc.createElement('ymin') 129 | node_bnd_box_ymin.appendChild( 130 | doc.createTextNode(str(result_rectangle[i][2]))) 131 | node_bnd_box_ymax = doc.createElement('ymax') 132 | node_bnd_box_ymax.appendChild( 133 | doc.createTextNode(str(result_rectangle[i][3]))) 134 | node_bnd_box.appendChild(node_bnd_box_xmin) 135 | node_bnd_box.appendChild(node_bnd_box_xmax) 136 | node_bnd_box.appendChild(node_bnd_box_ymin) 137 | node_bnd_box.appendChild(node_bnd_box_ymax) 138 | 139 | object_node.appendChild(node_name) 140 | object_node.appendChild(node_bnd_box) 141 | root.appendChild(object_node) 142 | 143 | file_name = self.img_list[i].replace('jpg', 'xml') 144 | with open(self.xml_team + "/" + file_name, 'w') as fp: 145 | doc.writexml(fp, indent='\t', addindent='\t', 146 | newl='\n', encoding="utf-8") 147 | -------------------------------------------------------------------------------- /Host_summernet/summer_processing.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import xml.dom.minidom 4 | 5 | 6 | BATCH_SIZE = 500 7 | DAC_CONTEST = '/home/xilinx/jupyter_notebooks/summer_school' 8 | IMG_DIR = '/home/xilinx/jupyter_notebooks/summer_school/images' 9 | OVERLAY_DIR = '/home/xilinx/jupyter_notebooks/summer_school/overlay' 10 | RESULT = '/home/xilinx/jupyter_notebooks/summer_school/result' 11 | TIME_DIR = '/home/xilinx/jupyter_notebooks/summer_school/result/time' 12 | COORD_DIR = '/home/xilinx/jupyter_notebooks/summer_school/result/coordinate' 13 | XML_PATH = '/home/xilinx/jupyter_notebooks/summer_school/result/xml' 14 | 15 | def path_mkdir(): 16 | if not os.path.isdir(DAC_CONTEST): 17 | os.mkdir(DAC_CONTEST) 18 | if not os.path.isdir(IMG_DIR): 19 | os.mkdir(IMG_DIR) 20 | if not os.path.isdir(OVERLAY_DIR): 21 | os.mkdir(OVERLAY_DIR) 22 | if not os.path.isdir(RESULT): 23 | os.mkdir(RESULT) 24 | if not os.path.isdir(TIME_DIR): 25 | os.mkdir(TIME_DIR) 26 | if not os.path.isdir(COORD_DIR): 27 | os.mkdir(COORD_DIR) 28 | if not os.path.isdir(XML_PATH): 29 | os.mkdir(XML_PATH) 30 | 31 | 32 | 33 | 34 | # Get image name list 35 | def get_image_names(): 36 | names_temp = [f for f in os.listdir(IMG_DIR) if f.endswith('.jpg')] 37 | names_temp.sort(key= lambda x:int(x[:-4])) 38 | return names_temp 39 | 40 | 41 | # Process the images in batches, may help when write to XML 42 | def get_image_batch(): 43 | image_list = get_image_names() 44 | batches = list() 45 | for i in range(0, len(image_list), BATCH_SIZE): 46 | batches.append(image_list[i:i+BATCH_SIZE]) 47 | return batches 48 | 49 | 50 | # Get image paths in batches 51 | def get_image_path(image_name): 52 | return os.path.join(IMG_DIR, image_name) 53 | 54 | 55 | # Return a batch of image dir when `send` is called 56 | class Agent: 57 | def __init__(self, teamname): 58 | self.batch_count = 0 59 | self.dac_contest = DAC_CONTEST 60 | self.img_dir = IMG_DIR 61 | self.overlay_dir = OVERLAY_DIR 62 | self.overlay_dir_team = OVERLAY_DIR + '/' + teamname 63 | self.result = RESULT 64 | self.time_dir = TIME_DIR 65 | self.coord_dir = COORD_DIR 66 | self.xml_path = XML_PATH 67 | self.coord_team = COORD_DIR + '/' + teamname 68 | self.xml_team = XML_PATH + '/' + teamname 69 | self.contestant = DAC_CONTEST + '/' + teamname 70 | folder_list = [self.dac_contest, self.img_dir, self.overlay_dir, 71 | self.overlay_dir_team, 72 | self.result, 73 | self.time_dir, self.coord_dir, self.xml_path, 74 | self.coord_team, self.xml_team, self.contestant] 75 | for folder in folder_list: 76 | if not os.path.isdir(folder): 77 | os.mkdir(folder) 78 | self.img_list = get_image_names() 79 | self.img_batch = get_image_batch() 80 | 81 | def send(self, interval_time, batches): 82 | time.sleep(interval_time) 83 | tmp = batches[self.batch_count] 84 | self.batch_count += 1 85 | return tmp 86 | 87 | def reset_batch_count(self): 88 | self.batch_count = 0 89 | 90 | def write(self, t_batch, total_img, teamname): 91 | fps = total_img / t_batch 92 | with open(self.time_dir + '/' + teamname + '.txt', 'a+') as f: 93 | f.write("\n" + teamname + " Frames per second: " + 94 | str(fps) + '\n') 95 | 96 | def save_results_xml(self, result_rectangle): 97 | if len(result_rectangle) != len(self.img_list): 98 | raise ValueError("Result length not equal to number of images.") 99 | for i in range(len(self.img_list)): 100 | doc = xml.dom.minidom.Document() 101 | root = doc.createElement('annotation') 102 | 103 | doc.appendChild(root) 104 | name_e = doc.createElement('filename') 105 | name_t = doc.createTextNode(self.img_list[i]) 106 | name_e.appendChild(name_t) 107 | root.appendChild(name_e) 108 | 109 | size_e = doc.createElement('size') 110 | node_width = doc.createElement('width') 111 | node_width.appendChild(doc.createTextNode("640")) 112 | node_length = doc.createElement('length') 113 | node_length.appendChild(doc.createTextNode("360")) 114 | size_e.appendChild(node_width) 115 | size_e.appendChild(node_length) 116 | root.appendChild(size_e) 117 | 118 | object_node = doc.createElement('object') 119 | node_name = doc.createElement('name') 120 | node_name.appendChild(doc.createTextNode("NotCare")) 121 | node_bnd_box = doc.createElement('bndbox') 122 | node_bnd_box_xmin = doc.createElement('xmin') 123 | node_bnd_box_xmin.appendChild( 124 | doc.createTextNode(str(result_rectangle[i][0]))) 125 | node_bnd_box_xmax = doc.createElement('xmax') 126 | node_bnd_box_xmax.appendChild( 127 | doc.createTextNode(str(result_rectangle[i][1]))) 128 | node_bnd_box_ymin = doc.createElement('ymin') 129 | node_bnd_box_ymin.appendChild( 130 | doc.createTextNode(str(result_rectangle[i][2]))) 131 | node_bnd_box_ymax = doc.createElement('ymax') 132 | node_bnd_box_ymax.appendChild( 133 | doc.createTextNode(str(result_rectangle[i][3]))) 134 | node_bnd_box.appendChild(node_bnd_box_xmin) 135 | node_bnd_box.appendChild(node_bnd_box_xmax) 136 | node_bnd_box.appendChild(node_bnd_box_ymin) 137 | node_bnd_box.appendChild(node_bnd_box_ymax) 138 | 139 | object_node.appendChild(node_name) 140 | object_node.appendChild(node_bnd_box) 141 | root.appendChild(object_node) 142 | 143 | file_name = self.img_list[i].replace('jpg', 'xml') 144 | with open(self.xml_team + "/" + file_name, 'w') as fp: 145 | doc.writexml(fp, indent='\t', addindent='\t', 146 | newl='\n', encoding="utf-8") 147 | -------------------------------------------------------------------------------- /HLS_summernet/summernet_hls.cc: -------------------------------------------------------------------------------- 1 | #include "summernet_hls.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | 10 | 11 | // feature map buffers 12 | FIX_FM FM_buf1[16][22][42]; 13 | FIX_FM FM_buf2[16][22][42]; 14 | FIX_FM FM_buf3[16][22][42]; 15 | FIX_FM FM_buf4[16][22][42]; 16 | FIX_FM FM_buf5[16][22][42]; 17 | FIX_FM FM_buf6[16][22][42]; 18 | FIX_FM FM_buf7[16][22][42]; 19 | FIX_FM FM_buf8[16][22][42]; 20 | FIX_FM FM_buf9[16][22][42]; 21 | FIX_FM FM_buf10[16][22][42]; 22 | FIX_FM FM_buf11[16][22][42]; 23 | FIX_FM FM_buf12[16][22][42]; 24 | FIX_FM FM_buf13[16][22][42]; 25 | FIX_FM FM_buf14[16][22][42]; 26 | FIX_FM FM_buf15[16][22][42]; 27 | 28 | FIX_FM FM_buf_pool[16][10][20]; 29 | 30 | 31 | 32 | FIX_WT weight_buf_1x1[4][16][16]; 33 | FIX_WT weight_buf_3x3[4][16][3][3]; 34 | 35 | 36 | 37 | FIX_WT bias_buf[16][16]; 38 | 39 | 40 | 41 | FIX_32_25 my_exp_fix(FIX_FM input) 42 | { 43 | #pragma HLS latency min=2 max=20 44 | FIX_32_25 output; 45 | 46 | output = (FIX_32_25)hls::exp((float)input); 47 | return output; 48 | } 49 | 50 | 51 | void compute_bounding_box(float predict_box[5]) 52 | { 53 | int batch_size = 1; 54 | int num_anchors = 2; 55 | int h = 20; 56 | int w = 40; 57 | 58 | FIX_32_4 box[4] = {1.4940052559648322, 2.3598481287086823, 4.0113013115312155, 5.760873975661669}; 59 | 60 | FIX_32_4 conf_thresh = 0.0; 61 | int conf_j = 0; 62 | int conf_m = 0; 63 | int conf_n = 0; 64 | 65 | FIX_32_4 conf_box1 = 0.0; 66 | FIX_32_4 conf_box2 = 0.0; 67 | 68 | for(int m = 1; m <= h; m++){ 69 | for(int n = 1 ;n <= w; n++){ 70 | conf_box1 = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[4][m][n])); 71 | if(conf_box1 > conf_thresh){ 72 | conf_thresh = conf_box1; 73 | conf_j = 0; 74 | conf_m = m; 75 | conf_n = n; 76 | 77 | } 78 | } 79 | } 80 | 81 | for(int m = 1; m <= h; m++){ 82 | for(int n = 1; n <= w; n++){ 83 | conf_box2 = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[9][m][n])); 84 | if(conf_box2 > conf_thresh){ 85 | conf_thresh = conf_box2; 86 | conf_j = 1; 87 | conf_m = m; 88 | conf_n = n; 89 | } 90 | } 91 | } 92 | 93 | if( conf_j == 0 ) { 94 | // first bounding box 95 | predict_box[0] = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[0][conf_m][conf_n])) + (FIX_32_25)(conf_n-1); 96 | predict_box[1] = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[1][conf_m][conf_n])) + (FIX_32_25)(conf_m-1); 97 | predict_box[2] = my_exp_fix(FM_buf2[2][conf_m][conf_n]) * box[0]; 98 | predict_box[3] = my_exp_fix(FM_buf2[3][conf_m][conf_n]) * box[1]; 99 | predict_box[4] = conf_thresh; 100 | } 101 | else if( conf_j == 1 ) { 102 | // second bounding box 103 | predict_box[0] = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[5][conf_m][conf_n])) + (FIX_32_25)(conf_n-1); 104 | predict_box[1] = (FIX_32_25)1 / ((FIX_32_25)1 + my_exp_fix(-FM_buf2[6][conf_m][conf_n])) + (FIX_32_25)(conf_m-1); 105 | predict_box[2] = my_exp_fix(FM_buf2[7][conf_m][conf_n]) * box[2]; 106 | predict_box[3] = my_exp_fix(FM_buf2[8][conf_m][conf_n]) * box[3]; 107 | predict_box[4] = conf_thresh; 108 | } 109 | 110 | 111 | 112 | 113 | 114 | } 115 | 116 | 117 | void buffer_copy_to_axi( FIX_FM dest[16][22][42], FIX_FM src[16][22][42]) 118 | { 119 | //memcpy(dest, src, sizeof(FIX_FM)*16*22*42); 120 | for(int i = 0; i < 16; i++) 121 | for(int j = 1; j <= 20; j++) 122 | for(int k = 1; k <=40; k++) 123 | #pragma HLS pipeline 124 | dest[i][j][k] = src[i][j][k]; 125 | } 126 | 127 | void buffer_copy_from_axi( FIX_FM dest[16][22][42], FIX_FM src[16][22][42]) 128 | { 129 | //memcpy(dest, src, sizeof(FIX_FM)*16*22*42); 130 | for(int i = 0; i < 16; i++) 131 | for(int j = 0; j < 22; j++) 132 | for(int k = 0; k < 42; k++) 133 | #pragma HLS pipeline 134 | dest[i][j][k] = src[i][j][k]; 135 | } 136 | 137 | 138 | void load_weight_2D_from_axi( FIX_WT dest[16][16], FIX_16_1 src[16][16]) 139 | { 140 | for(int i = 0; i < 16; i++) { 141 | for(int j = 0; j < 16; j++) { 142 | #pragma HLS pipeline 143 | dest[i][j] = (FIX_WT)src[i][j]; 144 | } 145 | } 146 | } 147 | 148 | void load_weight_3D_from_axi( FIX_WT dest[16][3][3], FIX_16_1 src[16][3][3]) 149 | { 150 | for(int i = 0; i < 16; i++) { 151 | for(int j = 0; j < 3; j++) { 152 | for(int k = 0; k < 3; k++) { 153 | #pragma HLS pipeline 154 | dest[i][j][k] = (FIX_WT)src[i][j][k]; 155 | } 156 | } 157 | } 158 | } 159 | 160 | 161 | void load_bias_from_axi(FIX_WT dest[16][16], FIX_16_1 src[16]) 162 | { 163 | for(int i = 0; i < 16; i++) { 164 | dest[i][0] = (FIX_WT)src[i]; 165 | } 166 | } 167 | 168 | void set_bias( FIX_FM buf[16][22][42], FIX_WT bias[16][16]) 169 | { 170 | #pragma HLS ARRAY_PARTITION variable=buf dim=1 complete 171 | #pragma HLS ARRAY_PARTITION variable=bias dim=1 complete 172 | 173 | for(int j = 1; j <= 20; j++) { 174 | for(int k = 1; k <= 40; k++) { 175 | #pragma HLS pipeline 176 | 177 | for(int i = 0; i < 16; i++) 178 | buf[i][j][k] = (FIX_FM)bias[i][0]; 179 | 180 | } 181 | } 182 | } 183 | 184 | void copy_to_DDR_pool9( FIX_FM dest[16][22][42], FIX_FM buf[16][10][20], int b_col, int b_row ) 185 | { 186 | for(int i = 0; i < 16; i++) { 187 | for(int j = 0; j < 10; j++) { 188 | for(int k = 0; k < 20; k++) { 189 | #pragma HLS pipeline 190 | dest[i][j+1 + b_col*10][k+1 + b_row*20] = buf[i][j][k]; 191 | } 192 | } 193 | } 194 | } 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | void copy_to_DDR_pool3( FIX_FM ddr_pool3[48][82][162], FIX_FM buf[16][10][20], int ch, int col, int row) 203 | { 204 | for(int i = 0; i < 16; i++) { 205 | for(int j = 0; j < 10; j++) { 206 | for(int k = 0; k < 20; k++) { 207 | #pragma HLS pipeline 208 | ddr_pool3[i + ch*16][j+1 + col*10][k+1 + row*20] = buf[i][j][k]; 209 | } 210 | } 211 | } 212 | } 213 | 214 | 215 | void copy_to_DDR_pool6( FIX_FM ddr_pool6[96][42][82], FIX_FM buf[16][10][20], int ch, int col, int row) 216 | { 217 | for(int i = 0; i < 16; i++) { 218 | for(int j = 0; j < 10; j++) { 219 | for(int k = 0; k < 20; k++) { 220 | #pragma HLS pipeline 221 | ddr_pool6[i + ch*16][j+1 + col*10][k+1 + row*20] = buf[i][j][k]; 222 | } 223 | } 224 | } 225 | } 226 | 227 | 228 | 229 | void load_pool3_from_axi(FIX_FM buf[16][22][42], FIX_FM DDR_pool3[48][82][162], 230 | int ch, int col, int row) 231 | { 232 | for(int i = 0; i < 16; i++) { 233 | for(int h = 0; h < 22; h++) { 234 | for(int w = 0; w < 42; w++ ) { 235 | #pragma HLS pipeline 236 | buf[i][h][w] = DDR_pool3[i + ch*16][h + col*20][w + row*40]; 237 | } 238 | } 239 | } 240 | } 241 | 242 | 243 | void load_pool6_from_axi(FIX_FM buf[16][22][42], FIX_FM DDR_pool6[96][42][82], 244 | int ch, int col, int row) 245 | { 246 | for(int i = 0; i < 16; i++) { 247 | for(int h = 0; h < 22; h++) { 248 | for(int w = 0; w < 42; w++ ) { 249 | #pragma HLS pipeline 250 | buf[i][h][w] = DDR_pool6[i + ch*16][h + col*20][w + row*40]; 251 | } 252 | } 253 | } 254 | } 255 | 256 | 257 | FIX_FM img_norm_ch[256] = { 258 | -2.000000, -1.984314, -1.968627, -1.952941, -1.937255, -1.921569, -1.905882, -1.890196, -1.874510, -1.858824, -1.843137, -1.827451, -1.811765, -1.796078, -1.780392, -1.764706, -1.749020, 259 | -1.733333, -1.717647, -1.701961, -1.686275, -1.670588, -1.654902, -1.639216, -1.623529, -1.607843, -1.592157, -1.576471, -1.560784, -1.545098, -1.529412, -1.513725, -1.498039, 260 | -1.482353, -1.466667, -1.450980, -1.435294, -1.419608, -1.403922, -1.388235, -1.372549, -1.356863, -1.341176, -1.325490, -1.309804, -1.294118, -1.278431, -1.262745, -1.247059, 261 | -1.231373, -1.215686, -1.200000, -1.184314, -1.168627, -1.152941, -1.137255, -1.121569, -1.105882, -1.090196, -1.074510, -1.058824, -1.043137, -1.027451, -1.011765, -0.996078, 262 | -0.980392, -0.964706, -0.949020, -0.933333, -0.917647, -0.901961, -0.886275, -0.870588, -0.854902, -0.839216, -0.823529, -0.807843, -0.792157, -0.776471, -0.760784, -0.745098, 263 | -0.729412, -0.713725, -0.698039, -0.682353, -0.666667, -0.650980, -0.635294, -0.619608, -0.603922, -0.588235, -0.572549, -0.556863, -0.541176, -0.525490, -0.509804, -0.494118, 264 | -0.478431, -0.462745, -0.447059, -0.431373, -0.415686, -0.400000, -0.384314, -0.368627, -0.352941, -0.337255, -0.321569, -0.305882, -0.290196, -0.274510, -0.258824, -0.243137, 265 | -0.227451, -0.211765, -0.196078, -0.180392, -0.164706, -0.149020, -0.133333, -0.117647, -0.101961, -0.086275, -0.070588, -0.054902, -0.039216, -0.023529, -0.007843, 0.007843, 266 | 0.023529, 0.039216, 0.054902, 0.070588, 0.086275, 0.101961, 0.117647, 0.133333, 0.149020, 0.164706, 0.180392, 0.196078, 0.211765, 0.227451, 0.243137, 0.258824, 267 | 0.274510, 0.290196, 0.305882, 0.321569, 0.337255, 0.352941, 0.368627, 0.384314, 0.400000, 0.415686, 0.431373, 0.447059, 0.462745, 0.478431, 0.494118, 0.509804, 268 | 0.525490, 0.541176, 0.556863, 0.572549, 0.588235, 0.603922, 0.619608, 0.635294, 0.650980, 0.666667, 0.682353, 0.698039, 0.713725, 0.729412, 0.745098, 0.760784, 269 | 0.776471, 0.792157, 0.807843, 0.823529, 0.839216, 0.854902, 0.870588, 0.886275, 0.901961, 0.917647, 0.933333, 0.949020, 0.964706, 0.980392, 0.996078, 1.011765, 270 | 1.027451, 1.043137, 1.058824, 1.074510, 1.090196, 1.105882, 1.121569, 1.137255, 1.152941, 1.168627, 1.184314, 1.200000, 1.215686, 1.231373, 1.247059, 1.262745, 271 | 1.278431, 1.294118, 1.309804, 1.325490, 1.341176, 1.356863, 1.372549, 1.388235, 1.403922, 1.419608, 1.435294, 1.450980, 1.466667, 1.482353, 1.498039, 1.513725, 272 | 1.529412, 1.545098, 1.560784, 1.576471, 1.592157, 1.607843, 1.623529, 1.639216, 1.654902, 1.670588, 1.686275, 1.701961, 1.717647, 1.733333, 1.749020, 1.764706, 273 | 1.780392, 1.796078, 1.811765, 1.827451, 1.843137, 1.858824, 1.874510, 1.890196, 1.905882, 1.921569, 1.937255, 1.952941, 1.968627, 1.984314, 2.000000 274 | }; 275 | 276 | 277 | void load_image_chunk_norm(FIX_FM img_buf[16][22][42], uint8 image_in_raw_pad[3][162][322], 278 | int col, int row) 279 | { 280 | for(int i = 0; i < 22; i++) { 281 | for(int j = 0; j < 42; j++) { 282 | 283 | img_buf[0][i][j] = img_norm_ch[(image_in_raw_pad[0][i + col*20][j + row*40]).to_uint()]; 284 | } 285 | } 286 | 287 | for(int i = 0; i < 22; i++) { 288 | for(int j = 0; j < 42; j++) { 289 | 290 | img_buf[1][i][j] = img_norm_ch[(image_in_raw_pad[1][i + col*20][j + row*40]).to_uint()]; 291 | } 292 | } 293 | 294 | for(int i = 0; i < 22; i++) { 295 | for(int j = 0; j < 42; j++) { 296 | 297 | img_buf[2][i][j] = img_norm_ch[(image_in_raw_pad[2][i + col*20][j + row*40]).to_uint()]; 298 | } 299 | } 300 | } 301 | 302 | 303 | 304 | 305 | inline FIX_FM max(FIX_FM a, FIX_FM b, FIX_FM c, FIX_FM d) 306 | { 307 | FIX_FM t1, t2; 308 | 309 | if(a > b) t1 = a; 310 | else t1 = b; 311 | 312 | if(c > d) t2 = c; 313 | else t2 = d; 314 | 315 | if(t1 > t2) return t1; 316 | else return t2; 317 | } 318 | 319 | 320 | void max_pooling(FIX_FM buf_in[16][22][42], FIX_FM buf_out[16][10][20]) 321 | { 322 | #pragma HLS ARRAY_PARTITION variable=buf_in cyclic dim=1 factor=16 323 | #pragma HLS ARRAY_PARTITION variable=buf_out cyclic dim=1 factor=16 324 | 325 | for(int i = 0; i < 10; i++) { 326 | for(int j = 0; j < 20; j++) { 327 | #pragma HLS pipeline 328 | for(int ch = 0; ch < 16; ch++) { 329 | #pragma HLS unroll 330 | buf_out[ch][i][j] = max(buf_in[ch][i*2+1][j*2+1], buf_in[ch][i*2+1][j*2+2], 331 | buf_in[ch][i*2+2][j*2+1], buf_in[ch][i*2+2][j*2+2]); 332 | } 333 | } 334 | } 335 | } 336 | 337 | 338 | void clear_buf( FIX_FM buf[16][22][42]) 339 | { 340 | 341 | for(int j = 0; j < 22; j++) { 342 | for(int k = 0; k < 42; k++) { 343 | #pragma HLS pipeline 344 | for(int i = 0; i < 16; i++) { 345 | buf[i][j][k] = 0; 346 | } 347 | } 348 | } 349 | } 350 | 351 | 352 | void clear_padding( FIX_FM buf[16][22][42]) 353 | { 354 | for(int i = 0; i < 16; i++) { 355 | for(int j = 0; j < 22; j++) { 356 | buf[i][j][0] = 0; 357 | buf[i][j][41] = 0; 358 | } 359 | for(int k = 0; k < 42; k++) { 360 | buf[i][0][k] = 0; 361 | buf[i][21][k] = 0; 362 | } 363 | } 364 | } 365 | 366 | 367 | void Relu( FIX_FM buf[16][22][42] ) 368 | { 369 | for(int j = 1; j <= 20; j++) { 370 | for(int k = 1; k <= 40; k++) { 371 | #pragma HLS pipeline 372 | for(int i = 0; i < 16; i++) { 373 | #pragma HLS unroll 374 | if( buf[i][j][k] < 0 ) { 375 | buf[i][j][k] = 0; 376 | } 377 | 378 | } 379 | } 380 | } 381 | } 382 | 383 | 384 | 385 | // ch col row are offsets corresponding to feature map 386 | void print_buf( float buf[16][22][42], int ch, int col, int row) 387 | { 388 | for(int i = 0; i < 16; i++) { 389 | for(int j = 1; j <= 20; j++) { 390 | for(int k = 1; k <= 40; k++) { 391 | printf("buf output[%d][%d][%d] = %f\n", ch*16+i, col*20+j-1, row*40+k-1, buf[i][j][k]); 392 | } 393 | } 394 | } 395 | } 396 | 397 | 398 | void summernet(uint8 image_in_raw_pad[3][162][322], 399 | 400 | FIX_16_1 conv_weight_1x1_all[405][16][16], 401 | FIX_16_1 conv_weight_3x3_all[22][16][3][3], 402 | FIX_16_1 bias_all[67][16], 403 | 404 | FIX_FM DDR_pool3_out_PL[48][82][162], 405 | FIX_FM DDR_pool6_out_PL[96][42][82], 406 | 407 | //FIX_FM DDR_pool_out_PL[96][82][162], 408 | 409 | FIX_FM DDR_buf[36][16][22][42], 410 | 411 | float predict_box[5] 412 | ) 413 | { 414 | 415 | #pragma HLS INTERFACE m_axi depth=3*162*322 port=image_in_raw_pad offset=slave bundle=IMG 416 | #pragma HLS INTERFACE m_axi depth=405*16*16 port=conv_weight_1x1_all offset=slave bundle=INPUT 417 | #pragma HLS INTERFACE m_axi depth=22*16*3*3 port=conv_weight_3x3_all offset=slave bundle=INPUT 418 | #pragma HLS INTERFACE m_axi depth=67*16 port=bias_all offset=slave bundle=INPUT 419 | 420 | #pragma HLS INTERFACE m_axi depth=48*82*162 port=DDR_pool3_out_PL offset=slave bundle=INPUT 421 | #pragma HLS INTERFACE m_axi depth=96*42*82 port=DDR_pool6_out_PL offset=slave bundle=INPUT 422 | 423 | //#pragma HLS INTERFACE m_axi depth=96*82*162 port=DDR_pool_out_PL offset=slave bundle=INPUT 424 | 425 | #pragma HLS INTERFACE m_axi depth=36*16*22*42 port=DDR_buf offset=slave bundle=INPUT 426 | 427 | #pragma HLS INTERFACE m_axi depth=5 port=predict_box offset=slave bundle=OUTPUT 428 | 429 | #pragma HLS INTERFACE s_axilite register port=return 430 | 431 | 432 | 433 | #pragma HLS ALLOCATION instances=CONV_1x1 limit=1 function 434 | #pragma HLS ALLOCATION instances=CONV_3x3_group limit=1 function 435 | #pragma HLS ALLOCATION instances=max_pooling limit=1 function 436 | #pragma HLS ALLOCATION instances=load_image_chunk_norm limit=1 function 437 | #pragma HLS ALLOCATION instances=my_exp_fix limit=1 function 438 | #pragma HLS ALLOCATION instances=set_bias limit=1 function 439 | #pragma HLS ALLOCATION instances=Relu limit=1 function 440 | #pragma HLS ALLOCATION instances=load_weight_3D_from_axi limit=1 function 441 | #pragma HLS ALLOCATION instances=load_weight_2D_from_axi limit=1 function 442 | 443 | 444 | #pragma HLS ARRAY_PARTITION variable=weight_buf_3x3 dim=1 complete 445 | #pragma HLS ARRAY_PARTITION variable=weight_buf_1x1 dim=1 complete 446 | 447 | /////////////////////////////// CONV_1 to POOL_3 //////////////////////////// 448 | 449 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[0]); 450 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[0]); 451 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[1]); 452 | load_weight_2D_from_axi(weight_buf_1x1[2], conv_weight_1x1_all[2]); 453 | 454 | for(int row = 0; row < 8; row++) { 455 | for(int col = 0; col < 8; col++) { 456 | #pragma HLS unroll 457 | 458 | ///// CONV_1 (3x3) <--- IMG ch:0 col:{{_col}} row:{{_row}} 459 | load_image_chunk_norm(FM_buf1, image_in_raw_pad, col, row); 460 | load_bias_from_axi(bias_buf, bias_all[0]); 461 | set_bias(FM_buf3, bias_buf); 462 | CONV_3x3_group(FM_buf1, FM_buf3, weight_buf_3x3[0]); 463 | Relu(FM_buf3); 464 | 465 | 466 | 467 | 468 | for(int ch_conv2 = 0; ch_conv2 < 3; ch_conv2++) { 469 | #pragma HLS unroll 470 | 471 | 472 | 473 | 474 | ///// CONV_2 (1x1) <--- CONV_1 ch:{{_ch_conv2}} col:{{_col}} row:{{_row}} 475 | 476 | load_bias_from_axi(bias_buf, bias_all[ch_conv2 + 1]); 477 | set_bias(FM_buf15, bias_buf); 478 | CONV_1x1(FM_buf3, FM_buf15, weight_buf_1x1[ch_conv2]); 479 | Relu(FM_buf15); 480 | 481 | ///// POOL_3 <--- CONV_2 ch:{{_ch_conv2}} col:{{_col}} row:{{_row}} 482 | max_pooling(FM_buf15, FM_buf_pool); 483 | copy_to_DDR_pool3( DDR_pool3_out_PL, FM_buf_pool, ch_conv2, col, row); 484 | 485 | 486 | 487 | } 488 | } 489 | } 490 | 491 | 492 | 493 | /////////////////////////////// CONV_4 to POOL_6 //////////////////////////// 494 | 495 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[1]); 496 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[2]); 497 | load_weight_3D_from_axi(weight_buf_3x3[2], conv_weight_3x3_all[3]); 498 | 499 | for(int row = 0; row < 4; row++) { 500 | for(int col = 0; col < 4; col++) { 501 | #pragma HLS unroll 502 | 503 | ///// CONV_4 <--- POOL_3 ch:0 col:{{_col}} row:{{_row}} 504 | 505 | // load bias 506 | load_bias_from_axi(bias_buf, bias_all[4]); 507 | 508 | // load from DDR_pool_3_out_PL 509 | load_pool3_from_axi(FM_buf1, DDR_pool3_out_PL, 0, col, row); 510 | set_bias(FM_buf3, bias_buf); 511 | CONV_3x3_group(FM_buf1, FM_buf3, weight_buf_3x3[0]); 512 | Relu(FM_buf3); 513 | 514 | 515 | 516 | ///// CONV_4 <--- POOL_3 ch:1 col:{{_col}} row:{{_row}} 517 | 518 | // load bias 519 | load_bias_from_axi(bias_buf, bias_all[4+1]); 520 | 521 | // load from DDR_pool_3_out_PL 522 | load_pool3_from_axi(FM_buf2, DDR_pool3_out_PL, 1, col, row); 523 | set_bias(FM_buf4, bias_buf); 524 | CONV_3x3_group(FM_buf2, FM_buf4, weight_buf_3x3[1]); 525 | Relu(FM_buf4); 526 | 527 | 528 | 529 | ///// CONV_4 <--- POOL_3 ch:2 col:{{_col}} row:{{_row}} 530 | 531 | // load bias 532 | load_bias_from_axi(bias_buf, bias_all[4+2]); 533 | 534 | // load from DDR_pool_3_out_PL 535 | load_pool3_from_axi(FM_buf1, DDR_pool3_out_PL, 2, col, row); 536 | set_bias(FM_buf5, bias_buf); 537 | CONV_3x3_group(FM_buf1, FM_buf5, weight_buf_3x3[2]); 538 | Relu(FM_buf5); 539 | 540 | 541 | 542 | 543 | for(int ch_conv5 = 0; ch_conv5 < 6; ch_conv5++) { 544 | #pragma HLS unroll 545 | 546 | int weight_1x1 = 3 + ch_conv5*3; 547 | 548 | int bias = 4; 549 | 550 | ///// CONV_5 <--- CONV_4 ch:{{_ch_conv5}} col:{{_col}} row:{{_row}} 551 | // load bias 552 | load_bias_from_axi(bias_buf, bias_all[bias+3+ch_conv5]); 553 | set_bias(FM_buf15, bias_buf); 554 | 555 | // load weight 556 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1]); 557 | CONV_1x1(FM_buf3, FM_buf15, weight_buf_1x1[0]); 558 | 559 | // load weight 560 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+1]); 561 | CONV_1x1(FM_buf4, FM_buf15, weight_buf_1x1[1]); 562 | 563 | // load weight 564 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+2]); 565 | CONV_1x1(FM_buf5, FM_buf15, weight_buf_1x1[0]); 566 | 567 | Relu(FM_buf15); 568 | 569 | ///// POOL_6 <--- CONV_5 ch:{{_ch_conv5}} col:{{_col}} row:{{_row}} 570 | max_pooling(FM_buf15, FM_buf_pool); 571 | 572 | copy_to_DDR_pool6( DDR_pool6_out_PL, FM_buf_pool, ch_conv5, col, row); 573 | 574 | 575 | 576 | 577 | 578 | } 579 | } 580 | } 581 | 582 | 583 | 584 | /////////////////////////////// CONV_7 to POOL_9 //////////////////////////// 585 | 586 | 587 | for(int col = 0; col < 2; col++) { 588 | for(int row = 0; row < 2; row++) { 589 | ///// CONV_7 <--- POOL_6 ch:{{_ch_conv7}} col:{{_col}} row:{{_row}} 590 | for(int ch_conv7 = 0; ch_conv7 < 6; ch_conv7++) { 591 | #pragma HLS unroll 592 | 593 | int weight_3x3 = 4 + ch_conv7; 594 | int bias = 13 + ch_conv7; 595 | 596 | load_bias_from_axi(bias_buf, bias_all[bias]); 597 | 598 | //load_bias_from_axi(bias_buf[0], bias_all[bias]); 599 | 600 | 601 | // if( ch_conv7 % 2 == 0) { 602 | // load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 603 | // load_pool6_from_axi(FM_buf3, DDR_pool6_out_PL, ch_conv7, col, row); 604 | // set_bias(FM_buf2, bias_buf); 605 | // CONV_3x3_group(FM_buf3, FM_buf2, weight_buf_3x3[0]); 606 | // Relu(FM_buf2); 607 | // copy_to_DDR_pool6( DDR_pool6_out_PL, FM_buf2, ch_conv7, col, row); 608 | // 609 | // } 610 | // else { 611 | // load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 612 | // load_pool6_from_axi(FM_buf1, DDR_pool6_out_PL, ch_conv7, col, row); 613 | // set_bias(FM_buf4, bias_buf); 614 | // CONV_3x3_group(FM_buf1, FM_buf4, weight_buf_3x3[1]); 615 | // Relu(FM_buf4); 616 | // copy_to_DDR_pool6( DDR_pool6_out_PL, FM_buf4, ch_conv7, col, row); 617 | // 618 | // } 619 | 620 | 621 | 622 | switch (ch_conv7) { 623 | case 0: 624 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 625 | load_pool6_from_axi(FM_buf1, DDR_pool6_out_PL, ch_conv7, col, row); 626 | set_bias(FM_buf3, bias_buf); 627 | CONV_3x3_group(FM_buf1, FM_buf3, weight_buf_3x3[0]); 628 | Relu(FM_buf3); 629 | 630 | break; 631 | case 1: 632 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 633 | load_pool6_from_axi(FM_buf2, DDR_pool6_out_PL, ch_conv7, col, row); 634 | set_bias(FM_buf4, bias_buf); 635 | CONV_3x3_group(FM_buf2, FM_buf4, weight_buf_3x3[1]); 636 | Relu(FM_buf4); 637 | 638 | break; 639 | case 2: 640 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 641 | load_pool6_from_axi(FM_buf1, DDR_pool6_out_PL, ch_conv7, col, row); 642 | set_bias(FM_buf5, bias_buf); 643 | CONV_3x3_group(FM_buf1, FM_buf5, weight_buf_3x3[0]); 644 | Relu(FM_buf5); 645 | 646 | break; 647 | case 3: 648 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 649 | load_pool6_from_axi(FM_buf2, DDR_pool6_out_PL, ch_conv7, col, row); 650 | set_bias(FM_buf6, bias_buf); 651 | CONV_3x3_group(FM_buf2, FM_buf6, weight_buf_3x3[1]); 652 | Relu(FM_buf6); 653 | 654 | break; 655 | case 4: 656 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 657 | load_pool6_from_axi(FM_buf1, DDR_pool6_out_PL, ch_conv7, col, row); 658 | set_bias(FM_buf7, bias_buf); 659 | CONV_3x3_group(FM_buf1, FM_buf7, weight_buf_3x3[0]); 660 | Relu(FM_buf7); 661 | 662 | break; 663 | case 5: 664 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 665 | load_pool6_from_axi(FM_buf2, DDR_pool6_out_PL, ch_conv7, col, row); 666 | set_bias(FM_buf8, bias_buf); 667 | CONV_3x3_group(FM_buf2, FM_buf8, weight_buf_3x3[1]); 668 | Relu(FM_buf8); 669 | 670 | break; 671 | } 672 | 673 | } 674 | 675 | for(int ch_conv8 = 0; ch_conv8 < 12; ch_conv8++ ) { 676 | #pragma HLS unroll 677 | 678 | 679 | int weight_1x1 = 21 + ch_conv8 * 6; 680 | int bias = 19 + ch_conv8; 681 | 682 | ///// CONV_8 <--- CONV_7 ch:{{_ch_conv8}} col:{{_col}} row:{{_row}} 683 | load_bias_from_axi(bias_buf, bias_all[bias]); 684 | set_bias(FM_buf15, bias_buf); 685 | 686 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1]); 687 | CONV_1x1(FM_buf3, FM_buf15, weight_buf_1x1[0]); 688 | 689 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+1]); 690 | CONV_1x1(FM_buf4, FM_buf15, weight_buf_1x1[1]); 691 | 692 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+2]); 693 | CONV_1x1(FM_buf5, FM_buf15, weight_buf_1x1[0]); 694 | 695 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+3]); 696 | CONV_1x1(FM_buf6, FM_buf15, weight_buf_1x1[1]); 697 | 698 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+4]); 699 | CONV_1x1(FM_buf7, FM_buf15, weight_buf_1x1[0]); 700 | 701 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+5]); 702 | CONV_1x1(FM_buf8, FM_buf15, weight_buf_1x1[1]); 703 | 704 | Relu(FM_buf15); 705 | 706 | ///// POOL_9 <--- CONV_8 ch:{{_ch_conv8}} col:{{_col}} row:{{_row}} 707 | max_pooling(FM_buf15, FM_buf_pool); 708 | 709 | copy_to_DDR_pool9( DDR_buf[ch_conv8], FM_buf_pool, col, row); 710 | 711 | 712 | 713 | 714 | } 715 | } 716 | } 717 | 718 | 719 | 720 | /////////////////////////////// CONV_10 to CONV_12 ////////////////////////// 721 | 722 | clear_buf(FM_buf2); 723 | 724 | for(int ch_conv10 = 0; ch_conv10 < 12; ch_conv10++ ) { 725 | #pragma HLS unroll 726 | 727 | int weight_3x3 = 10 + ch_conv10; 728 | int bias = 31 + ch_conv10; 729 | 730 | ///// CONV_10 <--- POOL_9 ch:{{_ch_conv10}} col:{{_col}} row:{{_row}} 731 | load_bias_from_axi(bias_buf, bias_all[bias]); 732 | buffer_copy_from_axi(FM_buf1, DDR_buf[ch_conv10]); 733 | 734 | 735 | switch (ch_conv10) { 736 | case 0: 737 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 738 | set_bias(FM_buf3, bias_buf); 739 | CONV_3x3_group(FM_buf1, FM_buf3, weight_buf_3x3[0]); 740 | Relu(FM_buf3); 741 | 742 | break; 743 | 744 | case 1: 745 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 746 | set_bias(FM_buf4, bias_buf); 747 | CONV_3x3_group(FM_buf1, FM_buf4, weight_buf_3x3[1]); 748 | Relu(FM_buf4); 749 | 750 | break; 751 | 752 | case 2: 753 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 754 | set_bias(FM_buf5, bias_buf); 755 | CONV_3x3_group(FM_buf1, FM_buf5, weight_buf_3x3[0]); 756 | Relu(FM_buf5); 757 | 758 | break; 759 | 760 | case 3: 761 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 762 | set_bias(FM_buf6, bias_buf); 763 | CONV_3x3_group(FM_buf1, FM_buf6, weight_buf_3x3[1]); 764 | Relu(FM_buf6); 765 | 766 | break; 767 | 768 | case 4: 769 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 770 | set_bias(FM_buf7, bias_buf); 771 | CONV_3x3_group(FM_buf1, FM_buf7, weight_buf_3x3[0]); 772 | Relu(FM_buf7); 773 | 774 | break; 775 | 776 | case 5: 777 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 778 | set_bias(FM_buf8, bias_buf); 779 | CONV_3x3_group(FM_buf1, FM_buf8, weight_buf_3x3[1]); 780 | Relu(FM_buf8); 781 | 782 | break; 783 | 784 | case 6: 785 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 786 | set_bias(FM_buf9, bias_buf); 787 | CONV_3x3_group(FM_buf1, FM_buf9, weight_buf_3x3[0]); 788 | Relu(FM_buf9); 789 | 790 | break; 791 | 792 | case 7: 793 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 794 | set_bias(FM_buf10, bias_buf); 795 | CONV_3x3_group(FM_buf1, FM_buf10, weight_buf_3x3[1]); 796 | Relu(FM_buf10); 797 | 798 | break; 799 | 800 | case 8: 801 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 802 | set_bias(FM_buf11, bias_buf); 803 | CONV_3x3_group(FM_buf1, FM_buf11, weight_buf_3x3[0]); 804 | Relu(FM_buf11); 805 | 806 | break; 807 | 808 | case 9: 809 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 810 | set_bias(FM_buf12, bias_buf); 811 | CONV_3x3_group(FM_buf1, FM_buf12, weight_buf_3x3[1]); 812 | Relu(FM_buf12); 813 | 814 | break; 815 | 816 | case 10: 817 | load_weight_3D_from_axi(weight_buf_3x3[0], conv_weight_3x3_all[weight_3x3]); 818 | set_bias(FM_buf13, bias_buf); 819 | CONV_3x3_group(FM_buf1, FM_buf13, weight_buf_3x3[0]); 820 | Relu(FM_buf13); 821 | 822 | break; 823 | 824 | case 11: 825 | load_weight_3D_from_axi(weight_buf_3x3[1], conv_weight_3x3_all[weight_3x3]); 826 | set_bias(FM_buf14, bias_buf); 827 | CONV_3x3_group(FM_buf1, FM_buf14, weight_buf_3x3[1]); 828 | Relu(FM_buf14); 829 | 830 | break; 831 | 832 | } 833 | } 834 | 835 | for(int ch_conv11 = 0; ch_conv11 < 24; ch_conv11++ ) { 836 | #pragma HLS unroll 837 | 838 | int weight_1x1 = 93 + ch_conv11*12; 839 | int weight_1x1_conv12 = 381 + ch_conv11; 840 | int bias = 43 + ch_conv11; 841 | 842 | 843 | ///// CONV_11 <--- CONV_10 ch:{{_ch_conv11}} col:{{_col}} row:{{_row}} 844 | load_bias_from_axi(bias_buf, bias_all[bias]); 845 | set_bias(FM_buf15, bias_buf); 846 | 847 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1]); 848 | CONV_1x1(FM_buf3, FM_buf15, weight_buf_1x1[0]); 849 | 850 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+1]); 851 | CONV_1x1(FM_buf4, FM_buf15, weight_buf_1x1[1]); 852 | 853 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+2]); 854 | CONV_1x1(FM_buf5, FM_buf15, weight_buf_1x1[0]); 855 | 856 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+3]); 857 | CONV_1x1(FM_buf6, FM_buf15, weight_buf_1x1[1]); 858 | 859 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+4]); 860 | CONV_1x1(FM_buf7, FM_buf15, weight_buf_1x1[0]); 861 | 862 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+5]); 863 | CONV_1x1(FM_buf8, FM_buf15, weight_buf_1x1[1]); 864 | 865 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+6]); 866 | CONV_1x1(FM_buf9, FM_buf15, weight_buf_1x1[0]); 867 | 868 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+7]); 869 | CONV_1x1(FM_buf10, FM_buf15, weight_buf_1x1[1]); 870 | 871 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+8]); 872 | CONV_1x1(FM_buf11, FM_buf15, weight_buf_1x1[0]); 873 | 874 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+9]); 875 | CONV_1x1(FM_buf12, FM_buf15, weight_buf_1x1[1]); 876 | 877 | load_weight_2D_from_axi(weight_buf_1x1[0], conv_weight_1x1_all[weight_1x1+10]); 878 | CONV_1x1(FM_buf13, FM_buf15, weight_buf_1x1[0]); 879 | 880 | load_weight_2D_from_axi(weight_buf_1x1[1], conv_weight_1x1_all[weight_1x1+11]); 881 | CONV_1x1(FM_buf14, FM_buf15, weight_buf_1x1[1]); 882 | 883 | Relu(FM_buf15); 884 | 885 | 886 | 887 | 888 | /////////////////// CONV_12 + ch{{_ch_conv11}} of CONV_11 889 | load_weight_2D_from_axi(weight_buf_1x1[2], conv_weight_1x1_all[weight_1x1_conv12]); 890 | CONV_1x1(FM_buf15, FM_buf2, weight_buf_1x1[2]); 891 | 892 | } 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | compute_bounding_box(predict_box); 903 | 904 | return; 905 | 906 | 907 | } 908 | -------------------------------------------------------------------------------- /Host_summernet/overlay/summernet.tcl: -------------------------------------------------------------------------------- 1 | 2 | ################################################################ 3 | # This is a generated script based on design: design_1 4 | # 5 | # Though there are limitations about the generated script, 6 | # the main purpose of this utility is to make learning 7 | # IP Integrator Tcl commands easier. 8 | ################################################################ 9 | 10 | namespace eval _tcl { 11 | proc get_script_folder {} { 12 | set script_path [file normalize [info script]] 13 | set script_folder [file dirname $script_path] 14 | return $script_folder 15 | } 16 | } 17 | variable script_folder 18 | set script_folder [_tcl::get_script_folder] 19 | 20 | ################################################################ 21 | # Check if script is running in correct Vivado version. 22 | ################################################################ 23 | set scripts_vivado_version 2017.3 24 | set current_vivado_version [version -short] 25 | 26 | if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { 27 | puts "" 28 | catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} 29 | 30 | return 1 31 | } 32 | 33 | ################################################################ 34 | # START 35 | ################################################################ 36 | 37 | # To test this script, run the following commands from Vivado Tcl console: 38 | # source design_1_script.tcl 39 | 40 | # If there is no project opened, this script will create a 41 | # project, but make sure you do not have an existing project 42 | # <./myproj/project_1.xpr> in the current working folder. 43 | 44 | set list_projs [get_projects -quiet] 45 | if { $list_projs eq "" } { 46 | create_project project_1 myproj -part xc7z020clg400-1 47 | set_property BOARD_PART www.digilentinc.com:pynq-z1:part0:1.0 [current_project] 48 | } 49 | 50 | 51 | # CHANGE DESIGN NAME HERE 52 | variable design_name 53 | set design_name design_1 54 | 55 | # If you do not already have an existing IP Integrator design open, 56 | # you can create a design using the following command: 57 | # create_bd_design $design_name 58 | 59 | # Creating design if needed 60 | set errMsg "" 61 | set nRet 0 62 | 63 | set cur_design [current_bd_design -quiet] 64 | set list_cells [get_bd_cells -quiet] 65 | 66 | if { ${design_name} eq "" } { 67 | # USE CASES: 68 | # 1) Design_name not set 69 | 70 | set errMsg "Please set the variable to a non-empty value." 71 | set nRet 1 72 | 73 | } elseif { ${cur_design} ne "" && ${list_cells} eq "" } { 74 | # USE CASES: 75 | # 2): Current design opened AND is empty AND names same. 76 | # 3): Current design opened AND is empty AND names diff; design_name NOT in project. 77 | # 4): Current design opened AND is empty AND names diff; design_name exists in project. 78 | 79 | if { $cur_design ne $design_name } { 80 | common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." 81 | set design_name [get_property NAME $cur_design] 82 | } 83 | common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." 84 | 85 | } elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { 86 | # USE CASES: 87 | # 5) Current design opened AND has components AND same names. 88 | 89 | set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." 90 | set nRet 1 91 | } elseif { [get_files -quiet ${design_name}.bd] ne "" } { 92 | # USE CASES: 93 | # 6) Current opened design, has components, but diff names, design_name exists in project. 94 | # 7) No opened design, design_name exists in project. 95 | 96 | set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." 97 | set nRet 2 98 | 99 | } else { 100 | # USE CASES: 101 | # 8) No opened design, design_name not in project. 102 | # 9) Current opened design, has components, but diff names, design_name not in project. 103 | 104 | common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." 105 | 106 | create_bd_design $design_name 107 | 108 | common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." 109 | current_bd_design $design_name 110 | 111 | } 112 | 113 | common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." 114 | 115 | if { $nRet != 0 } { 116 | catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} 117 | return $nRet 118 | } 119 | 120 | set bCheckIPsPassed 1 121 | ################################################################## 122 | # CHECK IPs 123 | ################################################################## 124 | set bCheckIPs 1 125 | if { $bCheckIPs == 1 } { 126 | set list_check_ips "\ 127 | xilinx.com:ip:smartconnect:1.0\ 128 | xilinx.com:hls:mobilenet:1.0\ 129 | xilinx.com:ip:processing_system7:5.5\ 130 | xilinx.com:ip:proc_sys_reset:5.0\ 131 | " 132 | 133 | set list_ips_missing "" 134 | common::send_msg_id "BD_TCL-006" "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." 135 | 136 | foreach ip_vlnv $list_check_ips { 137 | set ip_obj [get_ipdefs -all $ip_vlnv] 138 | if { $ip_obj eq "" } { 139 | lappend list_ips_missing $ip_vlnv 140 | } 141 | } 142 | 143 | if { $list_ips_missing ne "" } { 144 | catch {common::send_msg_id "BD_TCL-115" "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } 145 | set bCheckIPsPassed 0 146 | } 147 | 148 | } 149 | 150 | if { $bCheckIPsPassed != 1 } { 151 | common::send_msg_id "BD_TCL-1003" "WARNING" "Will not continue with creation of design due to the error(s) above." 152 | return 3 153 | } 154 | 155 | ################################################################## 156 | # DESIGN PROCs 157 | ################################################################## 158 | 159 | 160 | 161 | # Procedure to create entire design; Provide argument to make 162 | # procedure reusable. If parentCell is "", will use root. 163 | proc create_root_design { parentCell } { 164 | 165 | variable script_folder 166 | variable design_name 167 | 168 | if { $parentCell eq "" } { 169 | set parentCell [get_bd_cells /] 170 | } 171 | 172 | # Get object for parentCell 173 | set parentObj [get_bd_cells $parentCell] 174 | if { $parentObj == "" } { 175 | catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} 176 | return 177 | } 178 | 179 | # Make sure parentObj is hier blk 180 | set parentType [get_property TYPE $parentObj] 181 | if { $parentType ne "hier" } { 182 | catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} 183 | return 184 | } 185 | 186 | # Save current instance; Restore later 187 | set oldCurInst [current_bd_instance .] 188 | 189 | # Set parent object as current 190 | current_bd_instance $parentObj 191 | 192 | 193 | # Create interface ports 194 | set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] 195 | set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] 196 | 197 | # Create ports 198 | 199 | # Create instance: axi_smc, and set properties 200 | set axi_smc [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 axi_smc ] 201 | set_property -dict [ list \ 202 | CONFIG.NUM_SI {1} \ 203 | ] $axi_smc 204 | 205 | # Create instance: axi_smc_1, and set properties 206 | set axi_smc_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 axi_smc_1 ] 207 | set_property -dict [ list \ 208 | CONFIG.NUM_SI {1} \ 209 | ] $axi_smc_1 210 | 211 | # Create instance: axi_smc_2, and set properties 212 | set axi_smc_2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 axi_smc_2 ] 213 | set_property -dict [ list \ 214 | CONFIG.NUM_SI {1} \ 215 | ] $axi_smc_2 216 | 217 | # Create instance: mobilenet_0, and set properties 218 | set mobilenet_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:mobilenet:1.0 mobilenet_0 ] 219 | 220 | # Create instance: processing_system7_0, and set properties 221 | set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] 222 | set_property -dict [ list \ 223 | CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {650.000000} \ 224 | CONFIG.PCW_ACT_CAN0_PERIPHERAL_FREQMHZ {23.8095} \ 225 | CONFIG.PCW_ACT_CAN1_PERIPHERAL_FREQMHZ {23.8095} \ 226 | CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \ 227 | CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.096154} \ 228 | CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \ 229 | CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \ 230 | CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {142.857132} \ 231 | CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \ 232 | CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \ 233 | CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \ 234 | CONFIG.PCW_ACT_I2C_PERIPHERAL_FREQMHZ {50} \ 235 | CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \ 236 | CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ 237 | CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {50.000000} \ 238 | CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \ 239 | CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {10.000000} \ 240 | CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \ 241 | CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {108.333336} \ 242 | CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {108.333336} \ 243 | CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {108.333336} \ 244 | CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {108.333336} \ 245 | CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {108.333336} \ 246 | CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {108.333336} \ 247 | CONFIG.PCW_ACT_TTC_PERIPHERAL_FREQMHZ {50} \ 248 | CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ 249 | CONFIG.PCW_ACT_USB0_PERIPHERAL_FREQMHZ {60} \ 250 | CONFIG.PCW_ACT_USB1_PERIPHERAL_FREQMHZ {60} \ 251 | CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {108.333336} \ 252 | CONFIG.PCW_APU_CLK_RATIO_ENABLE {6:2:1} \ 253 | CONFIG.PCW_APU_PERIPHERAL_FREQMHZ {650} \ 254 | CONFIG.PCW_ARMPLL_CTRL_FBDIV {26} \ 255 | CONFIG.PCW_CAN0_BASEADDR {0xE0008000} \ 256 | CONFIG.PCW_CAN0_HIGHADDR {0xE0008FFF} \ 257 | CONFIG.PCW_CAN0_PERIPHERAL_CLKSRC {External} \ 258 | CONFIG.PCW_CAN0_PERIPHERAL_FREQMHZ {-1} \ 259 | CONFIG.PCW_CAN1_BASEADDR {0xE0009000} \ 260 | CONFIG.PCW_CAN1_HIGHADDR {0xE0009FFF} \ 261 | CONFIG.PCW_CAN1_PERIPHERAL_CLKSRC {External} \ 262 | CONFIG.PCW_CAN1_PERIPHERAL_FREQMHZ {-1} \ 263 | CONFIG.PCW_CAN_PERIPHERAL_CLKSRC {IO PLL} \ 264 | CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \ 265 | CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \ 266 | CONFIG.PCW_CAN_PERIPHERAL_FREQMHZ {100} \ 267 | CONFIG.PCW_CAN_PERIPHERAL_VALID {0} \ 268 | CONFIG.PCW_CLK0_FREQ {142857132} \ 269 | CONFIG.PCW_CLK1_FREQ {10000000} \ 270 | CONFIG.PCW_CLK2_FREQ {10000000} \ 271 | CONFIG.PCW_CLK3_FREQ {10000000} \ 272 | CONFIG.PCW_CORE0_FIQ_INTR {0} \ 273 | CONFIG.PCW_CORE0_IRQ_INTR {0} \ 274 | CONFIG.PCW_CORE1_FIQ_INTR {0} \ 275 | CONFIG.PCW_CORE1_IRQ_INTR {0} \ 276 | CONFIG.PCW_CPU_CPU_6X4X_MAX_RANGE {667} \ 277 | CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1300.000} \ 278 | CONFIG.PCW_CPU_PERIPHERAL_CLKSRC {ARM PLL} \ 279 | CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \ 280 | CONFIG.PCW_CRYSTAL_PERIPHERAL_FREQMHZ {50} \ 281 | CONFIG.PCW_DCI_PERIPHERAL_CLKSRC {DDR PLL} \ 282 | CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {52} \ 283 | CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {2} \ 284 | CONFIG.PCW_DCI_PERIPHERAL_FREQMHZ {10.159} \ 285 | CONFIG.PCW_DDRPLL_CTRL_FBDIV {21} \ 286 | CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1050.000} \ 287 | CONFIG.PCW_DDR_HPRLPR_QUEUE_PARTITION {HPR(0)/LPR(32)} \ 288 | CONFIG.PCW_DDR_HPR_TO_CRITICAL_PRIORITY_LEVEL {15} \ 289 | CONFIG.PCW_DDR_LPR_TO_CRITICAL_PRIORITY_LEVEL {2} \ 290 | CONFIG.PCW_DDR_PERIPHERAL_CLKSRC {DDR PLL} \ 291 | CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \ 292 | CONFIG.PCW_DDR_PORT0_HPR_ENABLE {0} \ 293 | CONFIG.PCW_DDR_PORT1_HPR_ENABLE {0} \ 294 | CONFIG.PCW_DDR_PORT2_HPR_ENABLE {0} \ 295 | CONFIG.PCW_DDR_PORT3_HPR_ENABLE {0} \ 296 | CONFIG.PCW_DDR_RAM_BASEADDR {0x00100000} \ 297 | CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \ 298 | CONFIG.PCW_DDR_WRITE_TO_CRITICAL_PRIORITY_LEVEL {2} \ 299 | CONFIG.PCW_DM_WIDTH {4} \ 300 | CONFIG.PCW_DQS_WIDTH {4} \ 301 | CONFIG.PCW_DQ_WIDTH {32} \ 302 | CONFIG.PCW_ENET0_BASEADDR {0xE000B000} \ 303 | CONFIG.PCW_ENET0_ENET0_IO {MIO 16 .. 27} \ 304 | CONFIG.PCW_ENET0_GRP_MDIO_ENABLE {1} \ 305 | CONFIG.PCW_ENET0_GRP_MDIO_IO {MIO 52 .. 53} \ 306 | CONFIG.PCW_ENET0_HIGHADDR {0xE000BFFF} \ 307 | CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {IO PLL} \ 308 | CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {8} \ 309 | CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \ 310 | CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {1} \ 311 | CONFIG.PCW_ENET0_PERIPHERAL_FREQMHZ {1000 Mbps} \ 312 | CONFIG.PCW_ENET0_RESET_ENABLE {1} \ 313 | CONFIG.PCW_ENET0_RESET_IO {MIO 9} \ 314 | CONFIG.PCW_ENET1_BASEADDR {0xE000C000} \ 315 | CONFIG.PCW_ENET1_GRP_MDIO_ENABLE {0} \ 316 | CONFIG.PCW_ENET1_HIGHADDR {0xE000CFFF} \ 317 | CONFIG.PCW_ENET1_PERIPHERAL_CLKSRC {IO PLL} \ 318 | CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \ 319 | CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \ 320 | CONFIG.PCW_ENET1_PERIPHERAL_ENABLE {0} \ 321 | CONFIG.PCW_ENET1_PERIPHERAL_FREQMHZ {1000 Mbps} \ 322 | CONFIG.PCW_ENET1_RESET_ENABLE {0} \ 323 | CONFIG.PCW_ENET_RESET_ENABLE {1} \ 324 | CONFIG.PCW_ENET_RESET_POLARITY {Active Low} \ 325 | CONFIG.PCW_ENET_RESET_SELECT {Share reset pin} \ 326 | CONFIG.PCW_EN_4K_TIMER {0} \ 327 | CONFIG.PCW_EN_CAN0 {0} \ 328 | CONFIG.PCW_EN_CAN1 {0} \ 329 | CONFIG.PCW_EN_CLK0_PORT {1} \ 330 | CONFIG.PCW_EN_CLK1_PORT {0} \ 331 | CONFIG.PCW_EN_CLK2_PORT {0} \ 332 | CONFIG.PCW_EN_CLK3_PORT {0} \ 333 | CONFIG.PCW_EN_CLKTRIG0_PORT {0} \ 334 | CONFIG.PCW_EN_CLKTRIG1_PORT {0} \ 335 | CONFIG.PCW_EN_CLKTRIG2_PORT {0} \ 336 | CONFIG.PCW_EN_CLKTRIG3_PORT {0} \ 337 | CONFIG.PCW_EN_DDR {1} \ 338 | CONFIG.PCW_EN_EMIO_CAN0 {0} \ 339 | CONFIG.PCW_EN_EMIO_CAN1 {0} \ 340 | CONFIG.PCW_EN_EMIO_CD_SDIO0 {0} \ 341 | CONFIG.PCW_EN_EMIO_CD_SDIO1 {0} \ 342 | CONFIG.PCW_EN_EMIO_ENET0 {0} \ 343 | CONFIG.PCW_EN_EMIO_ENET1 {0} \ 344 | CONFIG.PCW_EN_EMIO_GPIO {0} \ 345 | CONFIG.PCW_EN_EMIO_I2C0 {0} \ 346 | CONFIG.PCW_EN_EMIO_I2C1 {0} \ 347 | CONFIG.PCW_EN_EMIO_MODEM_UART0 {0} \ 348 | CONFIG.PCW_EN_EMIO_MODEM_UART1 {0} \ 349 | CONFIG.PCW_EN_EMIO_PJTAG {0} \ 350 | CONFIG.PCW_EN_EMIO_SDIO0 {0} \ 351 | CONFIG.PCW_EN_EMIO_SDIO1 {0} \ 352 | CONFIG.PCW_EN_EMIO_SPI0 {0} \ 353 | CONFIG.PCW_EN_EMIO_SPI1 {0} \ 354 | CONFIG.PCW_EN_EMIO_SRAM_INT {0} \ 355 | CONFIG.PCW_EN_EMIO_TRACE {0} \ 356 | CONFIG.PCW_EN_EMIO_TTC0 {0} \ 357 | CONFIG.PCW_EN_EMIO_TTC1 {0} \ 358 | CONFIG.PCW_EN_EMIO_UART0 {0} \ 359 | CONFIG.PCW_EN_EMIO_UART1 {0} \ 360 | CONFIG.PCW_EN_EMIO_WDT {0} \ 361 | CONFIG.PCW_EN_EMIO_WP_SDIO0 {0} \ 362 | CONFIG.PCW_EN_EMIO_WP_SDIO1 {0} \ 363 | CONFIG.PCW_EN_ENET0 {1} \ 364 | CONFIG.PCW_EN_ENET1 {0} \ 365 | CONFIG.PCW_EN_GPIO {1} \ 366 | CONFIG.PCW_EN_I2C0 {0} \ 367 | CONFIG.PCW_EN_I2C1 {0} \ 368 | CONFIG.PCW_EN_MODEM_UART0 {0} \ 369 | CONFIG.PCW_EN_MODEM_UART1 {0} \ 370 | CONFIG.PCW_EN_PJTAG {0} \ 371 | CONFIG.PCW_EN_PTP_ENET0 {0} \ 372 | CONFIG.PCW_EN_PTP_ENET1 {0} \ 373 | CONFIG.PCW_EN_QSPI {1} \ 374 | CONFIG.PCW_EN_RST0_PORT {1} \ 375 | CONFIG.PCW_EN_RST1_PORT {0} \ 376 | CONFIG.PCW_EN_RST2_PORT {0} \ 377 | CONFIG.PCW_EN_RST3_PORT {0} \ 378 | CONFIG.PCW_EN_SDIO0 {1} \ 379 | CONFIG.PCW_EN_SDIO1 {0} \ 380 | CONFIG.PCW_EN_SMC {0} \ 381 | CONFIG.PCW_EN_SPI0 {0} \ 382 | CONFIG.PCW_EN_SPI1 {0} \ 383 | CONFIG.PCW_EN_TRACE {0} \ 384 | CONFIG.PCW_EN_TTC0 {0} \ 385 | CONFIG.PCW_EN_TTC1 {0} \ 386 | CONFIG.PCW_EN_UART0 {1} \ 387 | CONFIG.PCW_EN_UART1 {0} \ 388 | CONFIG.PCW_EN_USB0 {1} \ 389 | CONFIG.PCW_EN_USB1 {0} \ 390 | CONFIG.PCW_EN_WDT {0} \ 391 | CONFIG.PCW_FCLK0_PERIPHERAL_CLKSRC {IO PLL} \ 392 | CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {7} \ 393 | CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {1} \ 394 | CONFIG.PCW_FCLK1_PERIPHERAL_CLKSRC {IO PLL} \ 395 | CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \ 396 | CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \ 397 | CONFIG.PCW_FCLK2_PERIPHERAL_CLKSRC {IO PLL} \ 398 | CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \ 399 | CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \ 400 | CONFIG.PCW_FCLK3_PERIPHERAL_CLKSRC {IO PLL} \ 401 | CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \ 402 | CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \ 403 | CONFIG.PCW_FCLK_CLK0_BUF {TRUE} \ 404 | CONFIG.PCW_FCLK_CLK1_BUF {FALSE} \ 405 | CONFIG.PCW_FCLK_CLK2_BUF {FALSE} \ 406 | CONFIG.PCW_FCLK_CLK3_BUF {FALSE} \ 407 | CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {150} \ 408 | CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {50} \ 409 | CONFIG.PCW_FPGA2_PERIPHERAL_FREQMHZ {50} \ 410 | CONFIG.PCW_FPGA3_PERIPHERAL_FREQMHZ {50} \ 411 | CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \ 412 | CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \ 413 | CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \ 414 | CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \ 415 | CONFIG.PCW_GPIO_BASEADDR {0xE000A000} \ 416 | CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {0} \ 417 | CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {64} \ 418 | CONFIG.PCW_GPIO_HIGHADDR {0xE000AFFF} \ 419 | CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {1} \ 420 | CONFIG.PCW_GPIO_MIO_GPIO_IO {MIO} \ 421 | CONFIG.PCW_GPIO_PERIPHERAL_ENABLE {0} \ 422 | CONFIG.PCW_I2C0_BASEADDR {0xE0004000} \ 423 | CONFIG.PCW_I2C0_HIGHADDR {0xE0004FFF} \ 424 | CONFIG.PCW_I2C0_RESET_ENABLE {0} \ 425 | CONFIG.PCW_I2C1_BASEADDR {0xE0005000} \ 426 | CONFIG.PCW_I2C1_HIGHADDR {0xE0005FFF} \ 427 | CONFIG.PCW_I2C1_RESET_ENABLE {0} \ 428 | CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {25} \ 429 | CONFIG.PCW_I2C_RESET_ENABLE {1} \ 430 | CONFIG.PCW_I2C_RESET_POLARITY {Active Low} \ 431 | CONFIG.PCW_IMPORT_BOARD_PRESET {None} \ 432 | CONFIG.PCW_INCLUDE_ACP_TRANS_CHECK {0} \ 433 | CONFIG.PCW_INCLUDE_TRACE_BUFFER {0} \ 434 | CONFIG.PCW_IOPLL_CTRL_FBDIV {20} \ 435 | CONFIG.PCW_IO_IO_PLL_FREQMHZ {1000.000} \ 436 | CONFIG.PCW_IRQ_F2P_INTR {0} \ 437 | CONFIG.PCW_IRQ_F2P_MODE {DIRECT} \ 438 | CONFIG.PCW_MIO_0_DIRECTION {inout} \ 439 | CONFIG.PCW_MIO_0_IOTYPE {LVCMOS 3.3V} \ 440 | CONFIG.PCW_MIO_0_PULLUP {enabled} \ 441 | CONFIG.PCW_MIO_0_SLEW {slow} \ 442 | CONFIG.PCW_MIO_10_DIRECTION {inout} \ 443 | CONFIG.PCW_MIO_10_IOTYPE {LVCMOS 3.3V} \ 444 | CONFIG.PCW_MIO_10_PULLUP {enabled} \ 445 | CONFIG.PCW_MIO_10_SLEW {slow} \ 446 | CONFIG.PCW_MIO_11_DIRECTION {inout} \ 447 | CONFIG.PCW_MIO_11_IOTYPE {LVCMOS 3.3V} \ 448 | CONFIG.PCW_MIO_11_PULLUP {enabled} \ 449 | CONFIG.PCW_MIO_11_SLEW {slow} \ 450 | CONFIG.PCW_MIO_12_DIRECTION {inout} \ 451 | CONFIG.PCW_MIO_12_IOTYPE {LVCMOS 3.3V} \ 452 | CONFIG.PCW_MIO_12_PULLUP {enabled} \ 453 | CONFIG.PCW_MIO_12_SLEW {slow} \ 454 | CONFIG.PCW_MIO_13_DIRECTION {inout} \ 455 | CONFIG.PCW_MIO_13_IOTYPE {LVCMOS 3.3V} \ 456 | CONFIG.PCW_MIO_13_PULLUP {enabled} \ 457 | CONFIG.PCW_MIO_13_SLEW {slow} \ 458 | CONFIG.PCW_MIO_14_DIRECTION {in} \ 459 | CONFIG.PCW_MIO_14_IOTYPE {LVCMOS 3.3V} \ 460 | CONFIG.PCW_MIO_14_PULLUP {enabled} \ 461 | CONFIG.PCW_MIO_14_SLEW {slow} \ 462 | CONFIG.PCW_MIO_15_DIRECTION {out} \ 463 | CONFIG.PCW_MIO_15_IOTYPE {LVCMOS 3.3V} \ 464 | CONFIG.PCW_MIO_15_PULLUP {enabled} \ 465 | CONFIG.PCW_MIO_15_SLEW {slow} \ 466 | CONFIG.PCW_MIO_16_DIRECTION {out} \ 467 | CONFIG.PCW_MIO_16_IOTYPE {LVCMOS 1.8V} \ 468 | CONFIG.PCW_MIO_16_PULLUP {enabled} \ 469 | CONFIG.PCW_MIO_16_SLEW {slow} \ 470 | CONFIG.PCW_MIO_17_DIRECTION {out} \ 471 | CONFIG.PCW_MIO_17_IOTYPE {LVCMOS 1.8V} \ 472 | CONFIG.PCW_MIO_17_PULLUP {enabled} \ 473 | CONFIG.PCW_MIO_17_SLEW {slow} \ 474 | CONFIG.PCW_MIO_18_DIRECTION {out} \ 475 | CONFIG.PCW_MIO_18_IOTYPE {LVCMOS 1.8V} \ 476 | CONFIG.PCW_MIO_18_PULLUP {enabled} \ 477 | CONFIG.PCW_MIO_18_SLEW {slow} \ 478 | CONFIG.PCW_MIO_19_DIRECTION {out} \ 479 | CONFIG.PCW_MIO_19_IOTYPE {LVCMOS 1.8V} \ 480 | CONFIG.PCW_MIO_19_PULLUP {enabled} \ 481 | CONFIG.PCW_MIO_19_SLEW {slow} \ 482 | CONFIG.PCW_MIO_1_DIRECTION {out} \ 483 | CONFIG.PCW_MIO_1_IOTYPE {LVCMOS 3.3V} \ 484 | CONFIG.PCW_MIO_1_PULLUP {enabled} \ 485 | CONFIG.PCW_MIO_1_SLEW {slow} \ 486 | CONFIG.PCW_MIO_20_DIRECTION {out} \ 487 | CONFIG.PCW_MIO_20_IOTYPE {LVCMOS 1.8V} \ 488 | CONFIG.PCW_MIO_20_PULLUP {enabled} \ 489 | CONFIG.PCW_MIO_20_SLEW {slow} \ 490 | CONFIG.PCW_MIO_21_DIRECTION {out} \ 491 | CONFIG.PCW_MIO_21_IOTYPE {LVCMOS 1.8V} \ 492 | CONFIG.PCW_MIO_21_PULLUP {enabled} \ 493 | CONFIG.PCW_MIO_21_SLEW {slow} \ 494 | CONFIG.PCW_MIO_22_DIRECTION {in} \ 495 | CONFIG.PCW_MIO_22_IOTYPE {LVCMOS 1.8V} \ 496 | CONFIG.PCW_MIO_22_PULLUP {enabled} \ 497 | CONFIG.PCW_MIO_22_SLEW {slow} \ 498 | CONFIG.PCW_MIO_23_DIRECTION {in} \ 499 | CONFIG.PCW_MIO_23_IOTYPE {LVCMOS 1.8V} \ 500 | CONFIG.PCW_MIO_23_PULLUP {enabled} \ 501 | CONFIG.PCW_MIO_23_SLEW {slow} \ 502 | CONFIG.PCW_MIO_24_DIRECTION {in} \ 503 | CONFIG.PCW_MIO_24_IOTYPE {LVCMOS 1.8V} \ 504 | CONFIG.PCW_MIO_24_PULLUP {enabled} \ 505 | CONFIG.PCW_MIO_24_SLEW {slow} \ 506 | CONFIG.PCW_MIO_25_DIRECTION {in} \ 507 | CONFIG.PCW_MIO_25_IOTYPE {LVCMOS 1.8V} \ 508 | CONFIG.PCW_MIO_25_PULLUP {enabled} \ 509 | CONFIG.PCW_MIO_25_SLEW {slow} \ 510 | CONFIG.PCW_MIO_26_DIRECTION {in} \ 511 | CONFIG.PCW_MIO_26_IOTYPE {LVCMOS 1.8V} \ 512 | CONFIG.PCW_MIO_26_PULLUP {enabled} \ 513 | CONFIG.PCW_MIO_26_SLEW {slow} \ 514 | CONFIG.PCW_MIO_27_DIRECTION {in} \ 515 | CONFIG.PCW_MIO_27_IOTYPE {LVCMOS 1.8V} \ 516 | CONFIG.PCW_MIO_27_PULLUP {enabled} \ 517 | CONFIG.PCW_MIO_27_SLEW {slow} \ 518 | CONFIG.PCW_MIO_28_DIRECTION {inout} \ 519 | CONFIG.PCW_MIO_28_IOTYPE {LVCMOS 1.8V} \ 520 | CONFIG.PCW_MIO_28_PULLUP {enabled} \ 521 | CONFIG.PCW_MIO_28_SLEW {slow} \ 522 | CONFIG.PCW_MIO_29_DIRECTION {in} \ 523 | CONFIG.PCW_MIO_29_IOTYPE {LVCMOS 1.8V} \ 524 | CONFIG.PCW_MIO_29_PULLUP {enabled} \ 525 | CONFIG.PCW_MIO_29_SLEW {slow} \ 526 | CONFIG.PCW_MIO_2_DIRECTION {inout} \ 527 | CONFIG.PCW_MIO_2_IOTYPE {LVCMOS 3.3V} \ 528 | CONFIG.PCW_MIO_2_PULLUP {disabled} \ 529 | CONFIG.PCW_MIO_2_SLEW {slow} \ 530 | CONFIG.PCW_MIO_30_DIRECTION {out} \ 531 | CONFIG.PCW_MIO_30_IOTYPE {LVCMOS 1.8V} \ 532 | CONFIG.PCW_MIO_30_PULLUP {enabled} \ 533 | CONFIG.PCW_MIO_30_SLEW {slow} \ 534 | CONFIG.PCW_MIO_31_DIRECTION {in} \ 535 | CONFIG.PCW_MIO_31_IOTYPE {LVCMOS 1.8V} \ 536 | CONFIG.PCW_MIO_31_PULLUP {enabled} \ 537 | CONFIG.PCW_MIO_31_SLEW {slow} \ 538 | CONFIG.PCW_MIO_32_DIRECTION {inout} \ 539 | CONFIG.PCW_MIO_32_IOTYPE {LVCMOS 1.8V} \ 540 | CONFIG.PCW_MIO_32_PULLUP {enabled} \ 541 | CONFIG.PCW_MIO_32_SLEW {slow} \ 542 | CONFIG.PCW_MIO_33_DIRECTION {inout} \ 543 | CONFIG.PCW_MIO_33_IOTYPE {LVCMOS 1.8V} \ 544 | CONFIG.PCW_MIO_33_PULLUP {enabled} \ 545 | CONFIG.PCW_MIO_33_SLEW {slow} \ 546 | CONFIG.PCW_MIO_34_DIRECTION {inout} \ 547 | CONFIG.PCW_MIO_34_IOTYPE {LVCMOS 1.8V} \ 548 | CONFIG.PCW_MIO_34_PULLUP {enabled} \ 549 | CONFIG.PCW_MIO_34_SLEW {slow} \ 550 | CONFIG.PCW_MIO_35_DIRECTION {inout} \ 551 | CONFIG.PCW_MIO_35_IOTYPE {LVCMOS 1.8V} \ 552 | CONFIG.PCW_MIO_35_PULLUP {enabled} \ 553 | CONFIG.PCW_MIO_35_SLEW {slow} \ 554 | CONFIG.PCW_MIO_36_DIRECTION {in} \ 555 | CONFIG.PCW_MIO_36_IOTYPE {LVCMOS 1.8V} \ 556 | CONFIG.PCW_MIO_36_PULLUP {enabled} \ 557 | CONFIG.PCW_MIO_36_SLEW {slow} \ 558 | CONFIG.PCW_MIO_37_DIRECTION {inout} \ 559 | CONFIG.PCW_MIO_37_IOTYPE {LVCMOS 1.8V} \ 560 | CONFIG.PCW_MIO_37_PULLUP {enabled} \ 561 | CONFIG.PCW_MIO_37_SLEW {slow} \ 562 | CONFIG.PCW_MIO_38_DIRECTION {inout} \ 563 | CONFIG.PCW_MIO_38_IOTYPE {LVCMOS 1.8V} \ 564 | CONFIG.PCW_MIO_38_PULLUP {enabled} \ 565 | CONFIG.PCW_MIO_38_SLEW {slow} \ 566 | CONFIG.PCW_MIO_39_DIRECTION {inout} \ 567 | CONFIG.PCW_MIO_39_IOTYPE {LVCMOS 1.8V} \ 568 | CONFIG.PCW_MIO_39_PULLUP {enabled} \ 569 | CONFIG.PCW_MIO_39_SLEW {slow} \ 570 | CONFIG.PCW_MIO_3_DIRECTION {inout} \ 571 | CONFIG.PCW_MIO_3_IOTYPE {LVCMOS 3.3V} \ 572 | CONFIG.PCW_MIO_3_PULLUP {disabled} \ 573 | CONFIG.PCW_MIO_3_SLEW {slow} \ 574 | CONFIG.PCW_MIO_40_DIRECTION {inout} \ 575 | CONFIG.PCW_MIO_40_IOTYPE {LVCMOS 1.8V} \ 576 | CONFIG.PCW_MIO_40_PULLUP {enabled} \ 577 | CONFIG.PCW_MIO_40_SLEW {slow} \ 578 | CONFIG.PCW_MIO_41_DIRECTION {inout} \ 579 | CONFIG.PCW_MIO_41_IOTYPE {LVCMOS 1.8V} \ 580 | CONFIG.PCW_MIO_41_PULLUP {enabled} \ 581 | CONFIG.PCW_MIO_41_SLEW {slow} \ 582 | CONFIG.PCW_MIO_42_DIRECTION {inout} \ 583 | CONFIG.PCW_MIO_42_IOTYPE {LVCMOS 1.8V} \ 584 | CONFIG.PCW_MIO_42_PULLUP {enabled} \ 585 | CONFIG.PCW_MIO_42_SLEW {slow} \ 586 | CONFIG.PCW_MIO_43_DIRECTION {inout} \ 587 | CONFIG.PCW_MIO_43_IOTYPE {LVCMOS 1.8V} \ 588 | CONFIG.PCW_MIO_43_PULLUP {enabled} \ 589 | CONFIG.PCW_MIO_43_SLEW {slow} \ 590 | CONFIG.PCW_MIO_44_DIRECTION {inout} \ 591 | CONFIG.PCW_MIO_44_IOTYPE {LVCMOS 1.8V} \ 592 | CONFIG.PCW_MIO_44_PULLUP {enabled} \ 593 | CONFIG.PCW_MIO_44_SLEW {slow} \ 594 | CONFIG.PCW_MIO_45_DIRECTION {inout} \ 595 | CONFIG.PCW_MIO_45_IOTYPE {LVCMOS 1.8V} \ 596 | CONFIG.PCW_MIO_45_PULLUP {enabled} \ 597 | CONFIG.PCW_MIO_45_SLEW {slow} \ 598 | CONFIG.PCW_MIO_46_DIRECTION {out} \ 599 | CONFIG.PCW_MIO_46_IOTYPE {LVCMOS 1.8V} \ 600 | CONFIG.PCW_MIO_46_PULLUP {enabled} \ 601 | CONFIG.PCW_MIO_46_SLEW {slow} \ 602 | CONFIG.PCW_MIO_47_DIRECTION {in} \ 603 | CONFIG.PCW_MIO_47_IOTYPE {LVCMOS 1.8V} \ 604 | CONFIG.PCW_MIO_47_PULLUP {enabled} \ 605 | CONFIG.PCW_MIO_47_SLEW {slow} \ 606 | CONFIG.PCW_MIO_48_DIRECTION {inout} \ 607 | CONFIG.PCW_MIO_48_IOTYPE {LVCMOS 1.8V} \ 608 | CONFIG.PCW_MIO_48_PULLUP {enabled} \ 609 | CONFIG.PCW_MIO_48_SLEW {slow} \ 610 | CONFIG.PCW_MIO_49_DIRECTION {inout} \ 611 | CONFIG.PCW_MIO_49_IOTYPE {LVCMOS 1.8V} \ 612 | CONFIG.PCW_MIO_49_PULLUP {enabled} \ 613 | CONFIG.PCW_MIO_49_SLEW {slow} \ 614 | CONFIG.PCW_MIO_4_DIRECTION {inout} \ 615 | CONFIG.PCW_MIO_4_IOTYPE {LVCMOS 3.3V} \ 616 | CONFIG.PCW_MIO_4_PULLUP {disabled} \ 617 | CONFIG.PCW_MIO_4_SLEW {slow} \ 618 | CONFIG.PCW_MIO_50_DIRECTION {inout} \ 619 | CONFIG.PCW_MIO_50_IOTYPE {LVCMOS 1.8V} \ 620 | CONFIG.PCW_MIO_50_PULLUP {enabled} \ 621 | CONFIG.PCW_MIO_50_SLEW {slow} \ 622 | CONFIG.PCW_MIO_51_DIRECTION {inout} \ 623 | CONFIG.PCW_MIO_51_IOTYPE {LVCMOS 1.8V} \ 624 | CONFIG.PCW_MIO_51_PULLUP {enabled} \ 625 | CONFIG.PCW_MIO_51_SLEW {slow} \ 626 | CONFIG.PCW_MIO_52_DIRECTION {out} \ 627 | CONFIG.PCW_MIO_52_IOTYPE {LVCMOS 1.8V} \ 628 | CONFIG.PCW_MIO_52_PULLUP {enabled} \ 629 | CONFIG.PCW_MIO_52_SLEW {slow} \ 630 | CONFIG.PCW_MIO_53_DIRECTION {inout} \ 631 | CONFIG.PCW_MIO_53_IOTYPE {LVCMOS 1.8V} \ 632 | CONFIG.PCW_MIO_53_PULLUP {enabled} \ 633 | CONFIG.PCW_MIO_53_SLEW {slow} \ 634 | CONFIG.PCW_MIO_5_DIRECTION {inout} \ 635 | CONFIG.PCW_MIO_5_IOTYPE {LVCMOS 3.3V} \ 636 | CONFIG.PCW_MIO_5_PULLUP {disabled} \ 637 | CONFIG.PCW_MIO_5_SLEW {slow} \ 638 | CONFIG.PCW_MIO_6_DIRECTION {out} \ 639 | CONFIG.PCW_MIO_6_IOTYPE {LVCMOS 3.3V} \ 640 | CONFIG.PCW_MIO_6_PULLUP {disabled} \ 641 | CONFIG.PCW_MIO_6_SLEW {slow} \ 642 | CONFIG.PCW_MIO_7_DIRECTION {out} \ 643 | CONFIG.PCW_MIO_7_IOTYPE {LVCMOS 3.3V} \ 644 | CONFIG.PCW_MIO_7_PULLUP {disabled} \ 645 | CONFIG.PCW_MIO_7_SLEW {slow} \ 646 | CONFIG.PCW_MIO_8_DIRECTION {out} \ 647 | CONFIG.PCW_MIO_8_IOTYPE {LVCMOS 3.3V} \ 648 | CONFIG.PCW_MIO_8_PULLUP {disabled} \ 649 | CONFIG.PCW_MIO_8_SLEW {slow} \ 650 | CONFIG.PCW_MIO_9_DIRECTION {out} \ 651 | CONFIG.PCW_MIO_9_IOTYPE {LVCMOS 3.3V} \ 652 | CONFIG.PCW_MIO_9_PULLUP {enabled} \ 653 | CONFIG.PCW_MIO_9_SLEW {slow} \ 654 | CONFIG.PCW_MIO_PRIMITIVE {54} \ 655 | CONFIG.PCW_MIO_TREE_PERIPHERALS {GPIO#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#GPIO#Quad SPI Flash#ENET Reset#GPIO#GPIO#GPIO#GPIO#UART 0#UART 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#SD 0#SD 0#SD 0#SD 0#SD 0#SD 0#USB Reset#SD 0#GPIO#GPIO#GPIO#GPIO#Enet 0#Enet 0} \ 656 | CONFIG.PCW_MIO_TREE_SIGNALS {gpio[0]#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#gpio[7]#qspi_fbclk#reset#gpio[10]#gpio[11]#gpio[12]#gpio[13]#rx#tx#tx_clk#txd[0]#txd[1]#txd[2]#txd[3]#tx_ctl#rx_clk#rxd[0]#rxd[1]#rxd[2]#rxd[3]#rx_ctl#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#clk#cmd#data[0]#data[1]#data[2]#data[3]#reset#cd#gpio[48]#gpio[49]#gpio[50]#gpio[51]#mdc#mdio} \ 657 | CONFIG.PCW_M_AXI_GP0_ENABLE_STATIC_REMAP {0} \ 658 | CONFIG.PCW_M_AXI_GP0_ID_WIDTH {12} \ 659 | CONFIG.PCW_M_AXI_GP0_SUPPORT_NARROW_BURST {0} \ 660 | CONFIG.PCW_M_AXI_GP0_THREAD_ID_WIDTH {12} \ 661 | CONFIG.PCW_M_AXI_GP1_ENABLE_STATIC_REMAP {0} \ 662 | CONFIG.PCW_M_AXI_GP1_ID_WIDTH {12} \ 663 | CONFIG.PCW_M_AXI_GP1_SUPPORT_NARROW_BURST {0} \ 664 | CONFIG.PCW_M_AXI_GP1_THREAD_ID_WIDTH {12} \ 665 | CONFIG.PCW_NAND_CYCLES_T_AR {1} \ 666 | CONFIG.PCW_NAND_CYCLES_T_CLR {1} \ 667 | CONFIG.PCW_NAND_CYCLES_T_RC {11} \ 668 | CONFIG.PCW_NAND_CYCLES_T_REA {1} \ 669 | CONFIG.PCW_NAND_CYCLES_T_RR {1} \ 670 | CONFIG.PCW_NAND_CYCLES_T_WC {11} \ 671 | CONFIG.PCW_NAND_CYCLES_T_WP {1} \ 672 | CONFIG.PCW_NAND_GRP_D8_ENABLE {0} \ 673 | CONFIG.PCW_NAND_PERIPHERAL_ENABLE {0} \ 674 | CONFIG.PCW_NOR_CS0_T_CEOE {1} \ 675 | CONFIG.PCW_NOR_CS0_T_PC {1} \ 676 | CONFIG.PCW_NOR_CS0_T_RC {11} \ 677 | CONFIG.PCW_NOR_CS0_T_TR {1} \ 678 | CONFIG.PCW_NOR_CS0_T_WC {11} \ 679 | CONFIG.PCW_NOR_CS0_T_WP {1} \ 680 | CONFIG.PCW_NOR_CS0_WE_TIME {0} \ 681 | CONFIG.PCW_NOR_CS1_T_CEOE {1} \ 682 | CONFIG.PCW_NOR_CS1_T_PC {1} \ 683 | CONFIG.PCW_NOR_CS1_T_RC {11} \ 684 | CONFIG.PCW_NOR_CS1_T_TR {1} \ 685 | CONFIG.PCW_NOR_CS1_T_WC {11} \ 686 | CONFIG.PCW_NOR_CS1_T_WP {1} \ 687 | CONFIG.PCW_NOR_CS1_WE_TIME {0} \ 688 | CONFIG.PCW_NOR_GRP_A25_ENABLE {0} \ 689 | CONFIG.PCW_NOR_GRP_CS0_ENABLE {0} \ 690 | CONFIG.PCW_NOR_GRP_CS1_ENABLE {0} \ 691 | CONFIG.PCW_NOR_GRP_SRAM_CS0_ENABLE {0} \ 692 | CONFIG.PCW_NOR_GRP_SRAM_CS1_ENABLE {0} \ 693 | CONFIG.PCW_NOR_GRP_SRAM_INT_ENABLE {0} \ 694 | CONFIG.PCW_NOR_PERIPHERAL_ENABLE {0} \ 695 | CONFIG.PCW_NOR_SRAM_CS0_T_CEOE {1} \ 696 | CONFIG.PCW_NOR_SRAM_CS0_T_PC {1} \ 697 | CONFIG.PCW_NOR_SRAM_CS0_T_RC {11} \ 698 | CONFIG.PCW_NOR_SRAM_CS0_T_TR {1} \ 699 | CONFIG.PCW_NOR_SRAM_CS0_T_WC {11} \ 700 | CONFIG.PCW_NOR_SRAM_CS0_T_WP {1} \ 701 | CONFIG.PCW_NOR_SRAM_CS0_WE_TIME {0} \ 702 | CONFIG.PCW_NOR_SRAM_CS1_T_CEOE {1} \ 703 | CONFIG.PCW_NOR_SRAM_CS1_T_PC {1} \ 704 | CONFIG.PCW_NOR_SRAM_CS1_T_RC {11} \ 705 | CONFIG.PCW_NOR_SRAM_CS1_T_TR {1} \ 706 | CONFIG.PCW_NOR_SRAM_CS1_T_WC {11} \ 707 | CONFIG.PCW_NOR_SRAM_CS1_T_WP {1} \ 708 | CONFIG.PCW_NOR_SRAM_CS1_WE_TIME {0} \ 709 | CONFIG.PCW_OVERRIDE_BASIC_CLOCK {0} \ 710 | CONFIG.PCW_P2F_CAN0_INTR {0} \ 711 | CONFIG.PCW_P2F_CAN1_INTR {0} \ 712 | CONFIG.PCW_P2F_CTI_INTR {0} \ 713 | CONFIG.PCW_P2F_DMAC0_INTR {0} \ 714 | CONFIG.PCW_P2F_DMAC1_INTR {0} \ 715 | CONFIG.PCW_P2F_DMAC2_INTR {0} \ 716 | CONFIG.PCW_P2F_DMAC3_INTR {0} \ 717 | CONFIG.PCW_P2F_DMAC4_INTR {0} \ 718 | CONFIG.PCW_P2F_DMAC5_INTR {0} \ 719 | CONFIG.PCW_P2F_DMAC6_INTR {0} \ 720 | CONFIG.PCW_P2F_DMAC7_INTR {0} \ 721 | CONFIG.PCW_P2F_DMAC_ABORT_INTR {0} \ 722 | CONFIG.PCW_P2F_ENET0_INTR {0} \ 723 | CONFIG.PCW_P2F_ENET1_INTR {0} \ 724 | CONFIG.PCW_P2F_GPIO_INTR {0} \ 725 | CONFIG.PCW_P2F_I2C0_INTR {0} \ 726 | CONFIG.PCW_P2F_I2C1_INTR {0} \ 727 | CONFIG.PCW_P2F_QSPI_INTR {0} \ 728 | CONFIG.PCW_P2F_SDIO0_INTR {0} \ 729 | CONFIG.PCW_P2F_SDIO1_INTR {0} \ 730 | CONFIG.PCW_P2F_SMC_INTR {0} \ 731 | CONFIG.PCW_P2F_SPI0_INTR {0} \ 732 | CONFIG.PCW_P2F_SPI1_INTR {0} \ 733 | CONFIG.PCW_P2F_UART0_INTR {0} \ 734 | CONFIG.PCW_P2F_UART1_INTR {0} \ 735 | CONFIG.PCW_P2F_USB0_INTR {0} \ 736 | CONFIG.PCW_P2F_USB1_INTR {0} \ 737 | CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY0 {0.223} \ 738 | CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY1 {0.212} \ 739 | CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY2 {0.085} \ 740 | CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY3 {0.092} \ 741 | CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0 {0.040} \ 742 | CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1 {0.058} \ 743 | CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2 {-0.009} \ 744 | CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3 {-0.033} \ 745 | CONFIG.PCW_PACKAGE_NAME {clg400} \ 746 | CONFIG.PCW_PCAP_PERIPHERAL_CLKSRC {IO PLL} \ 747 | CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {5} \ 748 | CONFIG.PCW_PCAP_PERIPHERAL_FREQMHZ {200} \ 749 | CONFIG.PCW_PERIPHERAL_BOARD_PRESET {part0} \ 750 | CONFIG.PCW_PLL_BYPASSMODE_ENABLE {0} \ 751 | CONFIG.PCW_PRESET_BANK0_VOLTAGE {LVCMOS 3.3V} \ 752 | CONFIG.PCW_PRESET_BANK1_VOLTAGE {LVCMOS 1.8V} \ 753 | CONFIG.PCW_PS7_SI_REV {PRODUCTION} \ 754 | CONFIG.PCW_QSPI_GRP_FBCLK_ENABLE {1} \ 755 | CONFIG.PCW_QSPI_GRP_FBCLK_IO {MIO 8} \ 756 | CONFIG.PCW_QSPI_GRP_IO1_ENABLE {0} \ 757 | CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} \ 758 | CONFIG.PCW_QSPI_GRP_SINGLE_SS_IO {MIO 1 .. 6} \ 759 | CONFIG.PCW_QSPI_GRP_SS1_ENABLE {0} \ 760 | CONFIG.PCW_QSPI_INTERNAL_HIGHADDRESS {0xFCFFFFFF} \ 761 | CONFIG.PCW_QSPI_PERIPHERAL_CLKSRC {IO PLL} \ 762 | CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {5} \ 763 | CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {1} \ 764 | CONFIG.PCW_QSPI_PERIPHERAL_FREQMHZ {200} \ 765 | CONFIG.PCW_QSPI_QSPI_IO {MIO 1 .. 6} \ 766 | CONFIG.PCW_SD0_GRP_CD_ENABLE {1} \ 767 | CONFIG.PCW_SD0_GRP_CD_IO {MIO 47} \ 768 | CONFIG.PCW_SD0_GRP_POW_ENABLE {0} \ 769 | CONFIG.PCW_SD0_GRP_WP_ENABLE {0} \ 770 | CONFIG.PCW_SD0_PERIPHERAL_ENABLE {1} \ 771 | CONFIG.PCW_SD0_SD0_IO {MIO 40 .. 45} \ 772 | CONFIG.PCW_SD1_GRP_CD_ENABLE {0} \ 773 | CONFIG.PCW_SD1_GRP_POW_ENABLE {0} \ 774 | CONFIG.PCW_SD1_GRP_WP_ENABLE {0} \ 775 | CONFIG.PCW_SD1_PERIPHERAL_ENABLE {0} \ 776 | CONFIG.PCW_SDIO0_BASEADDR {0xE0100000} \ 777 | CONFIG.PCW_SDIO0_HIGHADDR {0xE0100FFF} \ 778 | CONFIG.PCW_SDIO1_BASEADDR {0xE0101000} \ 779 | CONFIG.PCW_SDIO1_HIGHADDR {0xE0101FFF} \ 780 | CONFIG.PCW_SDIO_PERIPHERAL_CLKSRC {IO PLL} \ 781 | CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {20} \ 782 | CONFIG.PCW_SDIO_PERIPHERAL_FREQMHZ {50} \ 783 | CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \ 784 | CONFIG.PCW_SINGLE_QSPI_DATA_MODE {x4} \ 785 | CONFIG.PCW_SMC_CYCLE_T0 {NA} \ 786 | CONFIG.PCW_SMC_CYCLE_T1 {NA} \ 787 | CONFIG.PCW_SMC_CYCLE_T2 {NA} \ 788 | CONFIG.PCW_SMC_CYCLE_T3 {NA} \ 789 | CONFIG.PCW_SMC_CYCLE_T4 {NA} \ 790 | CONFIG.PCW_SMC_CYCLE_T5 {NA} \ 791 | CONFIG.PCW_SMC_CYCLE_T6 {NA} \ 792 | CONFIG.PCW_SMC_PERIPHERAL_CLKSRC {IO PLL} \ 793 | CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \ 794 | CONFIG.PCW_SMC_PERIPHERAL_FREQMHZ {100} \ 795 | CONFIG.PCW_SMC_PERIPHERAL_VALID {0} \ 796 | CONFIG.PCW_SPI0_BASEADDR {0xE0006000} \ 797 | CONFIG.PCW_SPI0_GRP_SS0_ENABLE {0} \ 798 | CONFIG.PCW_SPI0_GRP_SS1_ENABLE {0} \ 799 | CONFIG.PCW_SPI0_GRP_SS2_ENABLE {0} \ 800 | CONFIG.PCW_SPI0_HIGHADDR {0xE0006FFF} \ 801 | CONFIG.PCW_SPI0_PERIPHERAL_ENABLE {0} \ 802 | CONFIG.PCW_SPI1_BASEADDR {0xE0007000} \ 803 | CONFIG.PCW_SPI1_GRP_SS0_ENABLE {0} \ 804 | CONFIG.PCW_SPI1_GRP_SS1_ENABLE {0} \ 805 | CONFIG.PCW_SPI1_GRP_SS2_ENABLE {0} \ 806 | CONFIG.PCW_SPI1_HIGHADDR {0xE0007FFF} \ 807 | CONFIG.PCW_SPI1_PERIPHERAL_ENABLE {0} \ 808 | CONFIG.PCW_SPI_PERIPHERAL_CLKSRC {IO PLL} \ 809 | CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \ 810 | CONFIG.PCW_SPI_PERIPHERAL_FREQMHZ {166.666666} \ 811 | CONFIG.PCW_SPI_PERIPHERAL_VALID {0} \ 812 | CONFIG.PCW_S_AXI_ACP_ARUSER_VAL {31} \ 813 | CONFIG.PCW_S_AXI_ACP_AWUSER_VAL {31} \ 814 | CONFIG.PCW_S_AXI_ACP_ID_WIDTH {3} \ 815 | CONFIG.PCW_S_AXI_GP0_ID_WIDTH {6} \ 816 | CONFIG.PCW_S_AXI_GP1_ID_WIDTH {6} \ 817 | CONFIG.PCW_S_AXI_HP0_DATA_WIDTH {64} \ 818 | CONFIG.PCW_S_AXI_HP0_ID_WIDTH {6} \ 819 | CONFIG.PCW_S_AXI_HP1_DATA_WIDTH {64} \ 820 | CONFIG.PCW_S_AXI_HP1_ID_WIDTH {6} \ 821 | CONFIG.PCW_S_AXI_HP2_DATA_WIDTH {64} \ 822 | CONFIG.PCW_S_AXI_HP2_ID_WIDTH {6} \ 823 | CONFIG.PCW_S_AXI_HP3_DATA_WIDTH {64} \ 824 | CONFIG.PCW_S_AXI_HP3_ID_WIDTH {6} \ 825 | CONFIG.PCW_TPIU_PERIPHERAL_CLKSRC {External} \ 826 | CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \ 827 | CONFIG.PCW_TPIU_PERIPHERAL_FREQMHZ {200} \ 828 | CONFIG.PCW_TRACE_BUFFER_CLOCK_DELAY {12} \ 829 | CONFIG.PCW_TRACE_BUFFER_FIFO_SIZE {128} \ 830 | CONFIG.PCW_TRACE_PIPELINE_WIDTH {8} \ 831 | CONFIG.PCW_TTC0_BASEADDR {0xE0104000} \ 832 | CONFIG.PCW_TTC0_CLK0_PERIPHERAL_CLKSRC {CPU_1X} \ 833 | CONFIG.PCW_TTC0_CLK0_PERIPHERAL_DIVISOR0 {1} \ 834 | CONFIG.PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ 835 | CONFIG.PCW_TTC0_CLK1_PERIPHERAL_CLKSRC {CPU_1X} \ 836 | CONFIG.PCW_TTC0_CLK1_PERIPHERAL_DIVISOR0 {1} \ 837 | CONFIG.PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ 838 | CONFIG.PCW_TTC0_CLK2_PERIPHERAL_CLKSRC {CPU_1X} \ 839 | CONFIG.PCW_TTC0_CLK2_PERIPHERAL_DIVISOR0 {1} \ 840 | CONFIG.PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ 841 | CONFIG.PCW_TTC0_HIGHADDR {0xE0104fff} \ 842 | CONFIG.PCW_TTC1_BASEADDR {0xE0105000} \ 843 | CONFIG.PCW_TTC1_CLK0_PERIPHERAL_CLKSRC {CPU_1X} \ 844 | CONFIG.PCW_TTC1_CLK0_PERIPHERAL_DIVISOR0 {1} \ 845 | CONFIG.PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ 846 | CONFIG.PCW_TTC1_CLK1_PERIPHERAL_CLKSRC {CPU_1X} \ 847 | CONFIG.PCW_TTC1_CLK1_PERIPHERAL_DIVISOR0 {1} \ 848 | CONFIG.PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ 849 | CONFIG.PCW_TTC1_CLK2_PERIPHERAL_CLKSRC {CPU_1X} \ 850 | CONFIG.PCW_TTC1_CLK2_PERIPHERAL_DIVISOR0 {1} \ 851 | CONFIG.PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ 852 | CONFIG.PCW_TTC1_HIGHADDR {0xE0105fff} \ 853 | CONFIG.PCW_TTC_PERIPHERAL_FREQMHZ {50} \ 854 | CONFIG.PCW_UART0_BASEADDR {0xE0000000} \ 855 | CONFIG.PCW_UART0_BAUD_RATE {115200} \ 856 | CONFIG.PCW_UART0_GRP_FULL_ENABLE {0} \ 857 | CONFIG.PCW_UART0_HIGHADDR {0xE0000FFF} \ 858 | CONFIG.PCW_UART0_PERIPHERAL_ENABLE {1} \ 859 | CONFIG.PCW_UART0_UART0_IO {MIO 14 .. 15} \ 860 | CONFIG.PCW_UART1_BASEADDR {0xE0001000} \ 861 | CONFIG.PCW_UART1_BAUD_RATE {115200} \ 862 | CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \ 863 | CONFIG.PCW_UART1_HIGHADDR {0xE0001FFF} \ 864 | CONFIG.PCW_UART1_PERIPHERAL_ENABLE {0} \ 865 | CONFIG.PCW_UART_PERIPHERAL_CLKSRC {IO PLL} \ 866 | CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {10} \ 867 | CONFIG.PCW_UART_PERIPHERAL_FREQMHZ {100} \ 868 | CONFIG.PCW_UART_PERIPHERAL_VALID {1} \ 869 | CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {525.000000} \ 870 | CONFIG.PCW_UIPARAM_DDR_ADV_ENABLE {0} \ 871 | CONFIG.PCW_UIPARAM_DDR_AL {0} \ 872 | CONFIG.PCW_UIPARAM_DDR_BANK_ADDR_COUNT {3} \ 873 | CONFIG.PCW_UIPARAM_DDR_BL {8} \ 874 | CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY0 {0.223} \ 875 | CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY1 {0.212} \ 876 | CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY2 {0.085} \ 877 | CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY3 {0.092} \ 878 | CONFIG.PCW_UIPARAM_DDR_BUS_WIDTH {16 Bit} \ 879 | CONFIG.PCW_UIPARAM_DDR_CL {7} \ 880 | CONFIG.PCW_UIPARAM_DDR_CLOCK_0_LENGTH_MM {25.8} \ 881 | CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH {80.4535} \ 882 | CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PROPOGATION_DELAY {160} \ 883 | CONFIG.PCW_UIPARAM_DDR_CLOCK_1_LENGTH_MM {25.8} \ 884 | CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH {80.4535} \ 885 | CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PROPOGATION_DELAY {160} \ 886 | CONFIG.PCW_UIPARAM_DDR_CLOCK_2_LENGTH_MM {0} \ 887 | CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH {80.4535} \ 888 | CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PROPOGATION_DELAY {160} \ 889 | CONFIG.PCW_UIPARAM_DDR_CLOCK_3_LENGTH_MM {0} \ 890 | CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH {80.4535} \ 891 | CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PROPOGATION_DELAY {160} \ 892 | CONFIG.PCW_UIPARAM_DDR_CLOCK_STOP_EN {0} \ 893 | CONFIG.PCW_UIPARAM_DDR_COL_ADDR_COUNT {10} \ 894 | CONFIG.PCW_UIPARAM_DDR_CWL {6} \ 895 | CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \ 896 | CONFIG.PCW_UIPARAM_DDR_DQS_0_LENGTH_MM {15.6} \ 897 | CONFIG.PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH {105.056} \ 898 | CONFIG.PCW_UIPARAM_DDR_DQS_0_PROPOGATION_DELAY {160} \ 899 | CONFIG.PCW_UIPARAM_DDR_DQS_1_LENGTH_MM {18.8} \ 900 | CONFIG.PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH {66.904} \ 901 | CONFIG.PCW_UIPARAM_DDR_DQS_1_PROPOGATION_DELAY {160} \ 902 | CONFIG.PCW_UIPARAM_DDR_DQS_2_LENGTH_MM {0} \ 903 | CONFIG.PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH {89.1715} \ 904 | CONFIG.PCW_UIPARAM_DDR_DQS_2_PROPOGATION_DELAY {160} \ 905 | CONFIG.PCW_UIPARAM_DDR_DQS_3_LENGTH_MM {0} \ 906 | CONFIG.PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH {113.63} \ 907 | CONFIG.PCW_UIPARAM_DDR_DQS_3_PROPOGATION_DELAY {160} \ 908 | CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 {0.040} \ 909 | CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1 {0.058} \ 910 | CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 {-0.009} \ 911 | CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3 {-0.033} \ 912 | CONFIG.PCW_UIPARAM_DDR_DQ_0_LENGTH_MM {16.5} \ 913 | CONFIG.PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH {98.503} \ 914 | CONFIG.PCW_UIPARAM_DDR_DQ_0_PROPOGATION_DELAY {160} \ 915 | CONFIG.PCW_UIPARAM_DDR_DQ_1_LENGTH_MM {18} \ 916 | CONFIG.PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH {68.5855} \ 917 | CONFIG.PCW_UIPARAM_DDR_DQ_1_PROPOGATION_DELAY {160} \ 918 | CONFIG.PCW_UIPARAM_DDR_DQ_2_LENGTH_MM {0} \ 919 | CONFIG.PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH {90.295} \ 920 | CONFIG.PCW_UIPARAM_DDR_DQ_2_PROPOGATION_DELAY {160} \ 921 | CONFIG.PCW_UIPARAM_DDR_DQ_3_LENGTH_MM {0} \ 922 | CONFIG.PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH {103.977} \ 923 | CONFIG.PCW_UIPARAM_DDR_DQ_3_PROPOGATION_DELAY {160} \ 924 | CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \ 925 | CONFIG.PCW_UIPARAM_DDR_ECC {Disabled} \ 926 | CONFIG.PCW_UIPARAM_DDR_ENABLE {1} \ 927 | CONFIG.PCW_UIPARAM_DDR_FREQ_MHZ {525} \ 928 | CONFIG.PCW_UIPARAM_DDR_HIGH_TEMP {Normal (0-85)} \ 929 | CONFIG.PCW_UIPARAM_DDR_MEMORY_TYPE {DDR 3} \ 930 | CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} \ 931 | CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \ 932 | CONFIG.PCW_UIPARAM_DDR_SPEED_BIN {DDR3_1066F} \ 933 | CONFIG.PCW_UIPARAM_DDR_TRAIN_DATA_EYE {1} \ 934 | CONFIG.PCW_UIPARAM_DDR_TRAIN_READ_GATE {1} \ 935 | CONFIG.PCW_UIPARAM_DDR_TRAIN_WRITE_LEVEL {1} \ 936 | CONFIG.PCW_UIPARAM_DDR_T_FAW {40.0} \ 937 | CONFIG.PCW_UIPARAM_DDR_T_RAS_MIN {35.0} \ 938 | CONFIG.PCW_UIPARAM_DDR_T_RC {48.91} \ 939 | CONFIG.PCW_UIPARAM_DDR_T_RCD {7} \ 940 | CONFIG.PCW_UIPARAM_DDR_T_RP {7} \ 941 | CONFIG.PCW_UIPARAM_DDR_USE_INTERNAL_VREF {0} \ 942 | CONFIG.PCW_UIPARAM_GENERATE_SUMMARY {NA} \ 943 | CONFIG.PCW_USB0_BASEADDR {0xE0102000} \ 944 | CONFIG.PCW_USB0_HIGHADDR {0xE0102fff} \ 945 | CONFIG.PCW_USB0_PERIPHERAL_ENABLE {1} \ 946 | CONFIG.PCW_USB0_PERIPHERAL_FREQMHZ {60} \ 947 | CONFIG.PCW_USB0_RESET_ENABLE {1} \ 948 | CONFIG.PCW_USB0_RESET_IO {MIO 46} \ 949 | CONFIG.PCW_USB0_USB0_IO {MIO 28 .. 39} \ 950 | CONFIG.PCW_USB1_BASEADDR {0xE0103000} \ 951 | CONFIG.PCW_USB1_HIGHADDR {0xE0103fff} \ 952 | CONFIG.PCW_USB1_PERIPHERAL_ENABLE {0} \ 953 | CONFIG.PCW_USB1_PERIPHERAL_FREQMHZ {60} \ 954 | CONFIG.PCW_USB1_RESET_ENABLE {0} \ 955 | CONFIG.PCW_USB_RESET_ENABLE {1} \ 956 | CONFIG.PCW_USB_RESET_POLARITY {Active Low} \ 957 | CONFIG.PCW_USB_RESET_SELECT {Share reset pin} \ 958 | CONFIG.PCW_USE_AXI_FABRIC_IDLE {0} \ 959 | CONFIG.PCW_USE_AXI_NONSECURE {0} \ 960 | CONFIG.PCW_USE_CORESIGHT {0} \ 961 | CONFIG.PCW_USE_CROSS_TRIGGER {0} \ 962 | CONFIG.PCW_USE_CR_FABRIC {1} \ 963 | CONFIG.PCW_USE_DDR_BYPASS {0} \ 964 | CONFIG.PCW_USE_DEBUG {0} \ 965 | CONFIG.PCW_USE_DEFAULT_ACP_USER_VAL {0} \ 966 | CONFIG.PCW_USE_DMA0 {0} \ 967 | CONFIG.PCW_USE_DMA1 {0} \ 968 | CONFIG.PCW_USE_DMA2 {0} \ 969 | CONFIG.PCW_USE_DMA3 {0} \ 970 | CONFIG.PCW_USE_EXPANDED_IOP {0} \ 971 | CONFIG.PCW_USE_EXPANDED_PS_SLCR_REGISTERS {0} \ 972 | CONFIG.PCW_USE_FABRIC_INTERRUPT {0} \ 973 | CONFIG.PCW_USE_HIGH_OCM {0} \ 974 | CONFIG.PCW_USE_M_AXI_GP0 {1} \ 975 | CONFIG.PCW_USE_M_AXI_GP1 {0} \ 976 | CONFIG.PCW_USE_PROC_EVENT_BUS {0} \ 977 | CONFIG.PCW_USE_PS_SLCR_REGISTERS {0} \ 978 | CONFIG.PCW_USE_S_AXI_ACP {0} \ 979 | CONFIG.PCW_USE_S_AXI_GP0 {0} \ 980 | CONFIG.PCW_USE_S_AXI_GP1 {0} \ 981 | CONFIG.PCW_USE_S_AXI_HP0 {1} \ 982 | CONFIG.PCW_USE_S_AXI_HP1 {1} \ 983 | CONFIG.PCW_USE_S_AXI_HP2 {1} \ 984 | CONFIG.PCW_USE_S_AXI_HP3 {0} \ 985 | CONFIG.PCW_USE_TRACE {0} \ 986 | CONFIG.PCW_USE_TRACE_DATA_EDGE_DETECTOR {0} \ 987 | CONFIG.PCW_VALUE_SILVERSION {3} \ 988 | CONFIG.PCW_WDT_PERIPHERAL_CLKSRC {CPU_1X} \ 989 | CONFIG.PCW_WDT_PERIPHERAL_DIVISOR0 {1} \ 990 | CONFIG.PCW_WDT_PERIPHERAL_FREQMHZ {133.333333} \ 991 | ] $processing_system7_0 992 | 993 | # Create instance: ps7_0_axi_periph, and set properties 994 | set ps7_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 ps7_0_axi_periph ] 995 | set_property -dict [ list \ 996 | CONFIG.NUM_MI {1} \ 997 | ] $ps7_0_axi_periph 998 | 999 | # Create instance: rst_ps7_0_100M, and set properties 1000 | set rst_ps7_0_100M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_ps7_0_100M ] 1001 | 1002 | # Create interface connections 1003 | connect_bd_intf_net -intf_net axi_smc_1_M00_AXI [get_bd_intf_pins axi_smc_1/M00_AXI] [get_bd_intf_pins processing_system7_0/S_AXI_HP1] 1004 | connect_bd_intf_net -intf_net axi_smc_2_M00_AXI [get_bd_intf_pins axi_smc_2/M00_AXI] [get_bd_intf_pins processing_system7_0/S_AXI_HP2] 1005 | connect_bd_intf_net -intf_net axi_smc_M00_AXI [get_bd_intf_pins axi_smc/M00_AXI] [get_bd_intf_pins processing_system7_0/S_AXI_HP0] 1006 | connect_bd_intf_net -intf_net mobilenet_0_m_axi_IMG [get_bd_intf_pins axi_smc/S00_AXI] [get_bd_intf_pins mobilenet_0/m_axi_IMG] 1007 | connect_bd_intf_net -intf_net mobilenet_0_m_axi_INPUT_r [get_bd_intf_pins axi_smc_1/S00_AXI] [get_bd_intf_pins mobilenet_0/m_axi_INPUT_r] 1008 | connect_bd_intf_net -intf_net mobilenet_0_m_axi_OUTPUT_r [get_bd_intf_pins axi_smc_2/S00_AXI] [get_bd_intf_pins mobilenet_0/m_axi_OUTPUT_r] 1009 | connect_bd_intf_net -intf_net processing_system7_0_DDR [get_bd_intf_ports DDR] [get_bd_intf_pins processing_system7_0/DDR] 1010 | connect_bd_intf_net -intf_net processing_system7_0_FIXED_IO [get_bd_intf_ports FIXED_IO] [get_bd_intf_pins processing_system7_0/FIXED_IO] 1011 | connect_bd_intf_net -intf_net processing_system7_0_M_AXI_GP0 [get_bd_intf_pins processing_system7_0/M_AXI_GP0] [get_bd_intf_pins ps7_0_axi_periph/S00_AXI] 1012 | connect_bd_intf_net -intf_net ps7_0_axi_periph_M00_AXI [get_bd_intf_pins mobilenet_0/s_axi_AXILiteS] [get_bd_intf_pins ps7_0_axi_periph/M00_AXI] 1013 | 1014 | # Create port connections 1015 | connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins axi_smc/aclk] [get_bd_pins axi_smc_1/aclk] [get_bd_pins axi_smc_2/aclk] [get_bd_pins mobilenet_0/ap_clk] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP1_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP2_ACLK] [get_bd_pins ps7_0_axi_periph/ACLK] [get_bd_pins ps7_0_axi_periph/M00_ACLK] [get_bd_pins ps7_0_axi_periph/S00_ACLK] [get_bd_pins rst_ps7_0_100M/slowest_sync_clk] 1016 | connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins processing_system7_0/FCLK_RESET0_N] [get_bd_pins rst_ps7_0_100M/ext_reset_in] 1017 | connect_bd_net -net rst_ps7_0_100M_interconnect_aresetn [get_bd_pins ps7_0_axi_periph/ARESETN] [get_bd_pins rst_ps7_0_100M/interconnect_aresetn] 1018 | connect_bd_net -net rst_ps7_0_100M_peripheral_aresetn [get_bd_pins axi_smc/aresetn] [get_bd_pins axi_smc_1/aresetn] [get_bd_pins axi_smc_2/aresetn] [get_bd_pins mobilenet_0/ap_rst_n] [get_bd_pins ps7_0_axi_periph/M00_ARESETN] [get_bd_pins ps7_0_axi_periph/S00_ARESETN] [get_bd_pins rst_ps7_0_100M/peripheral_aresetn] 1019 | 1020 | # Create address segments 1021 | create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces mobilenet_0/Data_m_axi_IMG] [get_bd_addr_segs processing_system7_0/S_AXI_HP0/HP0_DDR_LOWOCM] SEG_processing_system7_0_HP0_DDR_LOWOCM 1022 | create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces mobilenet_0/Data_m_axi_INPUT_r] [get_bd_addr_segs processing_system7_0/S_AXI_HP1/HP1_DDR_LOWOCM] SEG_processing_system7_0_HP1_DDR_LOWOCM 1023 | create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces mobilenet_0/Data_m_axi_OUTPUT_r] [get_bd_addr_segs processing_system7_0/S_AXI_HP2/HP2_DDR_LOWOCM] SEG_processing_system7_0_HP2_DDR_LOWOCM 1024 | create_bd_addr_seg -range 0x00010000 -offset 0x43C00000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs mobilenet_0/s_axi_AXILiteS/Reg] SEG_mobilenet_0_Reg 1025 | 1026 | 1027 | # Restore current instance 1028 | current_bd_instance $oldCurInst 1029 | 1030 | save_bd_design 1031 | } 1032 | # End of create_root_design() 1033 | 1034 | 1035 | ################################################################## 1036 | # MAIN FLOW 1037 | ################################################################## 1038 | 1039 | create_root_design "" 1040 | 1041 | 1042 | -------------------------------------------------------------------------------- /summer_school.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 12, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Allocating memory successfully \n", 13 | "total_num_img: 16\n", 14 | "Parameters loading successfully\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "#################### 2020 xilinx summer school ############\n", 20 | "\n", 21 | "import sys\n", 22 | "import numpy as np \n", 23 | "import os\n", 24 | "import time\n", 25 | "import math\n", 26 | "from PIL import Image,ImageDraw\n", 27 | "from matplotlib import pyplot\n", 28 | "import matplotlib.pylab as plt\n", 29 | "import cv2\n", 30 | "from datetime import datetime\n", 31 | "from pynq import Xlnk\n", 32 | "from pynq import Overlay\n", 33 | "from summer_processing import *\n", 34 | "import struct\n", 35 | "\n", 36 | "team = 'summernet'\n", 37 | "agent = Agent(team)\n", 38 | "interval_time = 0\n", 39 | "\n", 40 | "xlnk = Xlnk()\n", 41 | "xlnk.xlnk_reset()\n", 42 | "\n", 43 | "img = xlnk.cma_array(shape=(3,162,322), dtype=np.uint8)\n", 44 | "\n", 45 | "conv_weight_1x1_all = xlnk.cma_array(shape=(1181, 16, 16), dtype=np.uint16)\n", 46 | "conv_weight_3x3_all = xlnk.cma_array(shape=(46, 16, 3, 3), dtype=np.uint16)\n", 47 | "bias_all = xlnk.cma_array(shape=(123, 16), dtype=np.uint16)\n", 48 | "DDR_pool_3_out = xlnk.cma_array(shape=(48, 82, 162), dtype=np.uint16)\n", 49 | "DDR_pool_6_out = xlnk.cma_array(shape=(96, 42, 82), dtype=np.uint16)\n", 50 | "DDR_buf = xlnk.cma_array(shape=(36, 16, 22, 42), dtype=np.uint16)\n", 51 | "predict_box = xlnk.cma_array(shape=(5,), dtype=np.float32)\n", 52 | "\n", 53 | "print(\"Allocating memory successfully \")\n", 54 | "\n", 55 | "path_mkdir()\n", 56 | "\n", 57 | "img_path = '/home/xilinx/jupyter_notebooks/summer_school/images/'\n", 58 | "coord_path = '/home/xilinx/jupyter_notebooks/summer_school/result/coordinate/summer_school/'\n", 59 | "\n", 60 | "tbatch = 0\n", 61 | "total_num_img = len(agent.img_list)\n", 62 | "print(\"total_num_img:\", total_num_img)\n", 63 | "result = list()\n", 64 | "agent.reset_batch_count() \n", 65 | " \n", 66 | "blank = Image.new('RGB', (322, 162), (127, 127, 127))\n", 67 | "\n", 68 | "# load parameters from SD card to DDR\n", 69 | "params = np.fromfile(\"summernet.bin\", dtype=np.uint16)\n", 70 | "idx = 0\n", 71 | "\n", 72 | "np.copyto(conv_weight_1x1_all, params[idx:idx+conv_weight_1x1_all.size].reshape(conv_weight_1x1_all.shape))\n", 73 | "idx += conv_weight_1x1_all.size\n", 74 | "\n", 75 | "np.copyto(conv_weight_3x3_all, params[idx:idx+conv_weight_3x3_all.size].reshape(conv_weight_3x3_all.shape))\n", 76 | "idx += conv_weight_3x3_all.size\n", 77 | "\n", 78 | "np.copyto(bias_all, params[idx:idx+bias_all.size].reshape(bias_all.shape))\n", 79 | "\n", 80 | "print(\"Parameters loading successfully\")\n" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 9, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "summernet.bit loaded successfully\n" 93 | ] 94 | } 95 | ], 96 | "source": [ 97 | "################### download the overlay #####################\n", 98 | "overlay = Overlay('/home/xilinx/jupyter_notebooks/summer_school/overlay/summernet/summernet.bit')\n", 99 | "\n", 100 | "print(\"summernet.bit loaded successfully\")\n", 101 | "myIP = overlay.mobilenet_0" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 30, 107 | "metadata": {}, 108 | "outputs": [ 109 | { 110 | "name": "stdout", 111 | "output_type": "stream", 112 | "text": [ 113 | "currPic: 0.jpg\n", 114 | "currPic: 1.jpg\n", 115 | "predict_box: [ 0.49492186 0.49101561 0.05719239 0.165005 0.8359375 ]\n", 116 | "coordinate[x1, x2, y1, y2]: [298, 335, 147, 206]\n", 117 | "batch[i]: 1.jpg\n", 118 | "[x1, x2, y1, y2] [298, 335, 147, 206]\n" 119 | ] 120 | }, 121 | { 122 | "data": { 123 | "image/png": "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\n", 124 | "text/plain": [ 125 | "" 126 | ] 127 | }, 128 | "metadata": {}, 129 | "output_type": "display_data" 130 | }, 131 | { 132 | "name": "stdout", 133 | "output_type": "stream", 134 | "text": [ 135 | "predict_box [ 0.48222655 0.48320311 0.06507093 0.11338333 0.828125 ]\n", 136 | "All computation finish\n" 137 | ] 138 | } 139 | ], 140 | "source": [ 141 | "################## download weights and image resizing and processing\n", 142 | "\n", 143 | "myIP.write(0x10, img.physical_address)\n", 144 | "\n", 145 | "myIP.write(0x18, conv_weight_1x1_all.physical_address)\n", 146 | "myIP.write(0x20, conv_weight_3x3_all.physical_address)\n", 147 | "myIP.write(0x28, bias_all.physical_address)\n", 148 | "\n", 149 | "myIP.write(0x30, DDR_pool_3_out.physical_address)\n", 150 | "myIP.write(0x38, DDR_pool_6_out.physical_address)\n", 151 | "\n", 152 | "myIP.write(0x40, DDR_buf.physical_address)\n", 153 | "myIP.write(0x48, predict_box.physical_address)\n", 154 | "\n", 155 | "\n", 156 | "\n", 157 | "def process_image(currPic):\n", 158 | " print(\"img_path + currPic:\", img_path + currPic)\n", 159 | " image = Image.open(img_path + currPic).convert('RGB')\n", 160 | " image = image.resize((320, 160))\n", 161 | " blank.paste(image, (1, 1))\n", 162 | " image = np.transpose(blank, (2, 0, 1))\n", 163 | " np.copyto(img, np.array(image))\n", 164 | " \n", 165 | "\n", 166 | "first_image = True\n", 167 | "boxes = []\n", 168 | "names = []\n", 169 | "\n", 170 | "i = 0\n", 171 | "lastimgname=\"x.jpg\"\n", 172 | "\n", 173 | "################### Start to detect ################\n", 174 | "start = time.time()\n", 175 | "for batch in get_image_batch():\n", 176 | " for currPic in batch:\n", 177 | " i=i+1\n", 178 | " print(\"currPic:\", currPic)\n", 179 | " names.append(currPic)\n", 180 | "\n", 181 | " if first_image:\n", 182 | " image = Image.open(img_path + currPic).convert('RGB')\n", 183 | " image = image.resize((320, 160))\n", 184 | " blank.paste(image, (1, 1))\n", 185 | " image = np.transpose(blank, (2, 0, 1))\n", 186 | " np.copyto(img, np.array(image))\n", 187 | "# image_1 = pyplot.imread(img_path + currPic)\n", 188 | "# pyplot.imshow(image_1)\n", 189 | "# pyplot.show()\n", 190 | " \n", 191 | "\n", 192 | " first_image = False\n", 193 | " continue\n", 194 | " \n", 195 | " if not first_image:\n", 196 | " myIP.write(0x00, 1)\n", 197 | " time.sleep(0.07)\n", 198 | " image = Image.open(img_path + currPic).convert('RGB')\n", 199 | " image = image.resize((320, 160))\n", 200 | " blank.paste(image, (1, 1))\n", 201 | " image = np.transpose(blank, (2, 0, 1))\n", 202 | " np.copyto(img, np.array(image))\n", 203 | "# image_show = pyplot.imread(img_path + currPic)\n", 204 | "# pyplot.imshow(image_show)\n", 205 | "# pyplot.show()\n", 206 | " \n", 207 | " isready = myIP.read(0x00)\n", 208 | " while( isready == 1 ):\n", 209 | " isready = myIP.read(0x00)\n", 210 | " \n", 211 | " predict_box[0] = predict_box[0] / 40;\n", 212 | " predict_box[1] = predict_box[1] / 20;\n", 213 | " predict_box[2] = predict_box[2] / 40;\n", 214 | " predict_box[3] = predict_box[3] / 20;\n", 215 | " print(\"predict_box:\", predict_box)\n", 216 | " x1 = int(round((predict_box[0] - predict_box[2]/2.0) * 640))\n", 217 | " y1 = int(round((predict_box[1] - predict_box[3]/2.0) * 360))\n", 218 | " x2 = int(round((predict_box[0] + predict_box[2]/2.0) * 640))\n", 219 | " y2 = int(round((predict_box[1] + predict_box[3]/2.0) * 360))\n", 220 | " boxes.append([x1, x2, y1, y2])\n", 221 | " print(\"coordinate[x1, x2, y1, y2]:\", [x1, x2, y1, y2])\n", 222 | " \n", 223 | " \n", 224 | " ###########在原图上画出边界框########\n", 225 | " print(\"batch[i]:\", batch[i-1])\n", 226 | " print(\"[x1, x2, y1, y2]\", [x1, x2, y1, y2]) \n", 227 | " imgee=Image.open(img_path+batch[i-1]).convert('RGB')\n", 228 | " # image = image.resize((320, 160))\n", 229 | " image_show=np.array(imgee)\n", 230 | " for x in range(x1,x2):\n", 231 | " image_show[y1][x][0]=255\n", 232 | " image_show[y1][x][1]=0\n", 233 | " image_show[y1][x][2]=0\n", 234 | " image_show[y1+1][x][0]=255\n", 235 | " image_show[y1+1][x][1]=0\n", 236 | " image_show[y1+1][x][2]=0\n", 237 | " for x in range(x1,x2):\n", 238 | " image_show[y2][x][0]=255\n", 239 | " image_show[y2][x][1]=0\n", 240 | " image_show[y2][x][2]=0\n", 241 | " image_show[y2+1][x][0]=255\n", 242 | " image_show[y2+1][x][1]=0\n", 243 | " image_show[y2+1][x][2]=0\n", 244 | " for y in range(y1,y2):\n", 245 | " image_show[y][x1][0]=255\n", 246 | " image_show[y][x1][1]=0\n", 247 | " image_show[y][x1][2]=0\n", 248 | " image_show[y][x1+1][0]=255\n", 249 | " image_show[y][x1+1][1]=0\n", 250 | " image_show[y][x1+1][2]=0\n", 251 | " for y in range(y1,y2):\n", 252 | " image_show[y][x2][0]=255\n", 253 | " image_show[y][x2][1]=0\n", 254 | " image_show[y][x2][2]=0\n", 255 | " image_show[y][x2+1][0]=255\n", 256 | " image_show[y][x2+1][1]=0\n", 257 | " image_show[y][x2+1][2]=0\n", 258 | " pyplot.imshow(image_show)\n", 259 | " pyplot.show()\n", 260 | " #image_show.close()\n", 261 | " #lastimgname=batch[i-1]\n", 262 | " ###################\n", 263 | "\n", 264 | " \n", 265 | "\n", 266 | "#collect result for last image\n", 267 | "myIP.write(0x00, 1)\n", 268 | "isready = myIP.read(0x00)\n", 269 | "while( isready == 1 ):\n", 270 | " isready = myIP.read(0x00) \n", 271 | " \n", 272 | "predict_box[0] = predict_box[0] / 40;\n", 273 | "predict_box[1] = predict_box[1] / 20;\n", 274 | "predict_box[2] = predict_box[2] / 40;\n", 275 | "predict_box[3] = predict_box[3] / 20;\n", 276 | "print(\"predict_box\", predict_box)\n", 277 | "x1 = int(round((predict_box[0] - predict_box[2]/2.0) * 640))\n", 278 | "y1 = int(round((predict_box[1] - predict_box[3]/2.0) * 360))\n", 279 | "x2 = int(round((predict_box[0] + predict_box[2]/2.0) * 640))\n", 280 | "y2 = int(round((predict_box[1] + predict_box[3]/2.0) * 360))\n", 281 | "boxes.append([x1, x2, y1, y2])\n", 282 | "\n", 283 | "#####################在原图上画出边界框##########\n", 284 | "# print(\"lastimgname:\", lastimgname)\n", 285 | "# print(\"[x1, x2, y1, y2]\", [x1, x2, y1, y2]) \n", 286 | "# imgee=Image.open(img_path+batch[i-1]).convert('RGB')\n", 287 | "# image_show=np.array(imgee)\n", 288 | "# for x in range(x1,x2):\n", 289 | "# image_show[y1][x][0]=255\n", 290 | "# image_show[y1][x][1]=0\n", 291 | "# image_show[y1][x][2]=0\n", 292 | "# image_show[y1+1][x][0]=255\n", 293 | "# image_show[y1+1][x][1]=0\n", 294 | "# image_show[y1+1][x][2]=0\n", 295 | "# for x in range(x1,x2):\n", 296 | "# image_show[y2][x][0]=255\n", 297 | "# image_show[y2][x][1]=0\n", 298 | "# image_show[y2][x][2]=0\n", 299 | "# image_show[y2+1][x][0]=255\n", 300 | "# image_show[y2+1][x][1]=0\n", 301 | "# image_show[y2+1][x][2]=0\n", 302 | "# for y in range(y1,y2):\n", 303 | "# image_show[y][x1][0]=255\n", 304 | "# image_show[y][x1][1]=0\n", 305 | "# image_show[y][x1][2]=0\n", 306 | "# image_show[y][x1+1][0]=255\n", 307 | "# image_show[y][x1+1][1]=0\n", 308 | "# image_show[y][x1+1][2]=0\n", 309 | "# for y in range(y1,y2):\n", 310 | "# image_show[y][x2][0]=255\n", 311 | "# image_show[y][x2][1]=0\n", 312 | "# image_show[y][x2][2]=0\n", 313 | "# image_show[y][x2+1][0]=255\n", 314 | "# image_show[y][x2+1][1]=0\n", 315 | "# image_show[y][x2+1][2]=0\n", 316 | "# pyplot.imshow(image_show)\n", 317 | "# pyplot.show()\n", 318 | "#image_show.close()\n", 319 | "###################\n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | "end = time.time()\n", 324 | "tbatch = end - start\n", 325 | "\n", 326 | " \n", 327 | "print(\"All computation finish\")\n" 328 | ] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": 33, 333 | "metadata": {}, 334 | "outputs": [ 335 | { 336 | "name": "stdout", 337 | "output_type": "stream", 338 | "text": [ 339 | "\n", 340 | "All results stored in summernet.txt\n" 341 | ] 342 | } 343 | ], 344 | "source": [ 345 | "################ record the results and write to XML\n", 346 | "f_out = open(coord_path + '/summernet.txt', 'w')\n", 347 | "cnt = 0\n", 348 | "for box in boxes:\n", 349 | " x1 = box[0]\n", 350 | " x2 = box[1]\n", 351 | " y1 = box[2]\n", 352 | " y2 = box[3]\n", 353 | " coord = str(x1) + ' ' + str(x2) + ' ' + str(y1) + ' ' + str(y2)\n", 354 | " \n", 355 | " name = names[cnt]\n", 356 | " cnt = cnt + 1\n", 357 | " f_out.write(name + '\\n')\n", 358 | " f_out.write(coord + '\\n')\n", 359 | " \n", 360 | "f_out.close()\n", 361 | "print(\"\\nAll results stored in summernet.txt sucessfully\")\n", 362 | "\n", 363 | "# agent.save_results_xml(boxes)\n", 364 | "# agent.write(tbatch, total_num_img, team)\n", 365 | "\n", 366 | "# print(\"XML and time results written successfully.\")" 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "execution_count": 34, 372 | "metadata": {}, 373 | "outputs": [], 374 | "source": [ 375 | "############## clean up #############\n", 376 | "xlnk.xlnk_reset()" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [] 385 | } 386 | ], 387 | "metadata": { 388 | "kernelspec": { 389 | "display_name": "Python 3", 390 | "language": "python", 391 | "name": "python3" 392 | }, 393 | "language_info": { 394 | "codemirror_mode": { 395 | "name": "ipython", 396 | "version": 3 397 | }, 398 | "file_extension": ".py", 399 | "mimetype": "text/x-python", 400 | "name": "python", 401 | "nbconvert_exporter": "python", 402 | "pygments_lexer": "ipython3", 403 | "version": "3.6.5" 404 | } 405 | }, 406 | "nbformat": 4, 407 | "nbformat_minor": 2 408 | } --------------------------------------------------------------------------------