使用变量作为索引访问std_logic_vector的一部分

时间:2015-12-23 13:32:32

标签: vhdl

我正在尝试使用变量作为索引来访问std_logic_vector的一部分。

以下过程从函数中获取shift_val结果,然后使用它来计算索引,以便在shift_data_in_s

中提取我们需要的6位数据
  

我在最后一行收到模拟错误:

     

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_posmsb_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;

2 个答案:

答案 0 :(得分:1)

最可能的解释是msb_poslsb_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_ssome_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