【问题标题】:VHDL conditional generation from makefile从 makefile 生成 VHDL 条件
【发布时间】:2010-03-04 20:04:59
【问题描述】:

我的 vhdl 设计需要适应不同的变体。 能够从 makefile 生成配置会很好。用于生成一个项目的 makefile 已准备就绪并可以正常工作。

我想避免为不同的项目使用不同的非常相似的文件。 项目之间的唯一区别是某处的几行,其中一个包含一堆 vhdl 文件(和组件),另一个不需要。

例如,我想避免使用两个不同的顶级 vhd 文件。相反,我想在顶部文件中使用条件来包含(或不包含)其他 vhdl 文件和组件,具体取决于项目。

您对如何执行此操作有任何建议吗?

我尝试使用外部预编译器 (gcc) 但无法使其工作。此外,我真的不想强迫其他开发人员安装 gcc,或者在 Xilinx IDE 中无法使用 vhdl 文件。


编辑:添加示例

我有两个产品,A 和 B。我想为这两个产品使用相同的文件,并带有条件来排除产品 B 的某些部件,为不同的硬件部件生成配置,当然还有其他东西。

我想从命令行生成配置: make product_Amake product_B

如果我在我的 vhdl 中放入 generates 以根据目标包含/排除代码,那么 xst 需要知道正在构建什么目标。问题是如何将当前目标从 makefile 传递给 xst。

在使用 gcc 编译的 C 代码中,我会放入源代码:

#if defined(product_B)
    ...
#elsif defined(product_A)
    ...
#endif

,然后在makefile中设置define:

product_A: source.c
    gcc -Dproduct_A source.c

product_B: source.c
    gcc -Dproduct_B source.c

【问题讨论】:

    标签: makefile conditional vhdl xilinx


    【解决方案1】:

    您是否考虑过使用 vhdl GENERATE 语句并将其包装在您希望可配置的逻辑周围。

    name : FOR N IN 1 TO 8 GENERATE
    
      concurrent statements here
    
    END GENERATE name;
    

    然后,如果您将一些配置泛型添加到顶级文件,您可以控制生成器的运行方式。

    编辑

    您可以在 XST 的命令行中使用以下命令设置 GENERICS:

    -泛型 {name=value name=value}

    仅从 9.1 开始添加对此的支持。

    【讨论】:

    • 看起来很有趣:“泛型 (-generics) 允许您重新定义在顶层设计块中定义的泛型 (VHDL) 或参数 (Verilog) 值。这允许您轻松修改设计配置无需任何硬件描述语言 (HDL) 源代码修改”我会尝试并让您知道它是如何进行的。
    • 我正在尝试类似的东西,并且很好奇你是否能做到这一点?我能够让它生成我需要的不同数量的组件,但我无法使用这种技术让它完全删除一个组件。你有没有找到一种方法让它做这样的事情?谢谢!
    【解决方案2】:

    你有几个选择:

    1. 尽量不要有不同的文件,而是在一个文件中实现所有不同的版本。 这是迄今为止最可靠的方法。 VHDL 有一些有用的结构可以帮助您解决这个问题:泛型、generate 语句、包、配置等等。
    2. 使用外部宏预处理器拥有 VHDL 文件“模板”。一些强化的 Unixoid 使用古老的 m4 工具。我会采取不同的方式,并使用像 Python 这样的成熟编程语言和一些模板库。然后,您可以轻松地将这些模板生成的真实 VHDL 文件合并到您的 makefile 中。

    无论如何,请先尝试使用选项 (1)。差异可能没有你想象的那么严重。

    【讨论】:

    • 是的,选项一感觉最好。简单就好。但是如何在不修改文件的情况下更改条件的值(例如在生成语句中)?通常,从 makefile 中?
    • @Gauthier:我不确定您是否知道 makefile 的用途。 Makefile 通常用于按特定顺序运行工具和命令序列。为什么需要从外部更改生成语句中的条件值?生成语句旨在根据预设条件选择各种状态。也许您应该确切地解释更多(编辑原始问题)
    • 我需要预设条件,以便从同一组文件中生成不同的目标。 Makefiles 也用于构建不同的目标,因此需要控制包含和不包含的内容。我正在编辑原始帖子以使其更清晰。
    【解决方案3】:

    Generate 是实现它的方法 - 要编译或不编译某些内容,您需要一个 if generate:

    product_a_gen: if product_a='1' generate
        -- some code in here
    end generate product_a_gen;
    product_b_gen: if product_b='1' generate
        -- some code in here
    end generate product_b_gen;
    

    VHDL2008 添加了要生成的扩展,因此您可以拥有caseelse 部分。 Doulos 有一个appnote on this

    注意 XST 并传入泛型,它们受限于支持的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多