我正在准备考试,通过一些旧的考试.其中一个问题是:
编写实现图中同步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端口,或添加一个简单的包装器以从一种形式转换为另一种形式.