Parameters 参数化端口中使用的记录中的元素
参数化记录元素的最佳方法是什么 例如: 我有这个部分:Parameters 参数化端口中使用的记录中的元素,parameters,vhdl,record,hdl,Parameters,Vhdl,Record,Hdl,参数化记录元素的最佳方法是什么 例如: 我有这个部分: component C1 is port ( clk : in std_logic; reset_n : in std_logic; cam : out t_CAM_OUT ); end component C1; 包中定义了类型t\u CAM\u OUT: package camera_signals_pkg is -- Output
component C1 is
port (
clk : in std_logic;
reset_n : in std_logic;
cam : out t_CAM_OUT
);
end component C1;
包中定义了类型t\u CAM\u 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;
但是,我想参数化信号像素_数据
在组件C1的一个实例化中,我要求像素_数据为16位,而在另一个实例化中,它必须为32位
最好的方法是什么?我经常这样做的方式是在模块的端口级别序列化数据,并将其从记录类型序列化为体系结构中的
std_逻辑向量
(或者在输入端口的情况下将其从std_逻辑向量
反序列化为记录)
即,组件将成为:
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中关于通用软件包的部分答案,因为它不适用于此特定问题。我经常这样做的方式是在模块的端口级别序列化数据,并将其从记录类型序列化为体系结构中的
std\u logic\u vector
(或者在输入端口的情况下,将其从std_逻辑_向量
反序列化回记录中)
即,组件将成为:
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中有关泛型包的部分答案,因为不能解决此特定问题。如果您愿意使用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;
如果您愿意使用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;
包泛型似乎有些过分,您可以简单地将类型保留为不受约束的类型并将其约束在实体中。并非所有工具都支持包泛型,而大多数工具已经支持不受约束的类型很长一段时间了。因此,我现在只在被迫时使用序列化(如将记录类型连接到通用FIFO)。此外,您的示例将包显示为泛型,但映射不正确。实例化的包必须位于声明性区域中,然后将包映射为任何其他泛型。直到最近,作为泛型的包甚至很少得到sim供应商的支持。对于否决我的人,请解释原因。我的回答显示了一个可能的解决方案有效的解决方案(并已用于一些超大型>100M门ASIC的设计).@刁钻-你能举个例子说明如何使用组件的泛型实例化包吗?正如我所说的,由于缺乏工具支持,我从来没有使用过这种方法。@刁钻-那些不受约束的记录看起来确实是一个很好的解决方案!下次我需要一些东西时,我一定会尝试通过合成和正式验证来实现这一点喜欢它。包泛型似乎有些过分,你可以简单地让类型不受约束,并将其约束在实体中。并非所有工具都支持包泛型,而大多数工具已经支持不受约束的类型很长时间了。因此,我现在只在被迫时使用序列化(比如将记录类型连接到通用FIFO)。此外,您的示例将包显示为泛型,但映射不正确。实例化的包必须位于声明性区域中,然后将包映射为任何其他泛型。直到最近,作为泛型的包甚至很少得到sim供应商的支持。对于否决我的人,请解释原因。我的回答显示了一个可能的解决方案有效的解决方案(并已用于一些超大型>100M门ASIC的设计).@刁钻-你能举个例子说明如何使用组件的泛型实例化包吗?正如我所说的,由于缺乏工具支持,我从来没有使用过这种方法。@刁钻-那些不受约束的记录看起来确实是一个很好的解决方案!下次我需要一些东西时,我一定会尝试通过合成和正式验证来实现这一点在VHDL-2008中有很多方法。实例化一个通用包(一个主要单元),将上下文声明引用为上下文项,传递记录子类型的泛型类型,提供记录子类型的Tricky的子类型指示,使用其中任何一个的能力都取决于整个工具链中的-2008功能支持,例如,在进行混合语言模拟或合成时。最佳方面是什么?我们可以从到目前为止你正在征求意见的两个答案来看。我发现找到所有可以做到这一点的方法,然后选择最好的方法有点挑战性。我依靠StackOverflow来了解其他人如何解决我遇到的相同类型的问题。你能推荐任何参考/文档吗?在VHDL-2008中有许多方法。实例化e一个通用包(一个主要单元),引用一个上下文声明作为一个上下文项,一个传递了记录子类型的通用类型,Tricky的子类型indicati