Перейти к содержанию
    

Работа с generic?

Как написать в VHDL такую конструкцию?

 

entity avg is
    generic (
 NUMDATABITSIN    : integer := 14;
 NUMAVG      : integer := 32
    );
 port(
  CLK:  in std_logic;
  RSTl:  in std_logic;
  CE:  in std_logic;
  DATA_IN:    in std_logic_vector(NUMDATABITSIN-1 downto 0);
  DATA_DRY:    out std_logic;
  DATA_OUT:    out std_logic_vector(NUMDATABITSIN + fix(log(NUMAVG)/log(4)) -1 downto 0)
     );
end avg;

 

Не понятно как написать формулу для DATA_OUT.

Здесь пример я написал как это выглядит на MatLab.

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как написать в VHDL такую конструкцию?

 

entity avg is
    generic (
 NUMDATABITSIN    : integer := 14;
 NUMAVG      : integer := 32
    );
 port(
  CLK:  in std_logic;
  RSTl:  in std_logic;
  CE:  in std_logic;
  DATA_IN:    in std_logic_vector(NUMDATABITSIN-1 downto 0);
  DATA_DRY:    out std_logic;
  DATA_OUT:    out std_logic_vector(NUMDATABITSIN + fix(log(NUMAVG)/log(4)) -1 downto 0)
     );
end avg;

 

Не понятно как написать формулу для DATA_OUT.

Здесь пример я написал как это выглядит на MatLab.

 

Спасибо.

Делаешь пакет, в его заголовке обьявляешь нужные функции, в теле пакета описываешь тела этих функций.

 

потом добавляешь:

use.work.my_package.all;
entity avg is
...

и можешь пользоваться обьявленными в пакете функциями и константами во всем модуле. Можешь прямо в пакете обявить константы для размерности

DATA_OUT и прямо в нем их инициализировать, с помощью предварительно обьявленных функций...

 

... или я не так понял суть проблемы :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и можешь пользоваться обьявленными в пакете функциями и константами во всем модуле.

С константами все понятно. Человек спрашивает как ему fix(log(NUMAVG)/log(4)) посчитать, чтобы автоматом размерность выставлялась.

Вот например такой код для log2:

function LOG2(Number : positive) return natural is
variable Temp : positive := 1;
begin
if Number=1 then 
return 0;
 else 
  for i in 1 to integer'high loop
   Temp := 2*Temp; 
    if Temp>=Number then 
     return i;
    end if;
end loop;
end if;    
end LOG2;

А принцип такой же, можно в package запихнуть, а можно и на месте.

А потом еще нужно будет функцию для fix написать.

Порыться можно в сети поискать.

Вот нашел

Смотри здесь

Готовый package к употреблению :rolleyes: .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...