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

Что с generate не так?

Туплю что-то...

 

Кто подскажет свежим взглядом, что я пропускаю в тесте с generate?

Ругается (места обозначил звездочками)

ERROR:HDLCompiler:806 Line 27: Syntax error near "generate"

ERROR:HDLCompiler:806 Line 34: Syntax error near "generate".

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;


entity Log_Decoder is
Generic
( G_OUTPUT_SIZE: integer );
Port
(
    CLK_INP         : in  STD_LOGIC;
    CODE_DC_INP   : in  STD_LOGIC_VECTOR (G_OUTPUT_SIZE-1 downto 0);
    RESET_INP         : in  STD_LOGIC;
     
    CODE_DC_OUT      : out STD_LOGIC_VECTOR ((2**G_OUTPUT_SIZE)-1 downto 0));
end Log_Decoder;

architecture Behavioral of Log_Decoder is

begin        
     process(CLK_INP)
     begin
        if CLK_INP'event and CLK_INP = '1' then
                if ( RESET_INP = '0') then
                         CODE_DC_OUT <= (others=>'0');
                 else
*                    cikl:     for i in 0 to (2**G_OUTPUT_SIZE)-1 generate
                         begin
                            if (i = conv_integer(CODE_DC_INP)) then
                              CODE_DC_OUT(i) <= '1';
                            else
                              CODE_DC_OUT(i) <= '0';
                            end if;
*                     end generate cikl;
                 end if;
         end if;
      end process;
end Behavioral;

Уж очень заманчивая конструкция!....

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


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

Туплю что-то...

 

Кто подскажет свежим взглядом, что я пропускаю в тесте с generate?

Ругается (места обозначил звездочками)

ERROR:HDLCompiler:806 Line 27: Syntax error near "generate"

ERROR:HDLCompiler:806 Line 34: Syntax error near "generate".

 

Уж очень заманчивая конструкция!....

 

library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.ALL;

entity genericmux is
Generic
( G_OUTPUT_SIZE: integer := 8);
Port
(
    CLK_INP         : in  STD_LOGIC;
    CODE_DC_INP   : in  STD_LOGIC_VECTOR (G_OUTPUT_SIZE-1 downto 0);
    RESET_INP         : in  STD_LOGIC;
    
    CODE_DC_OUT      : out STD_LOGIC_VECTOR (2**G_OUTPUT_SIZE-1 downto 0));
end genericmux;

architecture Behavioral of genericmux is

begin        
     process(CLK_INP)
     begin
        if CLK_INP'event and CLK_INP = '1' then
                if ( RESET_INP = '0') then
                         CODE_DC_OUT <= (others=>'0');
                 else
                                    for i in 0 to ((2**G_OUTPUT_SIZE)-1) loop
                            if (i = conv_integer(CODE_DC_INP)) then
                              CODE_DC_OUT(i) <= '1';
                            else
                              CODE_DC_OUT(i) <= '0';
                            end if;
                     end loop; 
                 end if;
         end if;
      end process;
end Behavioral;

 

так квартус компилирует :)

 

PS название компонента/модуля поменял - не хотел новый проект делать...

PS PS не скромный вопрос из любопытства и чем же конструкция заманчива? :)

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


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

PS название компонента/модуля поменял - не хотел новый проект делать...

PS PS не скромный вопрос из любопытства и чем же конструкция заманчива? :)

 

Спасибо! :tort:

Хочется лаконичности. У меня напрашивается Decoder на 128 линий. Есть задумка перевернуть немного логику по разрядности... Хочу поиграться с разрядностью от выхода, а не входа..

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


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

Спасибо! :tort:

Хочется лаконичности. У меня напрашивается Decoder на 128 линий. Есть задумка перевернуть немного логику по разрядности... Хочу поиграться с разрядностью от выхода, а не входа..

Лаконично можно одним выражением описать:

CODE_DC_OUT <= std_logic_vector(shift_left(to_unsigned(1, CODE_DC_OUT'length), to_integer(unsigned(CODE_DC_INP))));

Хотя кодогенерация для варианта с циклом может оказаться лучше.

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


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

Лаконично можно одним выражением описать:

CODE_DC_OUT <= std_logic_vector(shift_left(to_unsigned(1, CODE_DC_OUT'length), to_integer(unsigned(CODE_DC_INP))));

Хотя кодогенерация для варианта с циклом может оказаться лучше.

Гран мерси! :tort:

 

Прдолжаю вариант трансформации...

library IEEE;

use IEEE.std_logic_1164.all;

use work.log2_pkg.all;

use ieee.numeric_std.all;

USE ieee.std_logic_arith.ALL;

USE ieee.std_logic_unsigned.ALL;

 

entity Log_Decoder is

Generic

( G_OUTPUT_SIZE: integer );

Port

(

CODE_DC_INP : in STD_LOGIC_VECTOR (log2(G_OUTPUT_SIZE)-1 downto 0);

 

CODE_DC_OUT : out STD_LOGIC_VECTOR (G_OUTPUT_SIZE-1 downto 0));

end Log_Decoder;

 

architecture Behavioral of Log_Decoder is

 

begin

process(CODE_DC_INP)

begin

cikl: for i in 0 to G_OUTPUT_SIZE-1 loop

if (i = conv_integer(CODE_DC_INP)) then

CODE_DC_OUT(i) <= '1';

else

CODE_DC_OUT(i) <= '0';

end if;

end loop;

end process;

end Behavioral;

ничего нового, но для причесывания полезно...

library ieee;
use ieee.std_logic_1164.all;

package log2_pkg is
  function log2(n:integer)
    return integer;
end;

package body log2_pkg is
function log2(n:integer)
    return integer is
variable  m,p:integer;
  begin
  m:=0;
  p:=1;
    while p<n loop
        m:=m+1;
        p:=p*2;
    end loop;
        return m;
end log2;
end log2_pkg;

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


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

Туплю что-то...

Кто подскажет свежим взглядом, что я пропускаю в тесте с generate?

 

Вы не можете использовать generate внутри process, но можете наоборот.

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

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


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

Вы не можете использовать generate внутри process, но можете наоборот.

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

Я позаимствовал этот текст из англоязычного интернета... И стал шлифовать. Авторитетность сработала не в мою пользу... Спасибо ребятки!

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


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

Столкнулся с интересной особенностью для синтезатора от ISE(Xilinx).

Максимально насыщенный параметрическими настройками проект, который шел под Spartan 6(Без единого варнинга!), при портации на CPLD отказывался синтезироваться и ругался на непонимание параметров. Тупо отбразывал сигналы... RTL- "оставались рожки да ножки". Понятно, что макроячейки другие и не все синтезабельно в итоге..

 

Вопрос, что любит CPLD? Какие конструкции VHDL?

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


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

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

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

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

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

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

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

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

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

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