可以在端口声明中使用自定义类型吗?

时间:2013-06-01 12:57:15

标签: vhdl

我正在通过一些旧的考试准备考试。其中一个问题是:

编写实现同步FSM的可综合行为VHDL代码... FSM有一个名为request的输入,它是枚举类型,值为(r1,r2,r3)......

这让我想写这段代码:

entity fsm is
  port ( clk     : in  std_logic;
         request : in  my_enum_type
  );
end fsm;

某处有一个:

type my_enum_type is (r1, r2, r3);

某处(我已经尝试过正确的端口声明,并在架构声明之后)。

但我似乎无法让它发挥作用。 我可以将自定义类型作为输入或输出吗?

1 个答案:

答案 0 :(得分:9)

是的,你可以,我认为这是最佳实践 - 它意味着最少的工作,最好的理解,最简单的维护和最干净的设计。

诀窍是在包中声明整个设计的通用类型(我通常称之为“Common”:-)并在实体声明之前添加use work.Common.all并在该实体的每个客户中添加package Common is -- untested... type my_enum_type is (r1, r2, r3); -- (optional) useful tools function to_slv (e : my_enum_type) return std_logic_vector; function to_enum (s : std_logic_vector(my_enum'length downto 0)) return my_enum_type; end Common; package body Common is -- subprogram bodies here end Common; 。当然,更专业的组件可以有适当的名称!

例如:

{{1}}

现在,当您向枚举添加值时,您只需修改“Common”并重建设计,而遵循传统指南的人仍在尝试识别每个端口并发出信号,以增加其“std_logic_vector”的范围“由1。

也适用于总线接口,每个方向的记录都隐藏了所有单独的总线和握手信号。

你将不得不打击像Xilinx“自动测试平台生成器”这样的脑死工具,这将有助于将所有端口类型 - 整数或布尔以及自定义 - 转换为std_logic(_vector),然后无法编译。只需将它们翻译回来。

你仍然可以说,在最顶层,所有外部FPGA引脚仍然应该是基于std_logic的。如果您需要模拟设计的后合成版本,那么您将需要使用std_logic_vector端口,或者添加一个简单的包装器以从一种形式转换为另一种形式。