我正在通过一些旧的考试准备考试。其中一个问题是:
编写实现同步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);
某处(我已经尝试过正确的端口声明,并在架构声明之后)。
但我似乎无法让它发挥作用。 我可以将自定义类型作为输入或输出吗?
答案 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端口,或者添加一个简单的包装器以从一种形式转换为另一种形式。