현재 피보나치 알고리즘의 상위 레벨 설명 (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"
나는 항상 같은 경고를받습니다. 그들은 문제를 일으키지 않으며 나는 항상 그것을 무시하는 것 같습니다. – Daniel
중요한 질문은 : 시뮬레이션에서 올바르게 작동 했습니까? 이 메시지는 출력 비트가 '1'또는 '0'(일부)임을 나타냅니다. 예를 들어 당신은 서명 한 피보나치 숫자를 사용하고 있습니다. 절대 안됩니다. 괜찮습니다. 출력이 항상 1이되도록 mux sel이 멈추었 기 때문에 수정해야 할 문제가 있습니다. 아, 그리고 당신은 요즘 VHDL에서 얼마나 높은 수준의 설명이 신디사이저 될 것인지 놀라게 될 것입니다 ... –
시뮬레이션에서 올바르게 작동하지 않았습니다. 출력 (d_o)은 0 (32 비트)으로 고정되어 표시되어야하는 것을 표시하지 않으며 피보나치 시퀀스입니다. fms가 아무런 경고 나 오류가없는 컴파일로 인해 시간 차트에서 상태가 올바르게 바뀌는 것처럼 보였으므로 mux는 고집하지 않았습니다. 그리고 설명의 수준에 대해서는 RTL이어야합니다. 코스 사양입니다. –