1

我有一个名为“inner_module”的 vhdl 模块,带有一些输入和输出端口,例如

entity inner_module is 
port (input1, input2 : in std_logic;
      output1, output2 : out std_logic);
end inner_module;

我想将它包含(封装?)在另一个名为“outer_module”的模块中,这是“inner_module”的一种接口,这样我就不必处理它的所有细节。假设“outer_module”有输入和输出端口,如

entity outer_module is 
port(outer_input1: in std_logic;
   outer_output1: out std_logic);
end outer_module;

它们经过详细说明并适当地通过 external_module 的架构部分提供给 inner_module。内部输出也是如此,为了评估outer_output1而对其进行了详细说明。

假设信号 input1 和 output1 用于驱动连接到我的主 EVM (virtex 6) 的外部 evm,例如 dac evm。

在检查语法、综合之后...我必须将端口与引脚关联(通过 I/O 引脚规划),但唯一可以关联的端口是来自顶部模块的端口,我无权访问信号输入 1 和输出 1。

我可以在 outer_module 的实体声明中添加 input1 和 output1,但我想“隐藏”我使用这些信号来驱动 dac evm 的事实(它可能是很多信号),并且只需与 external_module 的先前实体声明的接口。我想将信号 input1 和 output1 关联到正确的引脚,但没有“从顶部模块”执行此操作。

可能吗?关于如何做到这一点的任何想法或参考?或者我是否总是必须包含与顶部模块中的引脚相关联的所有信号?

4

2 回答 2

1

我可以想到一个可能的解决方案,但我认为这不是一个好主意。我认为你试图避免一些你不应该做的事情。通过不将来自较低级别块的“隐藏”I/O 传递到较高级别块,您实际上是在要求您可以从任何地方访问的全局信号/端口。您不能这样做并没有物理原因(即您应该能够将设计中的任何信号连接到 FPGA 引脚),但这并不是人们期望您的 VHDL 设计工作的方式。“没有人”喜欢“全局信号”或变量,因为你失去了追踪它们来自何处以及去往何处的能力。

当您查看顶层设计的 I/O 时,您应该将 I/O 视为目标设备的引脚。在您的设计中与外界对话的任何内容都需要在您的顶层设计中具有输入或输出。

由于这个原因,顶级设计非常大并不罕见 - 通常有很多互连。SDRAM 接口可以快速炸毁您在顶层的信号数量。您可以尝试以下一些方法来减少噪音和混乱:

  • 在内部块之间连接时,利用记录对具有相似目的/功能的信号进行分组。在您的设计中,inner_module可能有一个输出端口,该端口具有记录类型,其中包含您需要输出到顶层 DAC EVM 的所有信号。我会避免在顶层设计的端口映射中使用记录。这可能会导致与工具混淆,但这也可能是我的迷信。
  • 利用向量、数组(或数组的数组)来管理多维数据和/或总线。这可以大大减少混乱。您可以调用一个信号(向量)而不是 , bit0, bit1,并且信号的所有元素都将以相同的方式处理。bit2bits
  • 将与物理/外部(即 SDRAM 接口)通信的模块放在设计的顶层(或下一层),而不是放在需要使用接口的块内。这避免了需要将外部接口信号通过(可能)多层模块到达您的接口实例化的位置。
  • 利用一个好的 VHDL 编辑器(我喜欢带有 vhdlmode 的 emacs),它可以通过复制实体(端口映射)并将其作为实例粘贴为信号列表来大大减少您遇到的复制/粘贴错误的数量,作为组件等。
于 2013-10-02T16:22:59.053 回答
1

为您的顶级端口使用记录类型。声明可以在连接两端使用的包中的记录(例如,在 FPGA 和 DAC 的仿真模型中)。

您可以隐藏记录中实际信号的详细信息;如果您需要更新记录,顶层设计不需要更改。

由于端口只能有一个方向(模式,输入、输出或输入输出),因此通常使用一对记录,一个包含所有输入信号,另一个用于输出。

在最外层,您可能需要一些实验来获得工具(UCF 文件,因为您提到 Xilinx)才能正确连接 FPGA 引脚以记录组件......

于 2013-10-02T19:13:37.993 回答