我正在尝试使用变量作为索引来访问std_logic_vector
的一部分。
以下过程从函数中获取shift_val
结果,然后使用它来计算索引,以便在shift_data_in_s
我在最后一行收到模拟错误:
shift_data_in_s <= data_in_e(to_integer(unsigned(msb_pos)) downto to_integer(unsigned(lsb_pos)))
说&#34; LHS上的数组大小为6与1的数组大小不匹配 RHS&#34;
我认为lsb_pos
和msb_pos
上的初始化可以解决这个问题,但它没有...不确定它是如何为这两个变量获得相同的值,如果我通过减去显式计算它们来自不同常数的相同值。
signal shift_val_s : std_logic_vector(3 downto 0);
signal shift_data_in_s : std_logic_vector(5 downto 0);
shift_in_proc : process( data_in, num_zeros_s )
variable data_in_e : std_logic_vector(15 downto 0);
variable msb_pos : std_logic_vector(4 downto 0) := "01110";
variable lsb_pos : std_logic_vector(4 downto 0) := "01001";
begin
data_in_e := data_in & zeros_f(16 - data_in'length);
shift_val_s <= some_function(data_in_e);
if ( to_integer(unsigned(shift_val)) >= 12) then
-- all zeros
shift_data_in_s <= ( others => '0');
else
-- we need only 6 significant bits from the data,
-- msb_pos <= 15 - num_zeros -1;
msb_pos := std_logic_vector( "01110" - unsigned(('0' & shift_val_s)));
-- lsb_pos <= 15 - num_zeros -6;
lsb_pos := std_logic_vector("01001" - unsigned(('0' & shift_val_s)));
if ( lsb_pos(4) = '1') then -- if -ve
shift_data_in_s <= data_in_e(to_integer(unsigned(msb_pos)) downto 0) & zeros_f( to_integer(unsigned(neg_f(lsb_pos))));
else
shift_data_in_s <= data_in_e(to_integer(unsigned(msb_pos)) downto to_integer(unsigned(lsb_pos)));
end if;
end if ; end process shift_in_proc;
答案 0 :(得分:1)
最可能的解释是msb_pos
和lsb_pos
包含元数据(即非01HL
数据),可能是因为data_in
无效。 to_integer
调用将返回0,给你的范围为1,而不是6.无论如何,你可以快速找到你的模拟器。
修改强>
快速修复,根据您的评论:确保some_function
始终返回非元值的4位向量。有很多方法可以做到这一点,但你可以做到:
fixed_answer <= to_01(metaval_answer); -- remove metavals
to_01
中有一个numeric_std
,它占用unsigned
并返回unsigned
。默认情况下,元值将转换为零。在模拟开始时你仍然会得到错误的答案,但至少sim会继续下去。
答案 1 :(得分:0)
变量lsb_pos
的值取决于shift_val_s
,some_function
本身依赖于integer
- 您尚未提供的代码。所以这里的任何人都不可能直接诊断问题。
如果您使用variable msb_pos : integer range 0 to 31 := 14;
variable lsb_pos : integer range 0 to 31 := 9;
变量,例如:
shift_data_in_s <= data_in_e(msb_pos downto lsb_pos);
最后一行变为:
some_function
如果您的msb_pos
返回一个整数,则可以计算msb_pos := 14 - shift_val_s;
lsb_pos := 9 - shift_val_s;
:
object.property