将自定义 IP (HDL)添加到 Vivado 模块设计(Block Design)

文章介绍了如何在Vivado中通过BlockDesign解决项目继承性问题,并详细阐述了一种简便的方法将自定义RTL模块(如D_flipflop)添加到设计中,涉及添加设计源、创建BlockDesign、添加IP模块以及AXI总线的连接等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绪论

        使用Vivado Block Design设计解决了项目继承性问题,但是还有个问题,不知道大家有没有遇到,就是新设计的自定义 RTL 文件无法快速的添加到Block Design中,一种方式是通过自定义IP,但是一旦设计的文件有问题就需要重新修改,同时需要控制接口时候还需要在AXI总线模板基础上进行修改,再同时繁琐的步骤也让人“望而却步”。下面介绍一种简单的方式。

        我目前使用的是 Vivado 2019.1、2020.2,但据我所知,此功能几乎适用于 Vivado 的所有版本(如果不正确,请随时在后台更正)。

创建 Vivado 项目

        为了开始这个例子,我创建了一个基于 Zynq 的新 Vivado 项目(这只是我的例子,但这个项目的内容并不特定于任何特定的 FPGA 开发板),同时这个项目中包括一个通过AXI-Lite控制的自定义RTL。

添加设计文件并编写自定义 RTL

        不用于仿真目的的自定义 RTL(即测试文件)都被视为 Vivado 中的设计源。使用 Flow Navigator 中的Add Sources选项并选择Add or create design sources ,然后单击 Next。

        我们创建一个名为D_flipflop的新文件并添加了以下逻辑:

module D_flipflop(
    input clk,
    input reset,
    input d_in,
    output reg q_out
    );
    
    always @ (posedge clk)
        begin
            if (reset == 1'b1)
                begin
                    q_out <= 1'b0;
                end
            else 
                begin
                    q_out <= d_in;
                end
        end
endmodule

创建Block Design

        使用 Flow Navigator 窗口中的Create Block Design选项,将新的Block Design添加到项目中。

        将 Zynq 处理系统 IP 块添加到设计中,并运行自动设置或者自动连线。

将 RTL 模块添加到Block Design

        要添加我们在上一步中创建的 D 触发器的 RTL 模块,右键单击 Diagram 窗口空白处的任意位置,然后选择Add Module...选项。

        Vivado 将自动显示它在当前项目中找到的所有有效 RTL 模块。由于写入或导入到当前项目中的模块是我们刚刚设计的 D 触发器,因此它是本例中的唯一选项。

        为了给触发器提供源,我添加了一个 AXI GPIO IP ,其中第一个通道作为输出,第二个通道作为输入。自动连接即可。

        为 AXI GPIO 模块运行自动连接后,将输出 GPIO 通道连接到触发器的 d_in,将触发器的 q_out 连接到输入 GPIO 通道。

        全部连接好后,点击那个勾勾进行验证。

        Block Design完成后,为Block Design生成顶层文件。

        完成后可以看下整个项目的文件层次结构。

        就是这样,OVER~

### Block Design 的概念与实现 #### 定义与背景 Block Design 是一种系统设计模式,通常用于解决复杂系统的模块化问题。它通过将整个系统划分为多个独立的功能块(Blocks),使得每个功能块可以单独开发、测试和维护[^1]。这种划分方式不仅提高了系统的可扩展性和灵活性,还降低了整体架构的复杂度。 #### 功能设计Block Design 中,每个 block 被视为一个子系统,具有明确的输入输出接口以及内部逻辑处理能力。这些 blocks 可以相互连接形成更大的系统结构。为了确保各个 blocks 之间的交互顺畅,需要定义清晰的协议和数据交换标准[^2]。 #### 架构设计 从架构角度来看,Block Design 遵循分层原则,即将不同类型的 blocks 组织成层次化的形式。例如,在软件工程领域中常见的三层架构——表示层、业务逻辑层和服务访问层都可以看作是基于 block 设计理念构建起来的结果之一。 以下是使用 Python 实现的一个简单例子来展示如何创建两个基本 Blocks 并让它们互相通信: ```python class InputBlock: def process(self, data): print("Processing input:", data) return f"Processed {data}" class OutputBlock: def send(self, message): print("Sending output:", message) def main(): input_block = InputBlock() output_block = OutputBlock() raw_data = "example" processed_data = input_block.process(raw_data) output_block.send(processed_data) if __name__ == "__main__": main() ``` 此代码片段展示了最基础版本中的两部分:`InputBlock`负责接收并初步处理外部传入的数据;而 `OutputBlock` 则专注于向外界发送最终结果。两者之间不存在任何直接依赖关系,体现了良好分离关注点的原则[^3]。 #### 系统接口与互动 当涉及到更复杂的实际应用场景时,则可能还需要考虑更多方面比如错误管理机制等。如果某个特定 block 出现了不可恢复性的严重状况(如内存分配失败),那么整个流程可能会中断或者采取相应的补救措施继续执行下去[^5]。 另外值得注意的是,在某些情况下我们也许会希望我们的block能够具备一定的自我学习调整的能力以便更好地适应未来可能出现的新需求变化趋势。这方面的探索目前也正在成为研究热点之一[^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值