【问题标题】:Can custom types be used in port declaration?可以在端口声明中使用自定义类型吗?
【发布时间】:2013-05-28 04:47:33
【问题描述】:

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

在图中编写实现同步 FSM 的可综合行为 VHDL 代码... FSM 有一个输入,称为请求,它是具有值 (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);

某处(我在端口声明之前和架构声明之后都尝试过)。

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

【问题讨论】:

    标签: vhdl


    【解决方案1】:

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

    诀窍是在一个包中声明整个设计的通用类型(我通常称之为“通用”:-),并在实体声明之前和该实体的每个客户中添加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;
    

    现在,当您向枚举添加值时,您只需修改“Common”并重新构建设计,而那些遵循传统准则的人仍在尝试识别每个端口和信号,他们必须增加“std_logic_vector”的范围" 1。

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

    您将不得不与赛灵思“自动测试台生成器”之类的脑死亡工具作斗争,这些工具将有助于将您的所有端口类型(整数或布尔值以及自定义)转换为 std_logic(_vector),然后编译失败。只需将它们重新翻译回来。

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

    【讨论】:

    • 这完全有效!问题:顶级和引脚的东西......我将如何转换?只是一个如果? if (request = r1) then pin1
    • 在 Common 包中的“有用工具”中隐藏该级别的详细信息...然后您的包装器包含一个实体(带有 SLV 端口的 post_synth 网表)和信号分配,如 slv_enum <= to_slv(my_enum);
    • 进一步说明 - 您可以根据 'pos''val' 属性和 numeric_std.unsigned 编写那些“有用的工具”(用于枚举),因此 to_enum 的主体可以简单地成为return my_enum_type'val(unsigned(s));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多