문제

어큐뮬레이터로 4 비트 이진 가산기를 코딩하고 있습니다.

library ieee;
use ieee.std_logic_1164.all;

entity binadder is
    port(n,clk,sh:in bit;
        x,y:inout std_logic_vector(3 downto 0);
        co:inout bit;
        done:out bit);
end binadder;

architecture binadder of binadder is
    signal state: integer range 0 to 3;
    signal sum,cin:bit;
begin
    sum<= (x(0) xor y(0)) xor cin;
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);

    process
    begin
        wait until clk='0';
        case state is
            when 0=>
                if(n='1') then
                    state<=1;
                end if;
            when 1|2|3=>
                if(sh='1') then
                    x<= sum & x(3 downto 1);
                    y<= y(0) & y(3 downto 1);
                    cin<=co;
                end if;
                if(state=3) then
                    state<=0;
                end if;
        end case;
    end process;

    done<='1' when state=3 else '0';
end binadder;

출력 :

- 바이너드의 아키텍처 바이너드를 컴파일합니다

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (15) :

"XOR"라는 디스 픽스 작업자에 대한 실행 가능한 항목이 없습니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (15) :

유형의 오류를 유형으로 해결합니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

Infix 연산자 "및"에 대한 실행 가능한 항목이 없습니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

Infix 표현의 오른쪽 피연산자 "또는".

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

Infix 연산자 "및"에 대한 실행 가능한 항목이 없습니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

디픽스 표현의 왼쪽 피연산자 "또는".

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

Infix 표현의 오른쪽 피연산자 "또는".

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (16) :

유형의 오류를 유형으로 Disix 표현식 "또는"std.standard.bit으로

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (28) :

Infix 연산자 "&"에 대한 실행 가능한 항목이 없습니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (28) :

유형의 오류를 유형으로 해결합니다.

** 오류 : c :/modeltech_pe_edu_6.5a/examples/binadder.vhdl (39) :

VHDL 컴파일러 종료

나는 std_logic_vector를 올바르게 처리하지 않는다고 생각합니다. 방법을 알려주세요? :(

도움이 되었습니까?

해결책

VHDL의 기능 중 하나는 기본 언어 자체에서 기능이 거의 제공되지 않는다는 것입니다. 대부분은 패키지를 사용하여 제공됩니다. 코드의 두 번째 줄은 이것의 예입니다 (ieee.std_logic_1164.all 사용). 이것은 모든 STD_LOGIC_1164 패키지를 사용하고 있음을 의미합니다. 보다 여기 이 패키지가 정의하는 것에 대해.

코드를 작성하면 일반적으로 신호를 std_logic 또는 std_logic_vector에 저장하려고합니다. 이에 대한 두 가지 이유가 있습니다. 첫 번째는 std_logic이 '0'또는 '1'이외의 값을 나타낼 수 있다는 것입니다. 예를 들어 'z'또는 'x'를 나타낼 수도 있습니다. 두 번째는 시뮬레이터 (예 : 사용중인 Modelim)가 STD_Logic으로 더 빠르게 실행되도록 최적화된다는 것입니다.

일반 대회로서, 엔티티의 입력 및 출력을 std_logic 또는 std_logic_vector를 항상 입력하고 출력하는 것이 좋습니다.

당신이 가진 특정 문제는 xor와 함께 유형 비트 (VHDL 표준에 정의 된 몇 가지 유형 중 하나)를 사용한다는 것입니다.

가장 간단한 솔루션은 엔티티의 CO 출력을 STD_LOGIC 유형으로 변경하고 SUM과 CIN에 대한 선언을 STD_LOGIC 유형으로 변경하는 것입니다.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;

추가 의견은 언어에 내장 된 엄격한 유형 확인 중 일부를 제거하므로 그렇게할만한 이유가 없다면 포트를 아웃하는 것은 일반적으로 나쁜 관행이라는 것입니다. 최상의 솔루션은 엔티티 자체 내에서 신호를 작성하고 신호를 출력에 직접 할당하는 것입니다.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:out std_logic;
         done:out bit);
end binadder;

    signal co_int:std_logic;
 begin
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
    co <= co_int;

마지막 의견 중 하나는 상태의 가치가 1이면 어떻게 2 또는 3이 될 것인가?

다른 팁

논리적 물리 라이브러리 매핑을 살펴보십시오.

물리적 라이브러리에 실제로 패키지가 버려 졌는지 확인하십시오.

다른 버전의 시뮬레이터가있는 다른 버전의 사전 컴파일 헤더를 사용하지 않도록하십시오.

아무것도 작동하지 않으면 IEEE의 로컬 사본을 만들고 std_logic_1164 패키지를 컴파일하고 작업 라이브러리로 이동 한 다음 디자인을 컴파일하십시오. 이것 가지다 일하다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top