2017-01-25 10 views
0

잠시 동안이 문제로 인해 어려움을 겪었습니다. 누군가 도움이된다면 정말 감사 할 것입니다. 어떤 해결책도없이 대부분의 코드를 반복적으로 사용했습니다. 사용중인 코드 세트가 있습니다. 이 bcd 카운터는 나머지 프로젝트에서 더 많이 사용됩니다. 상수에 대한 VHDL 경고 : (vcom-1263) 구성 사양 "all : bcd"는 구성 요소 인스턴스화 문에 적용되지 않습니다.

LIBRARY IEEE; 
    USE IEEE.STD_LOGIC_1164.ALL; 
    USE IEEE.NUMERIC_STD.ALL; 
    USE WORK.mypackage_p.ALL; 

    ENTITY bcd_8counter_e IS 
    PORT(
    res_i, clk_i, enable_i, counter_res_i  : IN STD_LOGIC; 
     bcd_array_o      : OUT bcd_array_t 
    ); 
    END bcd_8counter_e; 

    ARCHITECTURE bcd_8counter_a OF bcd_8counter_e IS 

    COMPONENT bcd 
    PORT(
     res_i, clk_i, enable_i, counter_res_i : IN STD_LOGIC; 
     bcd_o     : OUT STD_LOGIC_VECTOR(bcd_width_c-1 DOWNTO 0); 
     carry_o     : OUT STD_LOGIC 
    ); 
    END COMPONENT; 

    SIGNAL bcd_array_s : bcd_array_t; 
    SIGNAL enable_s  : STD_LOGIC_VECTOR(no_of_digits_c-1 DOWNTO 0); 
    SIGNAL carry_s : STD_LOGIC_VECTOR(no_of_digits_c-1 DOWNTO 0); 

    FOR ALL : bcd USE ENTITY WORK.bcd_e (bcd_a); 

    BEGIN 

    carry_s(0) <= enable_i; 

    gen_carry : FOR i IN 1 TO (no_of_digits_c-1) GENERATE 
     carry_s(i) <= carry_s((i-1)) AND enable_s((i-1)); 
    END GENERATE gen_carry; 

    gen_bcd : FOR i IN 0 TO (no_of_digits_c-1) GENERATE 
    digitx : bcd PORT MAP(res_i, clk_i, carry_s(i), counter_res_i, bcd_array_s(i), enable_s(i)); 
    END GENERATE gen_bcd; 

    bcd_array_o <= bcd_array_s 

    END bcd_8counter_a; 

내 패키지 파일 8 자리

를 만들 수 위의 BCD 카운터를 사용하여

LIBRARY IEEE; 
    USE IEEE.STD_LOGIC_1164.ALL; 
    USE IEEE.NUMERIC_STD.ALL; 
    USE WORK.mypackage_p.ALL; 

    ENTITY bcd_e IS 
    PORT(
    res_i, clk_i, enable_i, counter_res_i : IN STD_LOGIC; 
    bcd_o     : OUT STD_LOGIC_VECTOR(bcd_width_c-1 DOWNTO 0); 
    carry_o     : OUT STD_LOGIC 
    ); 
    END bcd_e; 
    ARCHITECTURE bcd_a OF bcd_e IS 

    SIGNAL count_s : INTEGER RANGE bcd_cnt_c DOWNTO 0; 

    BEGIN 

    PROCESS(res_i, clk_i) 
    BEGIN 
    IF (res_i = '1') THEN 
     count_s <= 0; 
    ELSIF (clk_i = '1' AND clk_i'EVENT) THEN 
     IF (enable_i = '1') THEN 
      IF(count_s >= bcd_cnt_c) THEN 
       count_s <= 0; 
      ELSE 
       count_s <= count_s + 1; 
      END IF; 
     END IF; 
     IF (counter_res_i = '1') THEN 
      count_s <= 0; 
     END IF; 
    END IF; 
    END PROCESS; 

    bcd_o <= STD_LOGIC_VECTOR(to_unsigned(count_s, bcd_width_c)); 
    carry_o <= '1' WHEN (count_s = bcd_cnt_c) ELSE '0'; 

    END bcd_a; 

8 자리 BCD :

BCD 카운터 한 자리에 : 나는 필요한 코드 아래를 추가했습니다 예 :

경고 : /home/stud/mr-131416/Desktop/VHDL_Project_Latest/src/bcd_counter8_a.vhd(15) : (VCOM-1263) 구성 사양 "모든 : BCD"성분, 인스턴스 문에 적용됩니다.

이 경고 때문에 코드가 테스트 벤치의 테스트/시뮬레이션을 통과하지 못합니다. 도움말 정말 감사하겠습니다.

+0

당신이 엔티티 인스턴스에 적용하고 있기 때문에 그것은 구성 요소 인스턴스에 적용되지 않습니다! 엔티티 작업을 삭제하고 무슨 일이 일어나는 지 봅니다. –

+0

세미콜론이 누락되었습니다 :'bcd_array_o <= bcd_array_s'. – user1155120

답변

2

범위의 문제입니다. 구성 요소 구성은 구성 요소 인스턴스화를 구성합니다. generate 문은 블록 문 (또는 포트 맵이 제공 될 때 중첩 된 블록 문)을 생성합니다.

블록 선언문 (내부 또는 외부 블록 용)은 구성 선언에서만 발견되는 블록 구성을 사용합니다.

-- for all : bcd use entity work.bcd_e (bcd_a); 

begin 

    carry_s(0) <= enable_i; 

gen_carry : 
    for i in 1 to (no_of_digits_c-1) generate 
     carry_s(i) <= carry_s((i-1)) and enable_s((i-1)); 
    end generate gen_carry; 

gen_bcd : 
    for i in 0 to (no_of_digits_c-1) generate 
     for all: bcd use entity work.bcd_e (bcd_a); 
    begin 

    digitx : bcd port map (res_i, clk_i, carry_s(i), 
          counter_res_i, bcd_array_s(i), enable_s(i)); 
    end generate gen_bcd; 

    bcd_array_o <= bcd_array_s; -- CHANGED WAS MISSING SEMICOLON 

end bcd_8counter_a; 

참고에 누락 된 세미콜론

바인딩 표시는 구성 선언을 사용하거나 구성 사양을 이동할 수 있습니다 구성 요소의 인스턴스를 지정하는 블록으로 아래로 도달 할 수있는 능력없이, 계층 적 없습니다 bcd_array_o에 대한 대입 문이 추가되었습니다.

이러한 변경 사항으로 설계가 분석되어 경고없이 정교하게 진행됩니다.

대부분의 구성 도구가 구성 선언을 지원하지만 모든 합성 도구가 구성 사양을 지원하는 것은 아닙니다.

참조 IEEE 표준 1076에서 2008 사이 7.3 구성 사양, 3.4 구성 선언, 3.4.2 블록 구성

시뮬레이션 또는 BCD 실체가 아니므로 된 DistX 구성 요소 인스턴스화 언 바운드 때문에 것 합성 실패 작업 디렉토리에 있습니다.동기 리셋을 호출하지 않고 간단한 테스트 벤치 작성

는 10 ns의 기간이 클록을 사용하며, 10 밀리 초 동안 실행 :

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use work.mypackage_p.all; 

entity tb is 
end entity; 

architecture foo of tb is 
    signal reset:  std_logic;   -- '1' for RESET 
    signal clk:   std_logic := '0'; 
    signal en:   std_logic;   -- '1' for ENABLE 
    signal syn_reset: std_logic;   -- '1' for SYNCHRONOUS RESET 
    signal bcd_array: bcd_array_t; 

begin 
DUT: 
    entity work.bcd_8counter_e 
     port map (
      res_i => reset, 
      clk_i => clk, 
      enable_i => en, 
      counter_res_i => syn_reset, 
      bcd_array_o => bcd_array 
     ); 
CLOCK: 
    process 
    begin 
     wait for 5 ns; 
     clk <= not clk; 
     if now > 10 ms then 
      wait; 
     end if; 
    end process; 
STIMULI: 
    process 
    begin 
     wait for 10 ns; 
     reset <= '0'; 
     en <= '0'; 
     syn_reset <= '0'; 
     wait for 10 ns; 
     reset <= '1'; 
     wait for 20 ns; 
     reset <= '0'; 
     wait for 20 ns; 
     en <= '1'; 
     wait; 
    end process; 
end architecture; 

카운터 활성화에 의존한다는 것을 보여주고 보여주는 제 6 그 숫자 일 :

bcd_8counter_e_tb.png

+0

컴파일러 경고가 사라졌습니다.하지만 테스트 벤치를 사용하여 테스트하면 U 출력이 나오므로 입력이 bcd_e로 전달되지 않습니다. 테스트 벤치 코드가 너무 길어 입력 할 수 없습니다. –

+0

보이지 않는 코드에 대해 통찰력있는 의견을 제시하는 것은 불가능합니다. 모든 입력을 유용한 상태로 유도하고 있습니까? – user1155120

+0

'U의 일반적인 원인 중 하나는 여러 개의 드라이버가 있습니다. 출력이 다른 프로세스 (잠재적으로 외부 블록 (구성 요소)에 있음)에 의해 구동되고 있습니까? – user1155120