Как использовать последовательные операторы (например, процесс), чтобы сделать постоянное значение, но без ожидания?

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

Я определил диапазон, используя:

subtype FIELD is natural range 3 downto 0;

Тогда процесс, создающий значение, может выглядеть так:

process is
begin
    reg <= (others => '0');
    reg(FIELD) <= (others => '1');
    wait;  -- Error in Xilinx ISE
end process;

Однако wait не принимается инструментом синтеза Xilinx ISE.

Один из способов, конечно, использовать неиспользуемый сигнал в списке процессов, например часы, но это довольно некрасиво.

Параллельный стиль будет выглядеть так:

reg <= (FIELD => (others => '1'), others => '0');

Но FIELD нельзя так использовать в VHDL.

Есть ли способ сделать константы с помощью последовательных операторов, но где wait не требуется в process?


person EquipDev    schedule 14.12.2016    source источник
comment
вам не нужен процесс для присвоения постоянного значения сигналу. Сделайте это прямо в архитектуре.   -  person A. Kieffer    schedule 14.12.2016
comment
Да, я знаю об этом, но я предпочитаю использовать ту же структуру для генерации содержимого регистра, даже если оно содержит постоянное значение, поэтому позже я могу обновить его до непостоянного вывода в той же структуре.   -  person EquipDev    schedule 14.12.2016


Ответы (1)


Вы можете использовать функцию, чтобы сделать это. Обратите внимание: я не проверяю диапазон ошибок, но это несложно.

-- subtypes
subtype FIELD is natural range 3 downto 0;

-- functions
function test_func(a: std_logic_vector) return std_logic_vector is
    variable result : std_logic_vector(a'left downto a'right) := a;
begin
    result(FIELD) := (others => '1');
    return result;
end function;

-- constants
constant ALL_ZEROS  : std_logic_vector(7 downto 0) := (others => '0');

-- signals
signal reg          : std_logic_vector(7 downto 0) := test_func(ALL_ZEROS);
person David K    schedule 15.12.2016
comment
Хорошо использовать функцию, позволяющую выполнять последовательные операторы, а затем просто использовать функцию для инициализации reg. Возможно, в этом случае reg даже должно быть константой. Кстати. ALL_ZEROS не требуется, если результат инициализируется с помощью result := (others => '0'); в начале. Я дам ему пару дней, чтобы увидеть, является ли это лучшей идеей. - person EquipDev; 15.12.2016