Jools 0 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба Привет всем! Не подскажет ли кто из уважаемых знатоков, как быстро описать блок на VHDL. Блок простейший - допустим это элемент AND на 100 входов. Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип. Понятно, что это все описывается через for .. generate или for .. loop - просто как правильно описать саму конструкцию AND внутри цикла. Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба Привет всем! Не подскажет ли кто из уважаемых знатоков, как быстро описать блок на VHDL. Блок простейший - допустим это элемент AND на 100 входов. Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип. Понятно, что это все описывается через for .. generate или for .. loop - просто как правильно описать саму конструкцию AND внутри цикла. Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов. Спасибо. <{POST_SNAPBACK}> ALDEC -> VHDL->Languadge Asistant -> -Languadge Templates -> generate statement -> LABEL1: -- using for scheme: for I in <lower_limit> to <upper_limit> generate <statement> end generate; -- using if scheme if <condition> generate <statement> end generate; -- example: --G0: for I in 0 to 3 generate -- G1: if I = 0 generate -- HA: HALF_ADDER port map ( -- A => X(I), B => Y(I), -- S => Z(I), Co => TMP(I+1)); -- end generate; -- G2: if I >= 1 and I <= 3 generate -- FA: FULL_ADDER port map ( -- A => X(I), B => Y(I), C => TMP(I), -- S => Z(I), Co => TMP(I+1)); -- end generate; --end generate; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jenik 0 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба Привет всем! Не подскажет ли кто из уважаемых знатоков, как быстро описать блок на VHDL. Блок простейший - допустим это элемент AND на 100 входов. Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип. Понятно, что это все описывается через for .. generate или for .. loop - просто как правильно описать саму конструкцию AND внутри цикла. Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов. Спасибо. <{POST_SNAPBACK}> signal a,b,c: std_logic_vector(99 downto 0); ........ c <= a and b; или я что-то не понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба signal a,b,c: std_logic_vector(99 downto 0); ........ c <= a and b; или я что-то не понял? <{POST_SNAPBACK}> ИМХО есть 3 способа proc1: process (a,b) is begin for i in c'range loop c(i) <= a(i) and b(i); end loop; end process proc1; g0 : for i in c'range generate c(i) <= a(i) and b(i); end generate g0; в пакете пишем function "and" (a : std_logic_vector; b : std_logic_vector ) return std_logic_vector is variable ret : std_logic_vector(a'range); begin for i in c'range loop ret(i) := a(i) and b(i); end loop; return ret; end; в коде c <= a and b; -- вот это вроде не сработает, хотя попробывать мона process (a,b) is begin c <= a and b; end process proc1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба Я обычно пишу так могу чуточку ошибаться: entity AND100 is port( A : in std_logic_vector(99 downto 0); O : out std_logic ); end entity AND100; archirtecture inside of AND100 is signal TMP :std_logic; begin TMP <= '1'; process(A) variable q : std_logic; begin q <= TMP; for I in a'range loop q <= q and A(I); end loop; O <= q; end process; end architecture; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AA55 0 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба Блок простейший - допустим это элемент AND на 100 входов. <{POST_SNAPBACK}> Я делаю так, и, вроде, работает... library ieee; use ieee.std_logic_1164.all; entity AND100 is port( x : in std_logic_vector(99 downto 0); y : out std_logic ); end AND100; architecture default of AND100 is begin XProc: Process(x) variable k : std_logic; begin k:='1'; for i in x'right to x'left loop k:=k and x(i); end loop; y<=k; end process; end default; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 25 августа, 2005 Опубликовано 25 августа, 2005 · Жалоба c <= a and b; -- вот это вроде не сработает, хотя попробывать мона process (a,b) is begin c <= a and b; end process proc1; Приведены 2 совершенно одинаовые записи. Симулятор и синтезатор воспринимает как первый так и второй в виде отдельного процесса. Первая запись есть упрощенная версия второй. Рекомендую перед тем как реализовывать определиться со стректурой того, что вы хотите получить, какой показатель для вас наиболее критичен, быстродействие или емкость. В первом случае(быстродействие) - необходимо строить дерево and- цепей, во втором случае можно обойтись схемой с переносом. первая и вторая схема легко реализуется при помощи любой конструкции, loop- внутри явно выращенного процесса или generate- вне явно выраженного процесса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jools 0 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба Я обычно пишу так могу чуточку ошибаться: entity AND100 is port( A : in std_logic_vector(99 downto 0); O : out std_logic ); end entity AND100; archirtecture inside of AND100 is signal TMP :std_logic; begin TMP <= '1'; process(A) variable q : std_logic; begin q <= TMP; for I in a'range loop q <= q and A(I); end loop; O <= q; end process; end architecture; <{POST_SNAPBACK}> По такому принципу я и построил свой блочок, чуть ли ни копия этого. Смущает вид в RTL - как-то Quartus его лихо отобразил ( может это просто я глючу :) ) А так, вообщем спасибо, что подтвердили мои догадки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jools 0 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба signal a,b,c: std_logic_vector(99 downto 0); ........ c <= a and b; или я что-то не понял? <{POST_SNAPBACK}> Мне одновыходовый элементик нужен, а здесь шина ( с: std_logic_vector(99 downto 0)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jools 0 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба Блок простейший - допустим это элемент AND на 100 входов. <{POST_SNAPBACK}> Я делаю так, и, вроде, работает... library ieee; use ieee.std_logic_1164.all; entity AND100 is port( x : in std_logic_vector(99 downto 0); y : out std_logic ); end AND100; architecture default of AND100 is begin XProc: Process(x) variable k : std_logic; begin k:='1'; for i in x'right to x'left loop k:=k and x(i); end loop; y<=k; end process; end default; <{POST_SNAPBACK}> Спасибо! Ваш стиль подтверждает мой вариант реализации - описание похоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба c <= a and b; -- вот это вроде не сработает, хотя попробывать мона process (a,b) is begin c <= a and b; end process proc1; Приведены 2 совершенно одинаовые записи. Симулятор и синтезатор воспринимает как первый так и второй в виде отдельного процесса. Первая запись есть упрощенная версия второй. <{POST_SNAPBACK}> Я имел в виду, что я использовал перегрузку операций и не уверен, что перегруженую функцию можно будет использовать вне процесса. По крайней мере альдек у меня ругаеться на сипользование процедур вне процессов. Хотя может быть я и ошибаюсь :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :( Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd Изучение языка включает в себя не только изучение синтаксиса и семантики, но и стандартных библиотек, дабы не изобретать велосипеда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :( Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd Изучение языка включает в себя не только изучение синтаксиса и семантики, но и стандартных библиотек, дабы не изобретать велосипеда. <{POST_SNAPBACK}> Да не знал, где же вы раньше были, когда я только начинал использовать ВХДЛ и задавл здесь похожий вопрос Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jools 0 26 августа, 2005 Опубликовано 26 августа, 2005 · Жалоба И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :( Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd Изучение языка включает в себя не только изучение синтаксиса и семантики, но и стандартных библиотек, дабы не изобретать велосипеда. <{POST_SNAPBACK}> О, круто! :a14: Спасибо за ссылку. Я этого не знал. А насчет использования стандартных библиотек - да, теперь конечно, я возьму на заметку эту либу, но тему здесь я поднимал не про конретный элемент AND, а лишь как правильно описать последовательность неких однотипных операций, которых в стандартных либах может не оказаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться