Преобразование из numeric_std без знака в std_logic_vector в vhdl

У меня есть вопрос, связанный с преобразованием из numeric_std в std_logic_vector. Я использую код фильтра скользящего среднего, который я видел в Интернете, и фильтрую свои значения АЦП, чтобы стабилизировать значения.

Код пакета фильтра:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package filterpack is
  subtype number is unsigned(27 downto 0);
  type numbers is array(natural range <>) of number;
  function slv_to_num(signal slv: in std_logic_vector) return number;
  procedure MAF_filter(
    signal x: in    number;
    signal h: inout numbers;
    signal y: out   number
  );
end filterpack;

package body filterpack is

function slv_to_num(signal slv: in std_logic_vector) return number is
  variable x: number := (others => '0');
begin
  for i in slv'range loop
    if slv(i) = '1' then
      x(i+4) := '1';
    end if;
  end loop;
  return x;
end function slv_to_num;

procedure MAF_filter(
    signal x: in    number;
    signal h: inout numbers;
    signal y: out   number
  ) is
begin
  h(0) <= x + h(1);       -- h[n] = x[n] + h[n-1]
  y <= h(0) - h(h'high);  -- y[n] = h[n] - h[n-M]
end MAF_filter;

end package body filterpack;

В моем файле верхнего уровня я вызываю процедуру MAF_filter.

Asign_x: x <= slv_to_num(adc_dat);
Filter:  MAF_filter(x,h,y);

adc_dat определяется как:

adc_dat : out std_logic_vector (23 downto 0);

Я хочу преобразовать вывод MAF_Filter в std_logic_vector (от 23 до 0). Может ли кто-нибудь сказать, как я могу преобразовать вывод фильтра «y» в «std_logic_vector»?

Огромное спасибо!


person user3008991    schedule 20.11.2013    source источник


Ответы (2)


Что вы хотите сделать с 4 дополнительными битами? Ваш тип number имеет 28 бит, но ваш сигнал adc_dat имеет только 24.

Если можно отказаться от них, вы можете использовать:

adc_dat <= std_logic_vector(y(adc_dat'range));

Кроме того, есть ли причина не писать вашу функцию slv_to_num, как показано ниже?

function slv_to_num(signal slv: in std_logic_vector) return number is
begin
  return number(slv & "0000");
end function slv_to_num;
person rick    schedule 20.11.2013
comment
Я использовал уже сделанный код для MAF. Мне нужно использовать 4 дополнительных бита из-за определения функции slv_to_num. - person user3008991; 20.11.2013
comment
Я отредактировал ответ с предложением для вашей функции slv_to_num - person rick; 20.11.2013

Преобразование должно решить 2 проблемы: отмеченную вами разницу в типах и тот факт, что два слова имеют разные размеры.

Разница между типами проста: std_logic_vector (y) даст вам правильный тип. Поскольку эти два типа являются связанными типами, это просто приведение.

Разница в размерах ... только у вас есть знания, чтобы сделать это.

adc_dat <= std_logic_vector(y(23 downto 0)) даст вам младшие биты Y, то есть значение самого Y, но может переполниться. Или, как говорит Рик, adc_dat <= std_logic_vector(y(adc_dat'range));, что обычно лучше, но я хотел раскрыть детали.

adc_dat <= std_logic_vector(y(27 downto 4)) не может переполняться, но на самом деле дает вам y/16.

person user_1818839    schedule 20.11.2013