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

Генерация однотипных операций

Привет всем!

 

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

 

Блок простейший - допустим это элемент AND на 100 входов.

Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип.

 

Понятно, что это все описывается через for .. generate или for .. loop - просто как правильно описать саму конструкцию AND внутри цикла.

Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов.

 

Спасибо.

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


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

Привет всем!

 

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

 

Блок простейший - допустим это элемент AND на 100 входов.

Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип.

 

Понятно, что это все описывается через for .. generate  или for .. loop  - просто как правильно описать саму конструкцию AND внутри цикла.

Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов.

 

Спасибо.

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;

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


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

Привет всем!

 

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

 

Блок простейший - допустим это элемент AND на 100 входов.

Это не значит, что я собираюсь применять его на практике (чувствую что сейчас начнут втирать про конвейеризацию :) ), меня просто интересует принцип.

 

Понятно, что это все описывается через for .. generate  или for .. loop  - просто как правильно описать саму конструкцию AND внутри цикла.

Помоему у меня получается коряво, поэтому я решил попросить помощи у спецов.

 

Спасибо.

 

signal a,b,c: std_logic_vector(99 downto 0);

........

 

c <= a and b;

 

или я что-то не понял?

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


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

 

signal a,b,c: std_logic_vector(99 downto 0);

........

 

c <= a and b;

 

или я что-то не понял?

 

ИМХО есть 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;

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


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

Я обычно пишу так могу чуточку ошибаться:

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;

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


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

Блок простейший - допустим это элемент AND на 100 входов.

Я делаю так, и, вроде, работает...

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;

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


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

c <= a and b; -- вот это вроде не сработает, хотя попробывать мона

process (a,b) is 
begin 
c <= a and b;
end process proc1;

Приведены 2 совершенно одинаовые записи. Симулятор и синтезатор воспринимает как первый так и второй в виде отдельного процесса.

Первая запись есть упрощенная версия второй.

 

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

В первом случае(быстродействие) - необходимо строить дерево and- цепей, во втором случае можно обойтись схемой с переносом.

первая и вторая схема легко реализуется при помощи любой конструкции, loop- внутри явно выращенного процесса или generate- вне явно выраженного процесса.

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


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

Я обычно пишу так могу чуточку ошибаться:

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;

 

По такому принципу я и построил свой блочок, чуть ли ни копия этого.

Смущает вид в RTL - как-то Quartus его лихо отобразил ( может это просто я глючу :) ) А так, вообщем спасибо, что подтвердили мои догадки.

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


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

signal a,b,c: std_logic_vector(99 downto 0);

........

 

c <= a and b;

 

или я что-то не понял?

 

Мне одновыходовый элементик нужен, а здесь шина ( с: std_logic_vector(99 downto 0))

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


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

Блок простейший - допустим это элемент AND на 100 входов.

Я делаю так, и, вроде, работает...

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;

 

 

Спасибо! Ваш стиль подтверждает мой вариант реализации - описание похоже.

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


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

c <= a and b; -- вот это вроде не сработает, хотя попробывать мона

process (a,b) is 
begin 
c <= a and b;
end process proc1;

Приведены 2 совершенно одинаовые записи. Симулятор и синтезатор воспринимает как первый так и второй в виде отдельного процесса.

Первая запись есть упрощенная версия второй.

 

 

Я имел в виду, что я использовал перегрузку операций и не уверен, что перегруженую функцию можно будет использовать вне процесса.

По крайней мере альдек у меня ругаеться на сипользование процедур вне процессов.

Хотя может быть я и ошибаюсь

:)

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


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

И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :(

 

Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd

 

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

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


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

И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :(

 

Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd

 

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

 

Да не знал,

 

где же вы раньше были, когда я только начинал использовать ВХДЛ и задавл здесь похожий вопрос :biggrin:

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


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

И как только люди не извращаются, лишь бы не использовать стандартных библиотек. :(

 

Откройте для себя пакет IEEE.std_logic_misc и семейство функций _reduce из него. Строго говоря, это не совсем стандарт. Стандарт вот: http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd

 

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

 

О, круто! :a14: Спасибо за ссылку. Я этого не знал.

А насчет использования стандартных библиотек - да, теперь конечно, я возьму на заметку эту либу, но тему здесь я поднимал не про конретный элемент AND, а лишь как правильно описать последовательность неких однотипных операций, которых в стандартных либах может не оказаться.

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


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

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

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

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

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

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

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

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

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

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