教程:在PYNQ-Z1或PYNQ-Z2上新增硬件设计,以AXI GPIO为例
本教程基于《Tutorial: Using a new hardware design with PYNQ (AXI GPIO)》编写。本教程有些地方与原文有出入,比如原文使用的板子是PYNQ-Z2,本文写的是PYNQ-Z1或者PYNQ-Z2,这是因为我使用PYNQ-Z1也完成了本实验。其他不一致的地方同理。
本教程将向您展示如何将上一篇教程中创建的Vivado硬件设计用于PYNQ。本教程是前一篇教程的后续,前一篇教程介绍了如何为PYNQ创建一个新的硬件设计。
环境说明
- 开发板:PYNQ-Z1或者PYNQ-Z2
- v2.4 PYNQ 镜像
- vivado 2018.2或者vivado2019.1
原文链接:https://discuss.pynq.io/t/tutorial-using-a-new-hardware-design-with-pynq-axi-gpio/146
相关资源:
- ipynb源文件:https://discuss.pynq.io/uploads/short-url/g8O85AMwDcYgspPkqDpG1cH4xWm.ipynb
- 硬件设计文件:https://discuss.pynq.io/uploads/short-url/gjwp4jNJzWGot5lJkeaT2mn8YGW.zip
1 使用pynq Overaly类将Overlay实例化。
Overlay类的原型为:Overlay(bitfile_name, download=True, ignore_version=False)
bitfile_name是FPGA位流文件的完整文件名。
- 默认情况下,
download为True,当Overlay被实例化时,位流将被下载到PL。 - 也可以将
download设置为False,以便在不下载比特流的情况下实例化Overlay。
Overlay类将自动为已知的IP分配一个驱动(如果可用)。每个PYNQ image都是用Vivado的一个版本来验证的。每个Vivado版本在IP目录中可能有不同版本的IP。PYNQ假定Vivado设计与经PYNQ image验证的Vivado版本相匹配。其他版本的Vivado可用于创建设计,但它们不被支持,也不保证它们能够工作。
设计中的任何IP的版本应该与为之编写的驱动程序的版本相同。Overlay类可以在分配驱动程序之前检查IP版本,也可以跳过版本检查。ignore_version可以被设置为True,以强制Overlay类在分配驱动前检查IP版本。
在没有PYNQ驱动的情况下,Overlay类会给一个IP分配一个默认的驱动(DefaultIP),为该IP的地址空间提供基本的MMIO(Memory mapping I/O,内存映射I/O)读写功能。这对于不需要完整的PYNQ驱动的简单IP来说很有用,或者对于新IP的原型设计来说也很有用。
!pwd
/home/xilinx/jupyter_notebooks/workspace
1.1 实例化Overlay
实例化前面教程中创建的设计。只指定了比特流,但Overlay类也会读取相应的.hwh或.tcl文件。如果这两个文件都没有提供,Overlay类将出现错误。
from pynq import Overlaytutorial = Overlay("../../hardware/pynq_tutorial_new_hardware_files_v2_4/pynq_tutorial_new_hardware.bit")
2 Check list of IP in the design
在使用设计之前,你需要知道有哪些IP可用。你可以根据你创建的Vivado设计来确定这一点。你需要记住确切的IP名称和层次结构。对于一个简单的设计,这是直接的,但对于一个较大的设计,这就变得比较复杂了。
可以通过查询覆盖层来确定可用的IP。
tutorial?
请注意,在Vivado中使用AXI GPIO IP的按钮、开关和LED已经被分配到pynq.lib.axigpio.AxiGPIO驱动。
BRAM被分配到pynq.Overlay.DefaultIP驱动。这是因为DefaultIP提供了对IP的MMIO访问。在BRAM这个内存的情况下,只需要MMIO来读写内存位置。
Overlay的IP信息也可以从 "ip_dict "中读取。这将打印出设计中的IP的完整列表,以及各种属性。这些信息来自于与Overlay一起提供的Hardware Hand-off文件(.hwh)。
tutorial.ip_dict
{'buttons': {'fullpath': 'buttons','type': 'xilinx.com:ip:axi_gpio:2.0','bdtype': None,'state': None,'addr_range': 65536,'phys_addr': 1092616192,'mem_id': 'S_AXI','memtype': 'REGISTER','gpio': {},'interrupts': {},'parameters': {'C_FAMILY': 'zynq','C_S_AXI_ADDR_WIDTH': '9','C_S_AXI_DATA_WIDTH': '32','C_GPIO_WIDTH': '4','C_GPIO2_WIDTH': '32','C_ALL_INPUTS': '1','C_ALL_INPUTS_2': '0','C_ALL_OUTPUTS': '0','C_ALL_OUTPUTS_2': '0','C_INTERRUPT_PRESENT': '0','C_DOUT_DEFAULT': '0x00000000','C_TRI_DEFAULT': '0xFFFFFFFF','C_IS_DUAL': '0','C_DOUT_DEFAULT_2': '0x00000000','C_TRI_DEFAULT_2': '0xFFFFFFFF','Component_Name': 'pynq_tutorial_axi_gpio_0_0','USE_BOARD_FLOW': 'true','GPIO_BOARD_INTERFACE': 'btns_4bits','GPIO2_BOARD_INTERFACE': 'Custom','EDK_IPTYPE': 'PERIPHERAL','C_BASEADDR': '0x41200000','C_HIGHADDR': '0x4120FFFF'},'registers': {'GPIO_DATA': {'address_offset': 0,'size': 4,'access': 'read-write','description': 'Channel-1 AXI GPIO Data register','fields': {'Channel-1 GPIO DATA': {'bit_offset': 0,'bit_width': 4,'description': 'Channel-1 AXI GPIO Data register','access': 'read-write'}}},'GPIO_TRI': {'address_offset': 4,'size': 4,'access': 'read-write','description': 'Channel-1 AXI GPIO 3-State Control register','fields': {'Channel-1 GPIO TRI': {'bit_offset': 0,'bit_width': 4,'description': 'Channel-1 AXI GPIO 3-State Control register','access': 'read-write'}}},'GPIO2_DATA': {'address_offset': 8,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO Data register','fields': {'Channel-2 GPIO DATA': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO Data register','access': 'read-write'}}},'GPIO2_TRI': {'address_offset': 12,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO 3-State Control register','fields': {'Channel-2 GPIO TRI': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO 3-State Control register','access': 'read-write'}}},'GIER': {'address_offset': 284,'size': 32,'access': 'read-write','description': 'Global Interrupt Enable register','fields': {'Global Interrupt Enable': {'bit_offset': 31,'bit_width': 1,'description': 'Global Interrupt Enable register','access': 'read-write'}}},'IP_IER': {'address_offset': 296,'size': 32,'access': 'read-write','description': 'IP Interrupt Enable register','fields': {'Channel-1 Interrupt Enable': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'},'Channel-2 Interrupt Enable': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'}}},'IP_ISR': {'address_offset': 288,'size': 32,'access': 'read-write','description': 'IP Interrupt Status register','fields': {'Channel-1 Interrupt Status': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'},'Channel-2 Interrupt Status': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'}}}},'device': ,'driver': pynq.lib.axigpio.AxiGPIO},'switches': {'fullpath': 'switches','type': 'xilinx.com:ip:axi_gpio:2.0','bdtype': None,'state': None,'addr_range': 65536,'phys_addr': 1092681728,'mem_id': 'S_AXI','memtype': 'REGISTER','gpio': {},'interrupts': {},'parameters': {'C_FAMILY': 'zynq','C_S_AXI_ADDR_WIDTH': '9','C_S_AXI_DATA_WIDTH': '32','C_GPIO_WIDTH': '2','C_GPIO2_WIDTH': '32','C_ALL_INPUTS': '1','C_ALL_INPUTS_2': '0','C_ALL_OUTPUTS': '0','C_ALL_OUTPUTS_2': '0','C_INTERRUPT_PRESENT': '0','C_DOUT_DEFAULT': '0x00000000','C_TRI_DEFAULT': '0xFFFFFFFF','C_IS_DUAL': '0','C_DOUT_DEFAULT_2': '0x00000000','C_TRI_DEFAULT_2': '0xFFFFFFFF','Component_Name': 'pynq_tutorial_axi_gpio_0_1','USE_BOARD_FLOW': 'true','GPIO_BOARD_INTERFACE': 'sws_2bits','GPIO2_BOARD_INTERFACE': 'Custom','EDK_IPTYPE': 'PERIPHERAL','C_BASEADDR': '0x41210000','C_HIGHADDR': '0x4121FFFF'},'registers': {'GPIO_DATA': {'address_offset': 0,'size': 2,'access': 'read-write','description': 'Channel-1 AXI GPIO Data register','fields': {'Channel-1 GPIO DATA': {'bit_offset': 0,'bit_width': 2,'description': 'Channel-1 AXI GPIO Data register','access': 'read-write'}}},'GPIO_TRI': {'address_offset': 4,'size': 2,'access': 'read-write','description': 'Channel-1 AXI GPIO 3-State Control register','fields': {'Channel-1 GPIO TRI': {'bit_offset': 0,'bit_width': 2,'description': 'Channel-1 AXI GPIO 3-State Control register','access': 'read-write'}}},'GPIO2_DATA': {'address_offset': 8,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO Data register','fields': {'Channel-2 GPIO DATA': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO Data register','access': 'read-write'}}},'GPIO2_TRI': {'address_offset': 12,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO 3-State Control register','fields': {'Channel-2 GPIO TRI': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO 3-State Control register','access': 'read-write'}}},'GIER': {'address_offset': 284,'size': 32,'access': 'read-write','description': 'Global Interrupt Enable register','fields': {'Global Interrupt Enable': {'bit_offset': 31,'bit_width': 1,'description': 'Global Interrupt Enable register','access': 'read-write'}}},'IP_IER': {'address_offset': 296,'size': 32,'access': 'read-write','description': 'IP Interrupt Enable register','fields': {'Channel-1 Interrupt Enable': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'},'Channel-2 Interrupt Enable': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'}}},'IP_ISR': {'address_offset': 288,'size': 32,'access': 'read-write','description': 'IP Interrupt Status register','fields': {'Channel-1 Interrupt Status': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'},'Channel-2 Interrupt Status': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'}}}},'device': ,'driver': pynq.lib.axigpio.AxiGPIO},'leds': {'fullpath': 'leds','type': 'xilinx.com:ip:axi_gpio:2.0','bdtype': None,'state': None,'addr_range': 65536,'phys_addr': 1092747264,'mem_id': 'S_AXI','memtype': 'REGISTER','gpio': {},'interrupts': {},'parameters': {'C_FAMILY': 'zynq','C_S_AXI_ADDR_WIDTH': '9','C_S_AXI_DATA_WIDTH': '32','C_GPIO_WIDTH': '4','C_GPIO2_WIDTH': '32','C_ALL_INPUTS': '0','C_ALL_INPUTS_2': '0','C_ALL_OUTPUTS': '0','C_ALL_OUTPUTS_2': '0','C_INTERRUPT_PRESENT': '0','C_DOUT_DEFAULT': '0x00000000','C_TRI_DEFAULT': '0xFFFFFFFF','C_IS_DUAL': '0','C_DOUT_DEFAULT_2': '0x00000000','C_TRI_DEFAULT_2': '0xFFFFFFFF','Component_Name': 'pynq_tutorial_axi_gpio_0_2','USE_BOARD_FLOW': 'true','GPIO_BOARD_INTERFACE': 'leds_4bits','GPIO2_BOARD_INTERFACE': 'Custom','EDK_IPTYPE': 'PERIPHERAL','C_BASEADDR': '0x41220000','C_HIGHADDR': '0x4122FFFF'},'registers': {'GPIO_DATA': {'address_offset': 0,'size': 4,'access': 'read-write','description': 'Channel-1 AXI GPIO Data register','fields': {'Channel-1 GPIO DATA': {'bit_offset': 0,'bit_width': 4,'description': 'Channel-1 AXI GPIO Data register','access': 'read-write'}}},'GPIO_TRI': {'address_offset': 4,'size': 4,'access': 'read-write','description': 'Channel-1 AXI GPIO 3-State Control register','fields': {'Channel-1 GPIO TRI': {'bit_offset': 0,'bit_width': 4,'description': 'Channel-1 AXI GPIO 3-State Control register','access': 'read-write'}}},'GPIO2_DATA': {'address_offset': 8,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO Data register','fields': {'Channel-2 GPIO DATA': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO Data register','access': 'read-write'}}},'GPIO2_TRI': {'address_offset': 12,'size': 32,'access': 'read-write','description': 'Channel-2 AXI GPIO 3-State Control register','fields': {'Channel-2 GPIO TRI': {'bit_offset': 0,'bit_width': 32,'description': 'Channel-2 AXI GPIO 3-State Control register','access': 'read-write'}}},'GIER': {'address_offset': 284,'size': 32,'access': 'read-write','description': 'Global Interrupt Enable register','fields': {'Global Interrupt Enable': {'bit_offset': 31,'bit_width': 1,'description': 'Global Interrupt Enable register','access': 'read-write'}}},'IP_IER': {'address_offset': 296,'size': 32,'access': 'read-write','description': 'IP Interrupt Enable register','fields': {'Channel-1 Interrupt Enable': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'},'Channel-2 Interrupt Enable': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Enable register','access': 'read-write'}}},'IP_ISR': {'address_offset': 288,'size': 32,'access': 'read-write','description': 'IP Interrupt Status register','fields': {'Channel-1 Interrupt Status': {'bit_offset': 0,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'},'Channel-2 Interrupt Status': {'bit_offset': 1,'bit_width': 1,'description': 'IP Interrupt Status register','access': 'read-write'}}}},'device': ,'driver': pynq.lib.axigpio.AxiGPIO},'processing_system7_0': {'gpio': {},'interrupts': {},'parameters': {'C_EN_EMIO_PJTAG': '0','C_EN_EMIO_ENET0': '0','C_EN_EMIO_ENET1': '0','C_EN_EMIO_TRACE': '0','C_INCLUDE_TRACE_BUFFER': '0','C_TRACE_BUFFER_FIFO_SIZE': '128','USE_TRACE_DATA_EDGE_DETECTOR': '0','C_TRACE_PIPELINE_WIDTH': '8','C_TRACE_BUFFER_CLOCK_DELAY': '12','C_EMIO_GPIO_WIDTH': '64','C_INCLUDE_ACP_TRANS_CHECK': '0','C_USE_DEFAULT_ACP_USER_VAL': '0','C_S_AXI_ACP_ARUSER_VAL': '31','C_S_AXI_ACP_AWUSER_VAL': '31','C_M_AXI_GP0_ID_WIDTH': '12','C_M_AXI_GP0_ENABLE_STATIC_REMAP': '0','C_M_AXI_GP1_ID_WIDTH': '12','C_M_AXI_GP1_ENABLE_STATIC_REMAP': '0','C_S_AXI_GP0_ID_WIDTH': '6','C_S_AXI_GP1_ID_WIDTH': '6','C_S_AXI_ACP_ID_WIDTH': '3','C_S_AXI_HP0_ID_WIDTH': '6','C_S_AXI_HP0_DATA_WIDTH': '64','C_S_AXI_HP1_ID_WIDTH': '6','C_S_AXI_HP1_DATA_WIDTH': '64','C_S_AXI_HP2_ID_WIDTH': '6','C_S_AXI_HP2_DATA_WIDTH': '64','C_S_AXI_HP3_ID_WIDTH': '6','C_S_AXI_HP3_DATA_WIDTH': '64','C_M_AXI_GP0_THREAD_ID_WIDTH': '12','C_M_AXI_GP1_THREAD_ID_WIDTH': '12','C_NUM_F2P_INTR_INPUTS': '1','C_IRQ_F2P_MODE': 'DIRECT','C_DQ_WIDTH': '32','C_DQS_WIDTH': '4','C_DM_WIDTH': '4','C_MIO_PRIMITIVE': '54','C_TRACE_INTERNAL_WIDTH': '2','C_USE_AXI_NONSECURE': '0','C_USE_M_AXI_GP0': '1','C_USE_M_AXI_GP1': '0','C_USE_S_AXI_GP0': '0','C_USE_S_AXI_GP1': '0','C_USE_S_AXI_HP0': '0','C_USE_S_AXI_HP1': '0','C_USE_S_AXI_HP2': '0','C_USE_S_AXI_HP3': '0','C_USE_S_AXI_ACP': '0','C_PS7_SI_REV': 'PRODUCTION','C_FCLK_CLK0_BUF': 'TRUE','C_FCLK_CLK1_BUF': 'FALSE','C_FCLK_CLK2_BUF': 'FALSE','C_FCLK_CLK3_BUF': 'FALSE','C_PACKAGE_NAME': 'clg400','C_GP0_EN_MODIFIABLE_TXN': '1','C_GP1_EN_MODIFIABLE_TXN': '1','PCW_DDR_RAM_BASEADDR': '0x00100000','PCW_DDR_RAM_HIGHADDR': '0x1FFFFFFF','PCW_UART0_BASEADDR': '0xE0000000','PCW_UART0_HIGHADDR': '0xE0000FFF','PCW_UART1_BASEADDR': '0xE0001000','PCW_UART1_HIGHADDR': '0xE0001FFF','PCW_I2C0_BASEADDR': '0xE0004000','PCW_I2C0_HIGHADDR': '0xE0004FFF','PCW_I2C1_BASEADDR': '0xE0005000','PCW_I2C1_HIGHADDR': '0xE0005FFF','PCW_SPI0_BASEADDR': '0xE0006000','PCW_SPI0_HIGHADDR': '0xE0006FFF','PCW_SPI1_BASEADDR': '0xE0007000','PCW_SPI1_HIGHADDR': '0xE0007FFF','PCW_CAN0_BASEADDR': '0xE0008000','PCW_CAN0_HIGHADDR': '0xE0008FFF','PCW_CAN1_BASEADDR': '0xE0009000','PCW_CAN1_HIGHADDR': '0xE0009FFF','PCW_GPIO_BASEADDR': '0xE000A000','PCW_GPIO_HIGHADDR': '0xE000AFFF','PCW_ENET0_BASEADDR': '0xE000B000','PCW_ENET0_HIGHADDR': '0xE000BFFF','PCW_ENET1_BASEADDR': '0xE000C000','PCW_ENET1_HIGHADDR': '0xE000CFFF','PCW_SDIO0_BASEADDR': '0xE0100000','PCW_SDIO0_HIGHADDR': '0xE0100FFF','PCW_SDIO1_BASEADDR': '0xE0101000','PCW_SDIO1_HIGHADDR': '0xE0101FFF','PCW_USB0_BASEADDR': '0xE0102000','PCW_USB0_HIGHADDR': '0xE0102fff','PCW_USB1_BASEADDR': '0xE0103000','PCW_USB1_HIGHADDR': '0xE0103fff','PCW_TTC0_BASEADDR': '0xE0104000','PCW_TTC0_HIGHADDR': '0xE0104fff','PCW_TTC1_BASEADDR': '0xE0105000','PCW_TTC1_HIGHADDR': '0xE0105fff','PCW_FCLK_CLK0_BUF': 'TRUE','PCW_FCLK_CLK1_BUF': 'FALSE','PCW_FCLK_CLK2_BUF': 'FALSE','PCW_FCLK_CLK3_BUF': 'FALSE','PCW_UIPARAM_DDR_FREQ_MHZ': '525','PCW_UIPARAM_DDR_BANK_ADDR_COUNT': '3','PCW_UIPARAM_DDR_ROW_ADDR_COUNT': '15','PCW_UIPARAM_DDR_COL_ADDR_COUNT': '10','PCW_UIPARAM_DDR_CL': '7','PCW_UIPARAM_DDR_CWL': '6','PCW_UIPARAM_DDR_T_RCD': '7','PCW_UIPARAM_DDR_T_RP': '7','PCW_UIPARAM_DDR_T_RC': '48.91','PCW_UIPARAM_DDR_T_RAS_MIN': '35.0','PCW_UIPARAM_DDR_T_FAW': '40.0','PCW_UIPARAM_DDR_AL': '0','PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0': '-0.051','PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1': '-0.006','PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2': '-0.009','PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3': '-0.033','PCW_UIPARAM_DDR_BOARD_DELAY0': '0.279','PCW_UIPARAM_DDR_BOARD_DELAY1': '0.260','PCW_UIPARAM_DDR_BOARD_DELAY2': '0.085','PCW_UIPARAM_DDR_BOARD_DELAY3': '0.092','PCW_UIPARAM_DDR_DQS_0_LENGTH_MM': '32.14','PCW_UIPARAM_DDR_DQS_1_LENGTH_MM': '31.12','PCW_UIPARAM_DDR_DQS_2_LENGTH_MM': '0','PCW_UIPARAM_DDR_DQS_3_LENGTH_MM': '0','PCW_UIPARAM_DDR_DQ_0_LENGTH_MM': '32.2','PCW_UIPARAM_DDR_DQ_1_LENGTH_MM': '31.08','PCW_UIPARAM_DDR_DQ_2_LENGTH_MM': '0','PCW_UIPARAM_DDR_DQ_3_LENGTH_MM': '0','PCW_UIPARAM_DDR_CLOCK_0_LENGTH_MM': '27.95','PCW_UIPARAM_DDR_CLOCK_1_LENGTH_MM': '27.95','PCW_UIPARAM_DDR_CLOCK_2_LENGTH_MM': '0','PCW_UIPARAM_DDR_CLOCK_3_LENGTH_MM': '0','PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH': '105.056','PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH': '66.904','PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH': '89.1715','PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH': '113.63','PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH': '98.503','PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH': '68.5855','PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH': '90.295','PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH': '103.977','PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH': '80.4535','PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH': '80.4535','PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH': '80.4535','PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH': '80.4535','PCW_UIPARAM_DDR_DQS_0_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQS_1_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQS_2_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQS_3_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQ_0_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQ_1_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQ_2_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_DQ_3_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_CLOCK_0_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_CLOCK_1_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_CLOCK_2_PROPOGATION_DELAY': '160','PCW_UIPARAM_DDR_CLOCK_3_PROPOGATION_DELAY': '160','PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0': '-0.051','PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1': '-0.006','PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2': '-0.009','PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3': '-0.033','PCW_PACKAGE_DDR_BOARD_DELAY0': '0.279','PCW_PACKAGE_DDR_BOARD_DELAY1': '0.260','PCW_PACKAGE_DDR_BOARD_DELAY2': '0.085','PCW_PACKAGE_DDR_BOARD_DELAY3': '0.092','PCW_CPU_CPU_6X4X_MAX_RANGE': '667','PCW_CRYSTAL_PERIPHERAL_FREQMHZ': '50','PCW_APU_PERIPHERAL_FREQMHZ': '650','PCW_DCI_PERIPHERAL_FREQMHZ': '10.159','PCW_QSPI_PERIPHERAL_FREQMHZ': '200','PCW_SMC_PERIPHERAL_FREQMHZ': '100','PCW_USB0_PERIPHERAL_FREQMHZ': '60','PCW_USB1_PERIPHERAL_FREQMHZ': '60','PCW_SDIO_PERIPHERAL_FREQMHZ': '50','PCW_UART_PERIPHERAL_FREQMHZ': '100','PCW_SPI_PERIPHERAL_FREQMHZ': '166.666666','PCW_CAN_PERIPHERAL_FREQMHZ': '100','PCW_CAN0_PERIPHERAL_FREQMHZ': '-1','PCW_CAN1_PERIPHERAL_FREQMHZ': '-1','PCW_I2C_PERIPHERAL_FREQMHZ': '25','PCW_WDT_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC_PERIPHERAL_FREQMHZ': '50','PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ': '133.333333','PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ': '133.333333','PCW_PCAP_PERIPHERAL_FREQMHZ': '200','PCW_TPIU_PERIPHERAL_FREQMHZ': '200','PCW_FPGA0_PERIPHERAL_FREQMHZ': '100','PCW_FPGA1_PERIPHERAL_FREQMHZ': '50','PCW_FPGA2_PERIPHERAL_FREQMHZ': '50','PCW_FPGA3_PERIPHERAL_FREQMHZ': '50','PCW_ACT_APU_PERIPHERAL_FREQMHZ': '650.000000','PCW_UIPARAM_ACT_DDR_FREQ_MHZ': '525.000000','PCW_ACT_DCI_PERIPHERAL_FREQMHZ': '10.096154','PCW_ACT_QSPI_PERIPHERAL_FREQMHZ': '200.000000','PCW_ACT_SMC_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_ENET0_PERIPHERAL_FREQMHZ': '125.000000','PCW_ACT_ENET1_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_USB0_PERIPHERAL_FREQMHZ': '60','PCW_ACT_USB1_PERIPHERAL_FREQMHZ': '60','PCW_ACT_SDIO_PERIPHERAL_FREQMHZ': '50.000000','PCW_ACT_UART_PERIPHERAL_FREQMHZ': '100.000000','PCW_ACT_SPI_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_CAN_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_CAN0_PERIPHERAL_FREQMHZ': '23.8095','PCW_ACT_CAN1_PERIPHERAL_FREQMHZ': '23.8095','PCW_ACT_I2C_PERIPHERAL_FREQMHZ': '50','PCW_ACT_WDT_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC_PERIPHERAL_FREQMHZ': '50','PCW_ACT_PCAP_PERIPHERAL_FREQMHZ': '200.000000','PCW_ACT_TPIU_PERIPHERAL_FREQMHZ': '200.000000','PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ': '100.000000','PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ': '10.000000','PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ': '108.333336','PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ': '108.333336','PCW_CLK0_FREQ': '100000000','PCW_CLK1_FREQ': '10000000','PCW_CLK2_FREQ': '10000000','PCW_CLK3_FREQ': '10000000','PCW_OVERRIDE_BASIC_CLOCK': '0','PCW_CPU_PERIPHERAL_DIVISOR0': '2','PCW_DDR_PERIPHERAL_DIVISOR0': '2','PCW_SMC_PERIPHERAL_DIVISOR0': '1','PCW_QSPI_PERIPHERAL_DIVISOR0': '5','PCW_SDIO_PERIPHERAL_DIVISOR0': '20','PCW_UART_PERIPHERAL_DIVISOR0': '10','PCW_SPI_PERIPHERAL_DIVISOR0': '1','PCW_CAN_PERIPHERAL_DIVISOR0': '1','PCW_CAN_PERIPHERAL_DIVISOR1': '1','PCW_FCLK0_PERIPHERAL_DIVISOR0': '5','PCW_FCLK1_PERIPHERAL_DIVISOR0': '1','PCW_FCLK2_PERIPHERAL_DIVISOR0': '1','PCW_FCLK3_PERIPHERAL_DIVISOR0': '1','PCW_FCLK0_PERIPHERAL_DIVISOR1': '2','PCW_FCLK1_PERIPHERAL_DIVISOR1': '1','PCW_FCLK2_PERIPHERAL_DIVISOR1': '1','PCW_FCLK3_PERIPHERAL_DIVISOR1': '1','PCW_ENET0_PERIPHERAL_DIVISOR0': '8','PCW_ENET1_PERIPHERAL_DIVISOR0': '1','PCW_ENET0_PERIPHERAL_DIVISOR1': '1','PCW_ENET1_PERIPHERAL_DIVISOR1': '1','PCW_TPIU_PERIPHERAL_DIVISOR0': '1','PCW_DCI_PERIPHERAL_DIVISOR0': '52','PCW_DCI_PERIPHERAL_DIVISOR1': '2','PCW_PCAP_PERIPHERAL_DIVISOR0': '5','PCW_TTC0_CLK0_PERIPHERAL_DIVISOR0': '1','PCW_TTC0_CLK1_PERIPHERAL_DIVISOR0': '1','PCW_TTC0_CLK2_PERIPHERAL_DIVISOR0': '1','PCW_TTC1_CLK0_PERIPHERAL_DIVISOR0': '1','PCW_TTC1_CLK1_PERIPHERAL_DIVISOR0': '1','PCW_TTC1_CLK2_PERIPHERAL_DIVISOR0': '1','PCW_WDT_PERIPHERAL_DIVISOR0': '1','PCW_ARMPLL_CTRL_FBDIV': '26','PCW_IOPLL_CTRL_FBDIV': '20','PCW_DDRPLL_CTRL_FBDIV': '21','PCW_CPU_CPU_PLL_FREQMHZ': '1300.000','PCW_IO_IO_PLL_FREQMHZ': '1000.000','PCW_DDR_DDR_PLL_FREQMHZ': '1050.000','PCW_SMC_PERIPHERAL_VALID': '0','PCW_SDIO_PERIPHERAL_VALID': '1','PCW_SPI_PERIPHERAL_VALID': '0','PCW_CAN_PERIPHERAL_VALID': '0','PCW_UART_PERIPHERAL_VALID': '1','PCW_EN_EMIO_CAN0': '0','PCW_EN_EMIO_CAN1': '0','PCW_EN_EMIO_ENET0': '0','PCW_EN_EMIO_ENET1': '0','PCW_EN_PTP_ENET0': '0','PCW_EN_PTP_ENET1': '0','PCW_EN_EMIO_GPIO': '0','PCW_EN_EMIO_I2C0': '0','PCW_EN_EMIO_I2C1': '0','PCW_EN_EMIO_PJTAG': '0','PCW_EN_EMIO_SDIO0': '0','PCW_EN_EMIO_CD_SDIO0': '0','PCW_EN_EMIO_WP_SDIO0': '0','PCW_EN_EMIO_SDIO1': '0','PCW_EN_EMIO_CD_SDIO1': '0','PCW_EN_EMIO_WP_SDIO1': '0','PCW_EN_EMIO_SPI0': '0','PCW_EN_EMIO_SPI1': '0','PCW_EN_EMIO_UART0': '0','PCW_EN_EMIO_UART1': '0','PCW_EN_EMIO_MODEM_UART0': '0','PCW_EN_EMIO_MODEM_UART1': '0','PCW_EN_EMIO_TTC0': '0','PCW_EN_EMIO_TTC1': '0','PCW_EN_EMIO_WDT': '0','PCW_EN_EMIO_TRACE': '0','PCW_USE_AXI_NONSECURE': '0','PCW_USE_M_AXI_GP0': '1','PCW_USE_M_AXI_GP1': '0','PCW_USE_S_AXI_GP0': '0','PCW_USE_S_AXI_GP1': '0','PCW_USE_S_AXI_ACP': '0','PCW_USE_S_AXI_HP0': '0','PCW_USE_S_AXI_HP1': '0','PCW_USE_S_AXI_HP2': '0','PCW_USE_S_AXI_HP3': '0','PCW_M_AXI_GP0_FREQMHZ': '10','PCW_M_AXI_GP1_FREQMHZ': '10','PCW_S_AXI_GP0_FREQMHZ': '10','PCW_S_AXI_GP1_FREQMHZ': '10','PCW_S_AXI_ACP_FREQMHZ': '10','PCW_S_AXI_HP0_FREQMHZ': '10','PCW_S_AXI_HP1_FREQMHZ': '10','PCW_S_AXI_HP2_FREQMHZ': '10','PCW_S_AXI_HP3_FREQMHZ': '10','PCW_USE_DMA0': '0','PCW_USE_DMA1': '0','PCW_USE_DMA2': '0','PCW_USE_DMA3': '0','PCW_USE_TRACE': '0','PCW_TRACE_PIPELINE_WIDTH': '8','PCW_INCLUDE_TRACE_BUFFER': '0','PCW_TRACE_BUFFER_FIFO_SIZE': '128','PCW_USE_TRACE_DATA_EDGE_DETECTOR': '0','PCW_TRACE_BUFFER_CLOCK_DELAY': '12','PCW_USE_CROSS_TRIGGER': '0','PCW_FTM_CTI_IN0': '
现在,我们只需要知道我们设计中的IP名称。可以通过ip_dict.keys()来找到这些名字。
tutorial.ip_dict.keys()
dict_keys(['buttons', 'switches', 'leds', 'processing_system7_0'])
3 设置IP的handle
一旦你知道了IP名称,和分层路径,你就可以设置更方便的handle。
bram = tutorial.bram
buttons = tutorial.buttons
switches = tutorial.switches
leds = tutorial.leds
4 从按钮和开关中读取
一个AXI GPIO IP可以连接到输入或输出引脚,并支持多达两个通道,最高可达32位。AXI GPIO驱动有read()和write()功能,用于基本的MMIO功能。两个通道中的每一个也可以被读取或写入。在以前的设计中,每个AXI GPIO只连接了一组引脚,即只使用了一个通道。现在,我们将做简单的读取,这将默认为第一个通道。
下面的代码将从开发板上的按钮中读取一个值并打印结果。下面的单元格可以在按下不同的按钮的情况下多次重复运行,以看到不同的结果。
buttons_value = buttons.read()
print("Buttons value is: " + str(buttons_value))
print(type(buttons_value))
buttons_value
Buttons value is: 6
6
这两个拨码开关可以以类似的方式使用。
switches_value = switches.read()
print("Switches value is: " + str(switches_value))
Switches value is: 1
5 使用LED
开关和按钮是输入。如前所述,AXI GPIO可以用来连接到输入或输出。在读取或写入一个双向引脚之前,需要配置方向。
- 在按钮和开关是输入的情况下,AXI GPIO默认被配置为启用输入。
- 在使用LED之前,AXI GPIO需要被配置成使FPGA引脚为输出。这可以通过向LED或AXI GPIO寄存器的偏移量0x4处写入数值0x0来完成。一个 "0 "可以使单个引脚作为输入,一个 "1 "可以使其作为输出。写0x0可以使所有4个LED引脚作为输出,写0xf(二进制1111)将使4个引脚作为输入。
现在将0xf写到偏移量0x4的寄存器中,将LED配置为输出。
outputMask = 0x0
tristateRegisterOffset = 0x4leds.write(tristateRegisterOffset, outputMask)
6 给LED写值
一旦引脚被启用,就可以向AXI GPIO控制器写入一个值。对于通道1,偏移量为0的寄存器被连接到LEDs。
dataRegisterOffset = 0x0
led_pattern = 0xaleds.write(dataRegisterOffset, led_pattern)
7 综合利用上述内容
下面的代码将把按钮的值写到LED上,而开关是 "关闭 "的。在运行电池之前,确保拨码开关处于 "关闭 "位置。
按下一个按钮应该导致相应的LED灯打开。
while(not switches.read()):leds.write(dataRegisterOffset, buttons.read())
BRAM和使用AXI GPIO的更高级方法将在另一个教程中介绍。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
