如何解决参数化端口中使用的记录中的元素
参数化记录元素的最佳方法是什么?
例如:
我有这个组成部分:
component C1 is
port (
clk : in std_logic;
reset_n : in std_logic;
cam : out t_CAM_OUT
);
end component C1;
类型t_CAM_OUT
在包中定义:
package camera_signals_pkg is
-- Output signals related to camera
type t_CAM_OUT is record
...
pixel_data : std_logic_vector(31 downto 0);
...
end record t_CAM_OUT;
end package camera_signals_pkg;
但是我想参数化信号 pixel_data
在组件 C1 的一个实例中,我要求 pixel_data 为16位,而在另一实例中,它必须为32位。
什么是最好的方法?
解决方法
如果您乐于使用VHDL 2008,则可以简单地将pixel_data
保留在类型中,而不必在类型声明中进行约束,然后在端口声明期间从每个实体的文字或从泛型(如您)进行约束会是什么类型。
-- Output signals related to camera
type t_CAM_OUT is record
...
pixel_data : std_logic_vector;
...
end record t_CAM_OUT;
entity ent1 is
port (
clk : in std_logic;
reset_n : in std_logic;
cam : out t_CAM_OUT( pixel_data(15 downto 0) );
);
entity generic_ent is
generic (
W : natural
);
port(
clk : in std_logic;
reset_n : in std_logic;
cam : out t_CAM_OUT( pixel_data(W-1 downto 0) );
);
,
我经常这样做的方法是在模块的端口级别上对数据进行序列化,并将其从记录类型序列化为架构内的std_logic_vector
(或从std_logic_vector
反序列化)输入端口的情况下记录到记录中。)
即该组件将变为:
component C1 is
generic (
g_cam_length : positive
);
port (
clk : in std_logic;
reset_n : in std_logic;
cam : out std_logic_vector(f_CAM_OUT_length(g_cam_length) - 1 downto 0)
);
end component C1;
architecture RTL of C1 is
type t_CAM_OUT is record
pixel_data : std_logic_vector(g_pixel_length - 1 downto 0);
end record t_CAM_OUT;
function to_slv (data : t_CAM_OUT) return std_logic_vector is
variable result : std_logic_vector(f_CAM_OUT_length(g_cam_length - 1) downto 0);
begin
...
end function to_slv;
begin
end architecture RTL;
因此,您将在软件包中包含一个函数f_CAM_OUT_length
,该函数可帮助计算序列化t_CAM_OUT
记录的长度。
取决于设计的结构,这并不是很理想,因为这会在不同的模块和程序包之间产生大量的耦合。
当然,这意味着您不能在包中定义记录。即您必须在模块架构中定义记录。
编辑:删除了有关VHDL-2008中通用软件包的部分答案,因为不适用于此特定问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。