Почему я получаю ошибку Inferred Latch? - PullRequest
0 голосов
/ 03 декабря 2018

Я получаю сообщение об ошибке: [Synth 8-327] выводит защелку для переменной 'd_reg' по адресу строки 1 <= d (31 DOWNTO 0) за прошедший час.Я не уверен, почему я не получаю эту ошибку.Я добавил все переменные из моего входного списка в процесс, и я добавил, и еще для всех операторов if в моем коде.Это две известные мне причины, по которым я имею ввиду защелки, но оказывается, что я все еще их получаю. </p>

Кто-нибудь видит мою проблему?

PORT (d        : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
     address  : IN    STD_LOGIC_VECTOR(31 DOWNTO 0) ;
     ce_l     : IN    STD_LOGIC ;
     oe_l     : IN    STD_LOGIC ;
     we_l     : IN    STD_LOGIC ;
     results : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --binary for which segments of digit to turn on
     anodesList : INOUT STD_LOGIC_VECTOR(7 downto 0) := "00000000"; --binary for which annode to turn on
     clk      : IN    STD_LOGIC) ;

(Часть) моейкод:

SIGNAL address1 : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
SIGNAL check : STD_LOGIC_VECTOR(0 DOWNTO 0) := "0";
writeprocess:PROCESS(clk, ce_l,we_l, address1, check)
   begin
      IF (clk = '1' AND clk'event) THEN
          IF(check = "1") THEN
             IF (ce_l = '0' AND we_l = '0') THEN
                address1 <= d(31 DOWNTO 0); 
             ELSE
                address1 <= address1;
             END IF;
           ELSE
                address1 <= address1;
           END IF;
       ELSE
           address1 <= address1;
       END IF;
   END PROCESS writeprocess ;

1 Ответ

0 голосов
/ 03 декабря 2018

Обычно вы получаете выводимые защелки, когда вы не предоставляете обновленные назначения для сигнала во всех возможных вариантах оператора if / else или case в процессе.

В вашем случае оператор процесса включает 5сигналы, но имеют значение только два (clk и address1).У вас есть правильно сформированный синхронный условный оператор для "IF (clk = '1' AND clk'event) THEN", но есть предложение ELSE , которое, вероятно, является причиной ваших проблем.VHDL оставит значение сигнала в своем предыдущем состоянии, если вы явно не измените его, поэтому нет необходимости в:

ELSE
   address1 <= address1;

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

writeprocess:PROCESS(clk)
   begin
      IF (clk = '1' AND clk'event) THEN
          IF(check = "1") THEN
             IF (ce_l = '0' AND we_l = '0') THEN
                address1 <= d(31 DOWNTO 0); 
             ELSE
                address1 <= address1;
             END IF;
           ELSE
                address1 <= address1;
           END IF;
       END IF;
   END PROCESS writeprocess ;
...