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

Как параметризировать количество портов компонента

Решил сделать универсальный параметризированный модуль.

Суть в следующем. Параметры модуля до настоящего момента не известны точно и могут варьироваться

(количество каналов, ширина шин адреса и данных и др.) Хочу написать параметризированный модуль

если с параметризацией разрядностей шин всё более или менее ясно то как быть с количеством

каналов? Ведь нужно изменять количество портов в компоненте. А как?

 

Попытался так

 

entity Ram_register is

generic(

----------------------------------------------------------------------------

---- Описаны настраиваемые параметры модели---------------------------------

----------------------------------------------------------------------------

MemoryDepth : integer := 30280; -- глубина памяти

NumberOfChannels : integer := 3;------- количество каналов (от 1 до 30)

AddressWidth : integer := 14;------ ширина шины адреса

DataToImitWidth : integer := 16;------ ширина шины входных данных

DataFromImitWidth : integer := 16------ ширина шины выходных данных

);

--------------------------------------------------------------------------------

------- Описаны порты компонента------------------------------------------------

--------------------------------------------------------------------------------

port(

--бла бла бла

--Output

Outputs : for ChannelNumber in 1 to NumberOfChannels generate

DataFromImitatorReChannel (ChannelNumber) : out STD_LOGIC_Vector(DataFromImitatorWidth - 1 downto 0);

DataFromImitatorImChannel(ChannelNumber) : out STD_LOGIC_Vector(DataFromImitatorWidth - 1 downto 0);

ValidDataFromImitatorChannel(ChannelNumber) : out STD_LOGIC;

end generate;

);

end Ram_register;

 

 

 

НЕ ПРОКАНАЛО.

Видимо не хочет среда использовать generate в поле PORT вообще.

Да и круглые скобки используются для выделения бита из шины

а не для индексации шины. А как индексировать шину?

А можно ли генерировать сигналы вообще?

И говорит мне при проверке синтаксиса примерно следующее:

 

Line 55. parse error, unexpected FOR

 

вот на этой строке

 

Outputs : for ChannelNumber in 1 to NumberOfChannels generate

 

 

Так если не так то как тогда сделать красиво.

Может и не таким способом.

 

Если кто знает подскажите.

Буду несказанно благодарен.

Изменено пользователем yeharayeu

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


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

 

Шаблон описания параметризованного устройства на VHDL

 

Пример описания 11 однотипных 8 разрядных компараторов.

library ieee;
use ieee.std_logic_1164.all;
library work;    

package Const_type is
type my_array is array (0 to 10) of std_logic_vector (7 downto 0);
end package;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.Const_type.all;

entity proverka is

Port ( 
CLK : in std_logic;
rst : in std_logic;
x : my_array;
y : my_array;

s : out std_logic_vector (10 downto 0) );
end proverka;

architecture behavioral of proverka is

begin

process (clk,rst)

begin
if (rst = '1') then
for i in 0 to 10 loop
      s(i) <= '0';
end loop;
   elsif (CLK'event and CLK ='1') then     
for i in 0 to 10 loop    
     if ( x(i) < y(i) ) then 
       s(i) <= '1';
    else 
       s(i) <= '0';
    end if;
end loop;

end if;
  
end process;

end behavioral;

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


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

Спасибо, так я действительно не пробовал. Завтра приду на работу и попробую воплотить в жизнь.

Надеюсь без проблем. :beer:

 

Вот только применительно моей задаче длина массива не известна и её как-нибудь надо задать через generic или константу...

Надо подумать.

Изменено пользователем yeharayeu

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


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

Вот только применительно моей задаче длина массива не известна и её как-нибудь надо задать через generic или константу...

 

ждите поддержки VHDL-2008, там можно объявлять в портах массивы без введения подтипа. Или переходите на SV :))

 

Либо еще вариант набить скрипт-генератор вашего модуля (сам часто так делаю), очень удобно в некоторых случаях.

 

 

Удачи!!!

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


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

Сделал так как написал Maverick - получилось пройти проверку синтаксиса и синтезирование.

 

Все параметры из поля generic перенёс в пакет.

Насколько я понимаю, теперь значения этих констант придётся изменять только из этого файла, или я не прав?

О! Или наверное надо будет создать отдельный файл с настройками

в который подключить все пакеты - настройщики и там задавать значения константам? Так получится как -нибудь. Если можно - пожалуйста выложите кусок кода, так легче въежжать.

 

Сейчас всё так:

library ieee;

use ieee.std_logic_1164.all;

library work;

package Const_type is

----------------------------------------------------------------------------

---- Описаны настраиваемые параметры модели---------------------------------

----------------------------------------------------------------------------

constant NumberOfChannels : integer := 3;-- количество каналов (от 1 до 30)

constant MemoryDepth : integer := 30280; -- глубина памяти

constant AddressWidth : integer := 15;------ ширина шины адреса

constant DataToImitWidth : integer := 16;------ ширина шины входных данных

constant DataFromImitWidth : integer := 16;------- ширина шины выходных данных

type ArrayChannel is array (1 to NumberOfChannels) of std_logic_vector (DataFromImitWidth - 1 downto 0);

type Channel is array (1 to NumberOfChannels) of std_logic;

end package;

 

ну и далее всё понятно

 

ждите поддержки VHDL-2008, там можно объявлять в портах массивы без введения подтипа. Или переходите на SV :))

 

Либо еще вариант набить скрипт-генератор вашего модуля (сам часто так делаю), очень удобно в некоторых случаях.

Удачи!!!

 

 

Скрипт-генератор? Предлагаете написать собственный скрипт на Шарпе каком-нибудь, Я так понял?

 

Я в минуты отчаянья тоже об этом подумывал, но только этот путь мне казался длинным. Поэтому решил сначала у Уважаемых форумчан спросить, так как на VHDL имею опыт только около года, и соответственно тонкостей не знаю. А в конторе в которой работаю, в "универсальности" не лезут.

Я подумал что зря не лезут, тем более что блоки очень часто похожи как две капли воды.

Изменено пользователем yeharayeu

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


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

Сделал так как написал Maverick - получилось пройти проверку синтаксиса и синтезирование.

 

Все параметры из поля generic перенёс в пакет.

Насколько я понимаю, теперь значения этих констант придётся изменять только из этого файла, или я не прав?

О! Или наверное надо будет создать отдельный файл с настройками

в который подключить все пакеты - настройщики и там задавать значения константам? Так получится как -нибудь. Если можно - пожалуйста выложите кусок кода, так легче въежжать.

 

Сейчас всё так:

library ieee;

use ieee.std_logic_1164.all;

library work;

package Const_type is

----------------------------------------------------------------------------

---- Описаны настраиваемые параметры модели---------------------------------

----------------------------------------------------------------------------

constant NumberOfChannels : integer := 3;-- количество каналов (от 1 до 30)

constant MemoryDepth : integer := 30280; -- глубина памяти

constant AddressWidth : integer := 15;------ ширина шины адреса

constant DataToImitWidth : integer := 16;------ ширина шины входных данных

constant DataFromImitWidth : integer := 16;------- ширина шины выходных данных

type ArrayChannel is array (1 to NumberOfChannels) of std_logic_vector (DataFromImitWidth - 1 downto 0);

type Channel is array (1 to NumberOfChannels) of std_logic;

end package;

 

ну и далее всё понятно

Скрипт-генератор? Предлагаете написать собственный скрипт на Шарпе каком-нибудь, Я так понял?

 

Я в минуты отчаянья тоже об этом подумывал, но только этот путь мне казался длинным. Поэтому решил сначала у Уважаемых форумчан спросить, так как на VHDL имею опыт только около года, и соответственно тонкостей не знаю. А в конторе в которой работаю, в "универсальности" не лезут.

Я подумал что зря не лезут, тем более что блоки очень часто похожи как две капли воды.

 

:beer: Я в каждом файле создаю поле generic и там все прописываю. Файл - одно архитектурное тело ("architecture Behavioral of shim_mux is"). Таким образом, мне с ними пока удобно работать.

 

P.S. В отдельный файл все поля generic я не пробывал выносить.

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


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

:beer: Я в каждом файле создаю поле generic и там все прописываю. Файл - одно архитектурное тело ("architecture Behavioral of shim_mux is"). Таким образом, мне с ними пока удобно работать.

 

P.S. В отдельный файл все поля generic я не пробывал выносить.

 

 

Ну а код, который я привёл, можно ли переписать с использованием поля generic. Ведь у меня все константы перенесены в пакет.

 

Ведь тут вся соль в константе NumberOfChannels, которая должна быть использована при описании типа

type ArrayChannel is array (1 to NumberOfChannels) of.......

Если я перенесу константу в Генерик, то пакет её не увидит :

Line 31. Undefined symbol 'NumberOfChannels'.

С остальными параметрами проблем нет.

 

Так что как у вас одним только генериком в каждом файле не обойтись.

 

Кстати, как у человека очевидно более продвинутого в VHDL , хочу спросить о видимости констант описанных, в генерике.

Если в top-level файле в генерике написать например NumberOfChannels => 3, константа во вложенных

компонентах изменится соглассно этого (например если уровень вложенности более двух)?

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


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

Кстати, как у человека очевидно более продвинутого в VHDL , хочу спросить о видимости констант описанных, в генерике.

Если в top-level файле в генерике написать например NumberOfChannels => 3, константа во вложенных

компонентах изменится соглассно этого (например если уровень вложенности более двух)?

 

Извините, но я Вам не могу здесь помочь, так как сам этого не делал :crying:

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


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

Если в top-level файле в генерике написать например NumberOfChannels => 3, константа во вложенных

компонентах изменится соглассно этого (например если уровень вложенности более двух)?

Все параметры из top-level generic'а вниз по иерархии должны передаваться через generic'и компонентов.

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


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

Параметризированный модуль отлажен и отлично отмоделирован в

ModelSim6.3. Всё как я и хотел. Спасибо всем кто помог!!!!!!

Изменено пользователем yeharayeu

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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