2014-03-28 2 views
0

현재 피보나치 알고리즘의 상위 레벨 설명 (C)을 취해 RTL로 변환해야하는 프로젝트에서 작업 중입니다. VHDL로 작성된 모듈. 그렇게하기 위해, IC 프로토 타이핑에서 널리 공지 된 방법론에서, 합성 가능한 VHDL 코드에서 그러한 고레벨 기술을 변환 할 필요가있다. 즉, 데이터 경로 및 유한 상태 기계 (FSM) 용 VHDL 코드를 작성해야한다.VHDL 경고 중요한 출력에서 ​​경고 "경고 (13024) : 출력 핀이 VCC 또는 GND에서 멈춤"

필자는 데이터 경로와 FSM을 두 개의 서로 다른 파일에 기술하고 피벗 키 모듈을 정의하는 VHDL COMPONENT로 세 번째로 인스턴스화했습니다. Quartus II 소프트웨어를 사용하여 "Analysis & 합성"은 오류없이 "경고 (13024) : Vcc 또는 GND에 출력 핀이 걸렸습니다"라는 매우 불쾌한 경고와 함께 성공합니다. 이 경고를 실제로 성가 시게하는 것은 최종 결과 인 피보나치 모듈의 가장 중요한 결과물에 나타납니다. 이 출력은 내 코드에서 "d_o"라고합니다.

"data_o"출력 핀은 덧셈기, 감산기, 레지스터 및 멀티플렉서와 ​​같은 COMPONENT를 사용하여 설명되는 데이터 경로 구성 요소에서 제공됩니다. 컴파일 (분석 & 설명) 데이터 경로만으로도 동일한 출력에 대해 경고가 다시 표시됩니다.

사실 내 코드가 무엇이 잘못된 것인지 잘 모르는 사람이 나를 도울 수 있기를 바랍니다.

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" 
+0

나는 항상 같은 경고를받습니다. 그들은 문제를 일으키지 않으며 나는 항상 그것을 무시하는 것 같습니다. – Daniel

+0

중요한 질문은 : 시뮬레이션에서 올바르게 작동 했습니까? 이 메시지는 출력 비트가 '1'또는 '0'(일부)임을 나타냅니다. 예를 들어 당신은 서명 한 피보나치 숫자를 사용하고 있습니다. 절대 안됩니다. 괜찮습니다. 출력이 항상 1이되도록 mux sel이 멈추었 기 때문에 수정해야 할 문제가 있습니다. 아, 그리고 당신은 요즘 VHDL에서 얼마나 높은 수준의 설명이 신디사이저 될 것인지 놀라게 될 것입니다 ... –

+0

시뮬레이션에서 올바르게 작동하지 않았습니다. 출력 (d_o)은 0 (32 비트)으로 고정되어 표시되어야하는 것을 표시하지 않으며 피보나치 시퀀스입니다. fms가 아무런 경고 나 오류가없는 컴파일로 인해 시간 차트에서 상태가 올바르게 바뀌는 것처럼 보였으므로 mux는 고집하지 않았습니다. 그리고 설명의 수준에 대해서는 RTL이어야합니다. 코스 사양입니다. –

답변

0

알테라는이 문제에 대한이 말한다; 당신의 출력 중 하나 이상의 시뮬레이션 동안 영구적으로 높거나 낮은 때문에

enter image description here

0

이 오류가 보이고있다. 일반적으로이 문제는 testbench가 모든 출력을 고려하지 않고 일부는 기본값을 할당받을 때 발생합니다. 이 경우에도 디자인에 아무런 영향을 미치지 않습니다.

그러나 유효한 입력을받는 다른 출력이 0 또는 1로 고정되어 있으면 코드가 오류를 검사해야합니다. 이 경우 질문을 편집하여 코드에서 논리적 오류를 검사해야한다는 것을 분명히하십시오.