Предупреждение VHDL Предупреждение (13024): выходные контакты застряли на VCC или GND на важном выходе

В настоящее время я работаю над проектом, в котором я должен взять высокоуровневое описание алгоритма Фибоначчи (C) и преобразовать его в модуль RTL, написанный на VHDL. Для этого потребуется преобразовать такое высокоуровневое описание в синтезируемый код VHDL, т. е. нужно будет написать код VHDL для пути данных и конечного автомата (FSM) в методологии, широко известной в прототипировании ИС.

Я описал путь данных и FSM в двух отдельных файлах и создал их в третьем как VHDL COMPONENTs, определяя модуль Фибоначчи. Используя программное обеспечение Quartus II, «Анализ и синтез» выполняются без ошибок и с очень раздражающим предупреждением «Предупреждение (13024): выходные контакты застряли на VCC или GND». Что делает это предупреждение действительно раздражающим, так это то, что оно появляется для наиболее важного вывода модуля Фибоначчи, который является его окончательным результатом. Этот вывод называется «d_o» в моем коде.

Выходной контакт «data_o» исходит от компонента пути данных, который также описывается с использованием КОМПОНЕНТОВ, таких как сумматоры, вычитатели, регистры и мультиплексоры. При компиляции (анализ и синтез) только пути данных предупреждение снова появляется для того же вывода.

Я действительно не знаю, что не так с моим кодом, надеюсь, вы, ребята, сможете мне помочь. Код представлен ниже:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.NUMERIC_STD.ALL;

ENTITY datapath IS
GENERIC (NUMBITS    : NATURAL := 32);
PORT (  SIGNAL rst          : IN STD_LOGIC;
        SIGNAL clk          : IN STD_LOGIC;

        ---Sinal de entrada---
        SIGNAL data_in      : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);

        ---Sinais de seleção---
        SIGNAL di_sel       : IN STD_LOGIC;
        SIGNAL nf_sel       : IN STD_LOGIC;
        SIGNAL na1_sel      : IN STD_LOGIC;
        SIGNAL na2_sel      : IN STD_LOGIC;
        SIGNAL io_sel       : IN STD_LOGIC;
        SIGNAL so0_sel      : IN STD_LOGIC;
        SIGNAL so1_sel      : IN STD_LOGIC;

        ---Sinais load---
        SIGNAL nf_ld        : IN STD_LOGIC;
        SIGNAL di_ld        : IN STD_LOGIC;
        SIGNAL na1_ld       : IN STD_LOGIC;
        SIGNAL na2_ld       : IN STD_LOGIC;
        SIGNAL do_ld        : IN STD_LOGIC;

        ---Sinais das comparações---
        SIGNAL di_eq_0      : OUT STD_LOGIC;
        SIGNAL di_eq_1      : OUT STD_LOGIC;

        ---Sinais de saída---
        SIGNAL irq_o        : OUT STD_LOGIC;
        SIGNAL status_o     : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
        SIGNAL d_o          : OUT STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0));
END datapath;


ARCHITECTURE behavior OF datapath IS
---Componentes do datapath---   
COMPONENT somador
    GENERIC (NUMBITS    : NATURAL := 32);
    PORT (  SIGNAL x    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL y    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL XY   : OUT STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0));
END COMPONENT;

COMPONENT subtrator
    GENERIC (NUMBITS    : NATURAL := 32);
    PORT (  SIGNAL x    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL y    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL XY   : OUT STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0));
END COMPONENT;

COMPONENT reg
    GENERIC (NUMBITS    : NATURAL := 32);
    PORT( SIGNAL rst    : IN STD_LOGIC;
          SIGNAL clk    : IN STD_LOGIC;
          SIGNAL load   : IN STD_LOGIC;
          SIGNAL d      : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
          SIGNAL q      : OUT STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0));
END COMPONENT;

COMPONENT multiplexor2a1
    GENERIC (NUMBITS    : NATURAL := 32);
    PORT (  SIGNAL a    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL b    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL sel  : IN STD_LOGIC;
            SIGNAL f    : OUT STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0));
END COMPONENT;

COMPONENT igual
    GENERIC (NUMBITS    : NATURAL := 32);
    PORT (  SIGNAL a    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL b    : IN STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
            SIGNAL eq   : OUT STD_LOGIC);
END COMPONENT;

---Sinais de conexão---
SIGNAL mux2di           : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL mux2nf           : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL mux2na1          : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL mux2na2          : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);

---Saidas dos registradores---  
SIGNAL nf_o             : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL di_o             : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL na1_o            : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL na2_o            : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);

---Saidas do somador e do subtrator---
SIGNAL a_result         : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL s_result         : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);

---Constatntes---   
SIGNAL one              : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);
SIGNAL zero             : STD_LOGIC_VECTOR(NUMBITS-1 DOWNTO 0);

BEGIN
zero <= "00000000000000000000000000000000";
one  <= "00000000000000000000000000000001";

---Lógica para irq_o---
WITH io_sel SELECT
    irq_o <= '0' WHEN '0', '1' WHEN OTHERS;

---Lógica para status_o---
WITH so0_sel SELECT
    status_o(0) <= '0' WHEN '0', '1' WHEN OTHERS;
WITH so1_sel SELECT
    status_o(1) <= '0' WHEN '0', '1' WHEN OTHERS;

---Multiplexadores(4)---
mux1: multiplexor2a1 GENERIC MAP(NUMBITS) PORT MAP (data_in, s_result, di_sel, mux2di);
mux2: multiplexor2a1 GENERIC MAP(NUMBITS) PORT MAP (one, nf_o, nf_sel, mux2nf);
mux3: multiplexor2a1 GENERIC MAP(NUMBITS) PORT MAP (zero, na1_o, na1_sel, mux2na1);
mux4: multiplexor2a1 GENERIC MAP(NUMBITS) PORT MAP (a_result, di_o, na2_sel, mux2na2);

---Registradores(5)---  
d_i: reg GENERIC MAP (NUMBITS) PORT MAP (rst, clk, di_ld, mux2di, di_o);
na1: reg GENERIC MAP (NUMBITS) PORT MAP (rst, clk, na1_ld, mux2na1, na1_o);
na2: reg GENERIC MAP (NUMBITS) PORT MAP (rst, clk, na2_ld, mux2na2, na2_o);
nf:  reg GENERIC MAP (NUMBITS) PORT MAP (rst, clk, nf_ld, mux2nf, nf_o);
do:  reg GENERIC MAP (NUMBITS) PORT MAP (rst, clk, do_ld, nf_o, d_o);

---Somador---
a: somador GENERIC MAP(NUMBITS) PORT MAP (na1_o, na2_o, a_result);

---Subtrator---   
s: subtrator GENERIC MAP(NUMBITS) PORT MAP (di_o, one, s_result);

---Comparadores (2)---
eq0:  igual GENERIC MAP(NUMBITS) PORT MAP (di_o, zero, di_eq_0);
eq1:  igual GENERIC MAP(NUMBITS) PORT MAP (di_o, one, di_eq_1);
END ARCHITECTURE;

И предупреждение:

"Warning (13024): Output pins are stuck at VCC or GND"

person José Eduardo Bueno    schedule 28.03.2014    source источник
comment
Я тоже постоянно получаю одно и то же предупреждение. Кажется, что они не создают проблем, и я всегда их игнорирую.   -  person Daniel    schedule 29.03.2014
comment
Важный вопрос: правильно ли это работало в моделировании? Сообщение сообщает вам, что (некоторые) выходные биты имеют значение 1 или 0. Если это потому, что, например. вы используете числа со знаком, а числа Фибоначчи никогда не идут -ve, это нормально. Если это связано с тем, что выбор мультиплексора застрял, поэтому на выходе всегда 1, вам нужно решить проблему. О, и вы можете быть удивлены, насколько высокоуровневым будет синтезирование описания в VHDL в наши дни...   -  person user_1818839    schedule 29.03.2014
comment
В симуляции это работало некорректно. Выход (d_o) застревает в 0 (32 бита), поэтому не показывает то, что он должен показывать, то есть последовательность Фибоначчи. Я не думаю, что mux sel застрял, потому что fsm компилируется без предупреждений или ошибок и, похоже, правильно меняет состояния на временной диаграмме. А насчет уровня описания, это должно быть RTL, это спецификация курса   -  person José Eduardo Bueno    schedule 29.03.2014
comment
Затем вы должны отладить его. Для каждого регистра, мультиплексора и т. д., если на выходе 0, правильные ли входные данные? В конце концов, вы вернетесь к ошибке. Когда он заработает в симе, попробуйте синтезатор еще раз.   -  person user_1818839    schedule 29.03.2014


Ответы (2)


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

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

person Qazi    schedule 05.12.2015

Altera говорит об этом по этому вопросу;

введите здесь описание изображения

person Sabri Meviş    schedule 04.12.2015