yeharayeu 0 18 сентября, 2008 Опубликовано 18 сентября, 2008 (изменено) · Жалоба Решил сделать универсальный параметризированный модуль. Суть в следующем. Параметры модуля до настоящего момента не известны точно и могут варьироваться (количество каналов, ширина шин адреса и данных и др.) Хочу написать параметризированный модуль если с параметризацией разрядностей шин всё более или менее ясно то как быть с количеством каналов? Ведь нужно изменять количество портов в компоненте. А как? Попытался так 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 Так если не так то как тогда сделать красиво. Может и не таким способом. Если кто знает подскажите. Буду несказанно благодарен. Изменено 18 сентября, 2008 пользователем yeharayeu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 18 сентября, 2008 Опубликовано 18 сентября, 2008 · Жалоба Шаблон описания параметризованного устройства на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yeharayeu 0 18 сентября, 2008 Опубликовано 18 сентября, 2008 (изменено) · Жалоба Спасибо, так я действительно не пробовал. Завтра приду на работу и попробую воплотить в жизнь. Надеюсь без проблем. :beer: Вот только применительно моей задаче длина массива не известна и её как-нибудь надо задать через generic или константу... Надо подумать. Изменено 18 сентября, 2008 пользователем yeharayeu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба Вот только применительно моей задаче длина массива не известна и её как-нибудь надо задать через generic или константу... ждите поддержки VHDL-2008, там можно объявлять в портах массивы без введения подтипа. Или переходите на SV :)) Либо еще вариант набить скрипт-генератор вашего модуля (сам часто так делаю), очень удобно в некоторых случаях. Удачи!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yeharayeu 0 19 сентября, 2008 Опубликовано 19 сентября, 2008 (изменено) · Жалоба Сделал так как написал 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 имею опыт только около года, и соответственно тонкостей не знаю. А в конторе в которой работаю, в "универсальности" не лезут. Я подумал что зря не лезут, тем более что блоки очень часто похожи как две капли воды. Изменено 19 сентября, 2008 пользователем yeharayeu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба Сделал так как написал 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 я не пробывал выносить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yeharayeu 0 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба :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, константа во вложенных компонентах изменится соглассно этого (например если уровень вложенности более двух)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба Кстати, как у человека очевидно более продвинутого в VHDL , хочу спросить о видимости констант описанных, в генерике. Если в top-level файле в генерике написать например NumberOfChannels => 3, константа во вложенных компонентах изменится соглассно этого (например если уровень вложенности более двух)? Извините, но я Вам не могу здесь помочь, так как сам этого не делал :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 19 сентября, 2008 Опубликовано 19 сентября, 2008 · Жалоба Если в top-level файле в генерике написать например NumberOfChannels => 3, константа во вложенных компонентах изменится соглассно этого (например если уровень вложенности более двух)? Все параметры из top-level generic'а вниз по иерархии должны передаваться через generic'и компонентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yeharayeu 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 (изменено) · Жалоба Параметризированный модуль отлажен и отлично отмоделирован в ModelSim6.3. Всё как я и хотел. Спасибо всем кто помог!!!!!! Изменено 23 сентября, 2008 пользователем yeharayeu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться