2016-08-09 2 views
0

Я думаю, что эта ошибка является результатом GHDL, не поддерживающего VHDL 2008. Ошибка возникает в строке 27/28, когда ff0 D присваивается значение из векторного din , Каков правильный способ индексирования вектора из карты порта?Фактическое должно быть статическим именем - вектор индексирования в portmap

Я создал count_temp, чтобы попытаться обойти ошибку, но это не помогло, и я бы предпочел не иметь дополнительную переменную. Благодарю.

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

entity conv_encoder is 
    generic (d_width : positive := 16); 
    port (
     clk : in std_logic; 
     din : in std_logic_vector(d_width-1 downto 0); 
     ff_set : in std_logic; 
     count : in std_logic_vector(5 downto 0); 
     dout : out std_logic_vector(d_width*2-1 downto 0)); 
end conv_encoder; 

architecture behavioral of conv_encoder is 
    component d_ff is 
    port (clk, ff_set, D : in std_logic; 
      Q : out std_logic); 
    end component; 
    signal a, b  : std_logic; 
    signal count_temp : integer range 0 to d_width; 
    begin 
    count_temp <= to_integer(unsigned(count)); 
    ff0 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => din(count_temp), 
       -- D  => din(to_integer(unsigned(count))), 
       Q  => a); 
    ff1 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => a, 
       Q  => b); 
    -- conv encoder is r=1/2 A=111 B=101 
    process (clk, ff_set) 
    begin 
    if (ff_set = '0') then 
     if (rising_edge(clk)) then 
     dout(count_temp*2) <= din(count_temp) xor a xor b; 
     dout(count_temp*2+1) <= din(count_temp) xor b; 
     end if; 
    end if; 
    end process; 
end behavioral; 

Ошибка:

ghdl -a conv_encoder.vhd 
conv_encoder.vhd:28:30: actual must be a static name 
ghdl: compilation error 
+0

'ghdl -a -std = 08 myfile.vhd' (и предоставить тот же флаг для разработки). Текущие выпуски ghdl (0,33 дюйма) поддерживают довольно много (не все) VHDL-2008. Но это не ваша проблема, как указывает Джефф. –

+0

IEEE Std 1076-2008 6.5.5.3 para 6 * Если фактическая часть данного элемента ассоциации для формального порта блока является зарезервированным словом, инерционным, за которым следует выражение, или является выражением, которое не является глобально статическим, тогда данный элемент ассоциации эквивалентен ассоциации порта с анонимным сигналом, неявно объявленным в декларативной области, которая сразу же закрывает блок. Сигнал имеет тот же подтип, что и формальный порт, и является целью неявного параллельного оператора присваивания сигнала формы анонимный <= E ... * ghdl не поддерживает это (пока). – user1155120

+0

ghdl-updates [RoadMap2008] (https://sourceforge.net/p/ghdl-updates/wiki/RoadMap2008/) Новые функции VHDL 2008, 6. Объявления, ⸰ анонимный сигнал в портовой статье. (И это не показано как \ [Готово \]). – user1155120

ответ

1

Это не вопрос поддержки VHD2008 в GHDL. Ваши две попытки решить это концептуально достаточно просты, но, как говорит ошибка, вы не можете подключить порт к чему-то не статичному. То, что это означает на простом английском языке, заключается в том, что вы не можете связать порт с некоторой комбинаторной логикой. Даже D => not din(0) не будет разрешено.

Что я буду делать здесь, будет включать мультиплексор. Это может быть столь же просто, как:

signal selected_din : std_logic; 

...

selected_din <= din(count_temp); 

Вы бы затем заменить строку D => din(count_temp), с D => selected_din,.


Вы можете альтернативно написать mux функцию, и ваша линия будет выглядеть D => mux(din, count_temp),. Функция вернет один элемент в din на основе значения count_temp.

В комментарии пользователя @ user1155120 этот метод «функции» не поддерживается вашим компилятором GHDL на момент написания.

+0

Благодарим вас за объяснение. – gutelfuldead

+0

@minersrevolt Нет проблем. Если ответ решает вашу проблему, вы обычно щелкаете «тик» слева от ответа, чтобы отметить его как правильное. –

+0

@ user1155120 Почему это относится к этому сценарию, когда * формальная форма с неограниченным или частично ограниченным составным типом *, похоже, не применяется к этому сценарию, где формальное просто 'std_logic'? Должен ли я редактировать свой ответ, чтобы сказать, что метод «function» на самом деле не работает в GHDL, это ваша точка? –