Синтаксис VHDL для массивов часов (принят синтезом, но не имитатором Active-HDL) - PullRequest
2 голосов
/ 06 апреля 2011

У меня проблема с некоторым синтаксисом VHDL в каком-то старом коде, который я хочу использовать повторно.Он принят инструментом синтеза (Synplify), но симулятор (Aldec Active-HDL 8.3) выдает следующую ошибку.(Примечание: эта конструкция была принята предыдущей версией этого симулятора).

# Ошибка: COMP96_0228: buffered_data.vhdl: (19, 28): фактическая должна обозначаться именем статического сигнала, еслифактический связан с параметром сигнала любого режима.

Я получаю, что ошибка не любит (i) в сигнале clk (i), но я не хочу развернуть цикл в (0), (1) и т. Д., Поскольку он используется в нескольких различных конфигурациях для портов разных размеров, и я уверен, что должен быть способ описать это.

Мое решение до сих пор заключается в инкапсуляции одного экземпляра в его собственномиерархия сущностей / арок и использование «генерации» для создания экземпляра один раз для каждого порта, но мне это не нравится.Есть идеи получше?

Очень упрощенный пример, показывающий именно мою проблему.(Цель состоит в том, чтобы гарантировать, что данные сначала синхронизируются в FPGA, используя собственные связанные часы, прежде чем что-либо еще)

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity input_buffer is
     port(
         clk : in std_logic_vector;
         data_in : in std_logic_vector;
         data_out : out std_logic_vector
         );
end input_buffer;

architecture rtl of input_buffer is
    constant c_NumOfPorts : integer := 3;
begin

    p_process: process(clk)
    begin
        for i in 0 to c_NumOfPorts-1 loop
            if rising_edge(clk(i)) then -- error here
                data_out(i) <= data_in(i);
            end if;
        end loop;
    end process;

end rtl;

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Если вы измените цикл внутри процесса на оператор генерирования вне процесса, он прекрасно работает в ModelSim (у меня нет Aldec в наличии), и IMHO кажется чище, чем отдельный процесс с кучей часов.Я также обычно использовал бы универсальный для определения ширины портов, а не выдвигал их как константу в архитектуре, но я думаю, у вас есть некоторые причины сделать это таким образом:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity input_buffer is
     port(
         clk : in std_logic_vector;
         data_in : in std_logic_vector;
         data_out : out std_logic_vector
         );
end input_buffer;

architecture rtl of input_buffer is
    constant c_NumOfPorts : integer := 3;
begin

    gen : for i in 0 to c_NumOfPorts-1 generate
    begin
        p_process: process(clk(i))
        begin
            if rising_edge(clk(i)) then -- error here
                data_out(i) <= data_in(i);
            end if;
        end process;
    end generate;

end rtl;
0 голосов
/ 06 апреля 2011

FWIW, я получаю то же самое с Modelsim:

Model Technology ModelSim PE vcom 10.0a Compiler 2011.02 Feb 20 2011
-- Loading package STANDARD
-- Loading package TEXTIO
-- Loading package std_logic_1164
-- Compiling entity input_buffer
-- Compiling architecture rtl of input_buffer
** Error: clk.vhd(19): (vcom-1450) Actual (indexed name) for formal "s" is not a static signal name.
** Error: clk.vhd(25): VHDL Compiler exiting

Как отступление - есть ли причина для вашего использования constant, а не просто для этого?

    for i in clk'range loop

Но никакого реального ответа мне пока не пришло, извините!

...