2017-04-06 12 views
1

D- 플립 플롭 및 멀티플렉서로 만든 쉬프터 용으로 작성된 VHDL 코드가 있습니다.이 멀티플렉서는 실행되고 구문이 올바른지 확인합니다. 그러나 이제는 테스트 벤치에서 작업 중이기 때문에 오류가 발생합니다.엔티티가 구성 요소 포트와 일치하지 않습니다.

VHDL 코드는 다음과 같습니다 테스트 벤치에서 문법을 검사 할 때 올

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY MUX41 IS 
PORT (i3, i2, i1, i0 : IN BIT; 
s: IN BIT_VECTOR(1 DOWNTO 0); 
o: OUT BIT); 
END MUX41; 
ARCHITECTURE arch_mux41 OF MUX41 IS 
BEGIN 
PROCESS(i3, i2, i1, i0, s) 
BEGIN 
CASE s IS 
WHEN "00" => o <= i0; 
WHEN "01" => o <= i1; 
WHEN "10" => o <= i2; 
WHEN "11" => o <= i3; 
WHEN OTHERS => NULL; 
END CASE; 
END PROCESS; 
END arch_mux41; 

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY DFF IS 
PORT(d, clk : IN BIT; 
q, qb : OUT BIT); 
END DFF; 
ARCHITECTURE arch_dff OF DFF IS 
BEGIN 
PROCESS(clk) 
VARIABLE q_temp : BIT; 
BEGIN 
IF(clk'EVENT AND clk='1')THEN 
q_temp := d; 
END IF; 
q <= q_temp; 
qb <= NOT q_temp; 
END PROCESS; 
END arch_dff; 

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY UShift IS 
PORT(clk, il, ir : IN BIT; 
s: IN BIT_VECTOR(1 DOWNTO 0); 
i : IN BIT_VECTOR(3 DOWNTO 0); 
q : OUT BIT_VECTOR(3 DOWNTO 0)); 
END UShift; 

ARCHITECTURE struct OF UShift IS 

COMPONENT MUX41 
PORT (i3, i2, i1, i0 : IN BIT; 
s: IN BIT_VECTOR(1 DOWNTO 0); 
o: OUT BIT); 
END COMPONENT; 

COMPONENT DFF 
PORT(d, clk : IN BIT; 
q, qb : OUT BIT); 
END COMPONENT; 

FOR U1, U2, U3, U4: MUX41 USE ENTITY WORK.MUX41(arch_mux41); 
FOR U5, U6, U7, U8: DFF USE ENTITY WORK.DFF(arch_dff); 
SIGNAL o: BIT_VECTOR(3 DOWNTO 0); 
SIGNAL qb: BIT_VECTOR(3 DOWNTO 0); 
SIGNAL qt:BIT_VECTOR(3 DOWNTO 0); 
BEGIN 
U1:MUX41 PORT MAP(il,qt(2), i(3), qt(3), s, o(3)); 
U2:MUX41 PORT MAP(qt(3), qt(1), i(2), qt(2), s, o(2)); 
U3:MUX41 PORT MAP(qt(2), qt(0), i(1), qt(1), s, o(1)); 
U4:MUX41 PORT MAP(qt(1), ir, i(0), qt(0), s, o(0)); 
U5:DFF PORT MAP(o(3), clk, qt(3), qb(3)); 
U6:DFF PORT MAP(o(2), clk, qt(2), qb(2)); 
U7:DFF PORT MAP(o(1), clk, qt(1), qb(1)); 
U8:DFF PORT MAP(o(0), clk, qt(0), qb(0)); 
q <= qt; 
END struct; 

오류 메시지 만 나타납니다. 엔티티가 "clk", "il", "ir", "i", "s"및 "q"에 대한 구성 요소 포트와 일치하지 않는다고 나와 있습니다. 누구든지 내가 잘못 생각한 것에 대한 아이디어가 있습니까? 유사한 문제에 대한 온라인 제안을 읽었으나이 특정 코드에 실제로 적용된 것은 없습니다.

테스트 벤치는 다음과 같습니다

LIBRARY ieee; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE ieee.numeric_std.ALL; 

ENTITY UShift_test IS 
END UShift_test; 

ARCHITECTURE behavior OF UShift_test IS 
    -- Component Declaration for the Unit Under Test (UUT) 
    COMPONENT UShift 
    PORT(clk : IN std_logic; il : IN std_logic; ir : IN std_logic; i : IN std_logic_vector(3 downto 0); s:IN std_logic_vector(1 downto 0); 
    q : OUT std_logic_vector(3 downto 0)); 
    END COMPONENT; 

    --Inputs 
    signal clk : std_logic := '0'; 
    signal il : std_logic := '0'; 
    signal ir : std_logic := '0'; 
    signal s : std_logic_vector(1 downto 0) := (others => '0'); 
    signal i : std_logic_vector(3 downto 0) := (others => '0'); 

    --Outputs 
    signal q : std_logic_vector(3 downto 0); 
    -- Clock period definitions 
    constant clk_period : time := 20 ns; 

BEGIN 
    -- Instantiate the Unit Under Test (UUT) 
    uut: UShift PORT MAP (
      clk => clk, 
      il => il, 
      ir => ir, 
      s => s, 
      i => i, 
      q => q); 

    -- Clock process definitions 
    clk_process :process 
    begin 
     clk <= '0'; 
     wait for clk_period/2; 
     clk <= '1'; 
     wait for clk_period/2; 
    end process; 

    -- Stimulus process 
    stim_proc: process 
    begin   
    ---- test clr 
     ir<= '0'; 
     wait for 40ns; 
    ---- test parallel loading 
     ir<= '1'; 
     s<= "11"; 
     i<= "0010"; 
     wait for 40ns; 
    ---- test shift right 
     s<= "01"; 
     il<='1'; 
    wait; 
    end process; 
END; 

답변

3

예. 여기

ENTITY UShift IS 
PORT(clk, il, ir : IN BIT; 
s: IN BIT_VECTOR(1 DOWNTO 0); 
i : IN BIT_VECTOR(3 DOWNTO 0); 
q : OUT BIT_VECTOR(3 DOWNTO 0)); 
END UShift; 

UShift_test에 해당하는 구성 요소입니다 : 당신이 볼 수 있듯이

COMPONENT UShift 
PORT(clk : IN std_logic; il : IN std_logic; ir : IN std_logic; i : IN std_logic_vector(3 downto 0); s:IN std_logic_vector(1 downto 0); 
q : OUT std_logic_vector(3 downto 0)); 
END COMPONENT;`: 

, 그들은 다른 여기 UShift의 실체이다. 구성포트 맵 (유형 변환 함수 포함)을 사용하지 않으면 구성 요소와 엔티티가 동일해야합니다. 구성을 사용하여이 문제를 해결하지 않는 것이 좋습니다. 대신 유형을 일치 시켜서 변경하는 것이 좋습니다. 디자인에유형을 사용했습니다. 이는 특이합니다. 좋은 이유가없는 한 BIT 유형을 STD_LOGIC (그리고 해당하는 벡터)으로 변경했습니다.

그리고 왜 구성 요소 인스턴스화을 사용하고 있습니까? 직접 인스턴스화은 입력하기가 쉽고 구성 요소 인스턴스화가 제공하는 추가 유연성이 일반적으로 필요하지 않습니다. 다음은 두 가지 방법을 비교하는 예제입니다. https://www.edaplayground.com/x/2QrS.

+3

"그리고 왜 구성 요소 인스턴스화를 사용하고 있습니까?" 아마도 이것을 사용하는 많은 교육 자료가 있기 때문에 :( –

+0

@scary_jeff 2001 년 이전 스타일의 Verilog 포트를 사용하는 교육 자료가 많이있는 것처럼 ... –