创建 Pynq Overlay

本文使用环境: 

Xilinx Design Tools Vitis Unified Software Platform 2021.1 (version 2021.1.1)

Pynq 2.6.1

Arty Z7

参考:

定制PYNQ的overlay_bramblewalls的博客-CSDN博客https://blog.csdn.net/bramblewalls/article/details/80045922

如何自定义一个Digilent PYNQ-Z1 Overlay_哔哩哔哩_bilibilihttps://www.bilibili.com/video/av837866431/

Overlay Design Methodology — Python productivity for Zynq (Pynq)https://pynq.readthedocs.io/en/v2.6.1/overlay_design_methodology.html

  1. 打开 Xilinx Vitis HLS 2021.1,Create Project 或 File->New Project...

    Project name: hls_adder

    Top Function: hls_adder

    Solution Configuration->Part Selection: xc7z020clg400-1

    Explorer->hls_adder->Source,右键 New File...,选择之前创建好的 hls_adder.cpp
    void hls_adder(int a, int b, int& c) {
    #pragma HLS INTERFACE ap_ctrl_none port=return
    #pragma HLS INTERFACE s_axilite port=a
    #pragma HLS INTERFACE s_axilite port=b
    #pragma HLS INTERFACE s_axilite port=c
    
        c = a + b;
    }
    
    Project->Index C Source,Run C Synthesis

    Solution->Export RTL
  2. 打开 Xilinx Vivado 2021.1,File->Project->New... 或 Quick Start->Create Project
    git clone git@github.com:cathalmccabe/pynq-z1_board_files.git
    将 pynq-z1.zip 复制到 F:\Xilinx\Vivado\2021.1\data\boards\board_files 解压或直接复制 pynq-z1 文件夹。

    Create Block Design

    Add IP (Ctrl+I),添加 ZYNQ7 Processing System,Run Block Automation。
    Tools->Settings...->Project Settings->IP->Repository->IP Repositories->Add,选择之前创建的 Vitis HLS 项目 hls_adder/solution1/impl/ip,否则后续会提示 Duplicate IP。

    在 Block Design - pynq_hls_adder 的 Diagram 窗口中 Add IP (Ctrl+I),添加 Hls_adder,选中 hls_adder_0,在 Block Properties 中 Name 改为 scalar_add。Run Connection Automation。Renerate Layout。保存。
    在 Sources 选项卡中展开 Design Sources (1),右键 pynq_hls_adder (pynq_hls_adder.bd) (3),Create HDL Wrapper... Let Vivado manage wrapper and auto-update

    Flow Navigator->PROGRAM AND DEBUG->Generate Bitstream。
    Open Block Design,File->Export...->Export Block Design...
  3. 启动 Arty Z7 开发板,设置网络连接, 等待 LD0 ~ LD5 闪烁后 LD0 ~ LD3 亮起,LD8、LD9 闪烁,打开浏览器访问 pynq:9090,输入密码登录,打开 Jupyter Notebook 界面,上传位于 pynq_hls_adder 文件夹下的 pynq_hls_adder.tcl 和 pynq_hls_adder\pynq_hls_adder.runs\impl_1 下的 pynq_hls_adder_wrapper.bit 重命名为 pynq_hls_adder.bit 以及 pynq_hls_adder\pynq_hls_adder.gen\sources_1\bd\pynq_hls_adder\hw_handoff 下的 pynq_hls_adder.hwh。或者也可以在文件资源管理器中输入 \\pynq,登录

    即可访问 pynq。注意:如果直接在文件资源管理器中创建文件夹可能会失败,提示目标文件夹访问被拒绝

    这时需要在 Jupyter Notebook 新建一个 Terminal 通过命令行来新建目录。
  4. 新建一个 Jupyter Notebook,运行
    from pynq import Overlay
    overlay = Overlay('/home/xilinx/pynq/overlays/adder/pynq_adder.bit')
    注意:如果之前没有同时拷贝 HWH 文件会报错:
    /usr/local/lib/python3.6/dist-packages/pynq/pl_server/device.py:641: UserWarning: Users will not get PARAMETERS / REGISTERS information through TCL files. HWH file is recommended.
      warnings.warn(message, UserWarning)
    

     接下来参考文档中的代码执行即可。

    overlay?
    add_ip = overlay.scalar_add
    add_ip?
    add_ip.register_map
    add_ip.register_map.a = 3
    add_ip.register_map.b = 4
    add_ip.register_map.c
    add_ip.write(0x10, 4)
    add_ip.write(0x18, 5)
    add_ip.read(0x20)
  5. 创建驱动:

    from pynq import DefaultIP
    
    class AddDriver(DefaultIP):
        def __init__(self, description):
            super().__init__(description=description)
    
        bindto = ['xilinx.com:hls:hls_adder:1.0']
    
        def add(self, a, b):
            self.write(0x10, a)
            self.write(0x18, b)
            return self.read(0x20)

    这一步 Overlay Tutorial 没有解释清楚 binto 后面的内容,bindto 的解释在 Python Overlay API — Python productivity for Zynq (Pynq)https://pynq.readthedocs.io/en/v2.6.1/overlay_design_methodology/python_overlay_api.html#creating-ip-drivers打开 Vivado 之前创建的项目 pynq_hls_adder,Flow Navigator->PROJECT MANAGER->IP Catalog 窗口中 Interfaces 选项卡,右键 User Repository->Properties... (Ctrl+E),在 Repository Properties 中底部选择 IPs 选项卡,点击 Hls_adder,右侧 Details 显示 VLNV: xilinx.com:hls:hls_adder:1.0,这与 Tutorial 中默认的不同。

    如果没有改 bindto,会导致运行 AddDriver 并重载 overlay 后 overlay 中 IP Blocks scalar_add 仍然是 pynq.overlay.DefaultIP 而不是 __main__.AddDriver,之后的 overlay.scalar_add.add(15,20) 也会报错 AttributeError: ‘DefaultIP’ object has no attribute ‘add’ (参见 Overlay Tutorial AddDriver doesn't work - Support - PYNQ)。接下来执行

    overlay = Overlay('/home/xilinx/pynq/overlays/adder/pynq_adder.bit')
    overlay?
    overlay.scalar_add.add(15,20)

    即可。

### 创建和配置自定义 PWM Overlay 为了在 PYNQ创建并配置自定义 PWM (脉宽调制) overlay,需要遵循一系列特定的操作流程。此过程涉及硬件设计以及软件层面的集成。 #### 硬件设计阶段 1. **Vivado项目建立** 使用Xilinx Vivado工具新建一个工程,在该工程项目中加入Zynq处理器系统IP核,并按照需求设置其参数。对于PWM功能实现来说,通常会利用AXI Timer IP或者自行编写RTL级PWM模块[^1]。 2. **连接信号线** 将所选定时器或自定义PWM模块实例化到顶层文件里,并通过约束文件指定外部引脚位置以便于后续测试验证。确保这些资源被正确映射至PYNQ开发板上的物理管脚上[^4]。 3. **生成Bitstream与TCL封装** 完成上述步骤之后编译整个工程得到bit流文件(.bit),同时还需要准备相应的tcl脚本用于描述overlay结构信息。这一步骤至关重要因为它决定了最终能否顺利加载overlay到目标设备当中去[^5]。 #### 软件环境搭建 - 在Jupyter Notebook环境中安装必要的库函数支持,比如`pynq`包版本应保持最新状态以获得更好的兼容性和性能表现。 ```bash pip install --upgrade pynq ``` #### 加载Overlay并与Python交互 一旦完成了硬件部分的设计工作,则可以在运行Linux系统的ARM Cortex-A9内核之上执行如下命令来初始化overlay对象: ```python from pynq import Overlay overlay = Overlay('path_to_your_bit_file/pwm_overlay.bit') ``` 这里假设已经把之前提到过的`.bit`文件放置到了合适的位置(`path_to_your_bit_file`)下。接下来就可以借助提供的API接口轻松操控底层硬件资源了,例如调整占空比、频率等属性值[^2]。 #### 实际应用案例展示 下面给出一段简单的代码片段用来说明怎样操作已有的PWM通道: ```python import time from pynq.lib.pmod import PMOD_PWM # 假设我们有一个位于PMODA口上的PWM控制器 pwm_pin = 'D0' # 或者其他有效的GPIO编号 frequency_hz = 1e3 # 设置为1kHz duty_cycle_percent = 50 # 占空比设定为一半周期高电平 with PMOD_PWM(overlay.PMODA, pwm_pin) as pwm: pwm.generate(frequency_hz=frequency_hz, duty_cycle=duty_cycle_percent) try: while True: pass # 只要程序持续运行就会一直维持当前PWM输出模式 except KeyboardInterrupt: print("停止PWM...") finally: pwm.stop() # 清理释放相关资源 ``` 这段示例展示了如何启动一个固定频率和占空比的PWM波形发生器,并且能够在遇到异常情况时安全退出循环体从而关闭所有活动组件防止意外损坏硬件设施[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值