문제
어큐뮬레이터로 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 패키지를 컴파일하고 작업 라이브러리로 이동 한 다음 디자인을 컴파일하십시오. 이것 가지다 일하다.