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

eva*_*ing 10 vhdl

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

编写实现图中同步FSM的可综合行为VHDL代码... FSM有一个输入,称为请求,具有值(r1,r2,r3)的枚举类型...

这让我想写这段代码:

entity fsm is
  port ( clk     : in  std_logic;
         request : in  my_enum_type
  );
end fsm;
Run Code Online (Sandbox Code Playgroud)

某处有一个:

type my_enum_type is (r1, r2, r3);
Run Code Online (Sandbox Code Playgroud)

在某个地方(我已经尝试了正确的端口声明和建筑声明之后).

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

Bri*_*ond 10

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

诀窍是在包中声明整个设计的通用类型(我通常将其称为"Common":-)并use work.Common.all在实体声明之前添加AND 并在该实体的每个客户中添加.当然,更专业的组件可以有适当的名称!

例如:

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;
Run Code Online (Sandbox Code Playgroud)

现在当你为枚举添加一个值时,你只需要修改"Common"并重建设计,而那些遵循传统指南的人仍然试图识别每个端口并发出信号,他们必须将"std_logic_vector"的范围增加1 .

对于总线接口也非常有效,每个方向的记录都隐藏了所有单独的总线和握手信号.

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

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