фактический должен быть вектором индексации статического имени в карте портов.

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

Я создал 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

person gutelfuldead    schedule 09.08.2016    source источник
comment
ghdl -a --std=08 myfile.vhd (и указать тот же флаг для уточнения). Текущие выпуски ghdl (начиная с 0.33) поддерживают довольно много (не все) VHDL-2008. Но это не ваша проблема, как указывает Джефф.   -  person user_1818839    schedule 09.08.2016
comment
IEEE Std 1076-2008 6.5.5.3 para 6 Если фактическая часть данного элемента ассоциации для формального порта блока представляет собой зарезервированное слово inertial, за которым следует выражение, или выражение, которое не является глобально статическим, то данный элемент ассоциации эквивалентен ассоциации порта с анонимным сигналом, неявно объявленным в декларативной области, непосредственно окружающей блок. Сигнал имеет тот же подтип, что и формальный порт, и является целью неявного параллельного оператора присваивания сигнала в форме анонимный ‹= E... ghdl не поддерживает это (пока).   -  person    schedule 09.08.2016
comment
ghdl-updates RoadMap2008 Новые функции VHDL 2008, 6. Объявления, ⸰ анонимно сигнал в предложении порта. (И это не отображается как [Готово]).   -  person    schedule 09.08.2016


Ответы (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 на момент написания.

person scary_jeff    schedule 09.08.2016
comment
Спасибо за объяснение. - person gutelfuldead; 09.08.2016
comment
@minersrevolt Нет проблем. Если ответ решает вашу проблему, вы обычно нажимаете «галочку» слева от ответа, чтобы отметить его как правильный. - person scary_jeff; 09.08.2016
comment
@ user1155120 Почему это применимо к этому сценарию, если formal имеет неограниченный или частично ограниченный составной тип, кажется, не применяется к этому сценарию, где формальное просто std_logic? Должен ли я отредактировать свой ответ, чтобы сказать, что метод «функции» на самом деле не будет работать в GHDL, вы это имеете в виду? - person scary_jeff; 10.08.2016
comment
IEEE Std 1076-2008 6.5.5.3 параграф 6 Если действительной частью данного элемента ассоциации для формального порта блока является ...* или выражение, которое не является глобально статическим, тогда данный элемент ассоциации эквивалентен ассоциации порта с анонимным сигналом, неявно объявленным в декларативной области, непосредственно окружающей блок. Сигнал имеет тот же подтип, что и формальный порт, и является целью неявного параллельного оператора присваивания сигнала в форме анонимный ‹= E*... Вызов функции — это выражение. ghd не выполняет неявные анонимные сигналы (пока). - person ; 10.08.2016
comment
В коде OP и в случае вызова функции ghdl не выполняет анонимные неявные сигналы, это проблема поддержки функции ghdl -2008 (и она где-то в списке TODO). Извините, я не подумал исправить свой комментарий здесь, а также исходный вопрос. Процитировал не тот абзац. - person ; 10.08.2016
comment
@ user1155120 Хорошо, спасибо. Я включил это в ответ. - person scary_jeff; 10.08.2016