Сигнал не может инициализировать целочисленное значение в VHDL

В следующем коде я инициализировал cipher_temp2 к целочисленному значению 1. Но когда я моделирую свой код, я вижу, что значение cipher_temp2 инициализируется в 0 вместо. Я не могу понять, где я ошибся.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ciphercalculation is
      Port ( Msg_temp2 : in integer;
                cipher : out integer);
end ciphercalculation;

architecture Behavioral of ciphercalculation is
CONSTANT e1: std_logic_vector(0 TO 2) := ('1', '0', '1');
CONSTANT Pk:integer:=377;
CONSTANT le:integer:=2;
Signal cipher_temp2:integer:=1;
begin
process(cipher_temp2,Msg_temp2)
begin
for i in 0 to le loop
        if (e1(i)= '0') then
            cipher_temp2<=((cipher_temp2*cipher_temp2) mod Pk);
        else
            cipher_temp2<=((cipher_temp2*cipher_temp2) mod Pk);
            cipher_temp2<=((cipher_temp2*Msg_temp2)mod Pk);
        end if;
    end loop;

cipher<=cipher_temp2;
    end process;

end Behavioral;

1 ответ

  1. Во-первых, я хотел бы предложить несколько вещей, начиная с использования std_logic_vectorили std_logicна вашем отображении порта. Это сделает его гораздо проще, когда у вас есть различные модули или даже должны взаимодействовать Verilog/VHDL/SystemVerilog. Кроме того, наличие часов на вашем интерфейсе сделает работу более гладкой и облегчит отладку.

    Теперь вы должны знать, что моделирование не является истинным моделированием FPGA, но инструменты Xilinx стараются изо всех сил. В FPGA есть сигнал dirven ко всей логике on power on, GSR или Global Set/Reset. Этот сигнал диктует, как будет инициализироваться каждый провод / регистр / лист / ячейка.

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

    В общем случае значение должно быть инициализировано тем, что вы диктуете в объявлении, однако, поскольку это моделирование (и использование двигателя vivado), оно может не имитировать так, как вы думаете.
    Если вы синтезируете это с Xilinx, также обратите внимание, что начальные значения не являются частью стандартов синтеза, инструменты должны поместить значение в LUT для вас. В то время как вы имитируете, однако, инструменты будут пытаться действовать так, как будто это FPGA, однако он будет только имитировать стимулы, которые вы даете ему.
    Это может быть вашей проблемой, поскольку симулятор vivado немного лучше, чем ISE (хотя они все еще используют то же кодовое имя, двигатель vivado имеет улучшения).

    Чтобы обойти это, я предлагаю вам простое условие сброса, которое диктует, каким должно быть ваше начальное значение. Также обратите внимание, что стандарт Xilnix должен удерживать сброс для ~ 5us.