我有一个可变长度的向量std_logic_vector(X downto 0)
。现在我正在尝试在我的包中定义一个常量来进行重置,这样较低的X/2
位是1,其他位是零。
例如,3位向量(X=3
)将使常量"011"
和4位向量将给出常量"0011"
。
如何在VHDL包中执行此操作? 下面的代码解释了我想要做的事情。
type Entry_Type is record
state : std_logic_vector(X-1 downto 0);
end record;
constant Entry_Constant : Entry_Type := <???>;
答案 0 :(得分:5)
根据需要,至少有两种选择来初始化您的记录类型。一个是使用初始化函数,另一个是在聚合中使用N的值。
函数是初始化自定义数据类型的好方法。在您的情况下,您可以创建一个函数default_entry_from_width(n)
,返回entry_type
值:
type entry_type is record
state: std_logic_vector;
end record;
function default_entry_from_width(width: natural) return entry_type is
variable return_vector: std_logic_vector(width-1 downto 0);
begin
for i in return_vector'range loop
return_vector(i) := '1' when i <= width/2 else '0';
end loop;
return (state => return_vector);
end;
constant ENTRY_1: entry_type := default_entry_from_width(3); -- return 011
constant ENTRY_2: entry_type := default_entry_from_width(4); -- return 0011
另一种方法是使用预先定义的N值来初始化带有聚合的常量:
constant N: natural := 4;
constant ENTRY_3: entry_type := (
state => (
N-1 downto N/2 => '1',
N/2-1 downto 0 => '0'
)
);
答案 1 :(得分:2)
你的意思是这样的:
library ieee;
use ieee.std_logic_1164.all;
package vector_length is
constant X: natural := 3; -- Entry_Type.state length
type Entry_Type is
record
state : std_logic_vector(X-1 downto 0);
end record;
constant entry_default: Entry_Type :=
(state =>
(X-1 downto NATURAL(REAL((X-1)/2) + 0.5) =>'0', others => '1')
);
end package vector_length;
library ieee;
use ieee.std_logic_1164.all;
use work.vector_length.all;
entity fum is
end entity;
architecture foo of fum is
signal entry: Entry_Type := entry_default;
signal default: std_logic_vector (X-1 downto 0);
begin
TEST:
process
begin
default <= entry.state;
wait for 100 ns; -- so it will show up in a waveform display
wait;
end process;
end architecture;
符合X = 3的条件,默认值为“011”,X = 4,默认值为“0011”。
请注意,默认值是在声明子类型(条目)的位置分配的,而不是在类型声明中。
(这是一个痛苦的回合)。