Одной из особенностей VHDL является то, что в самом базовом языке предоставляется очень мало функциональных возможностей. Большая часть этого обеспечивается с помощью пакетов. Вторая строка вашего кода является примером этого (используйте ieee.std_logic_1164.all). Это означает, что вы используете весь пакет std_logic_1164. См. здесь для определения этого пакета.
Когда вы пишете код, вы обычно хотите хранить свои сигналы либо в std_logic, либо в std_logic_vector. Для этого есть две причины. Во-первых, std_logic может также представлять значения, отличные от «0» или «1». Он также может представлять «Z» или «X», например. Во-вторых, симуляторы (например, модели, которые вы используете) оптимизированы для ускорения работы с std_logic.
Как правило, рекомендуется всегда делать входные и выходные данные вашей сущности std_logic или std_logic_vector.
Конкретная проблема, с которой вы столкнулись, заключается в том, что вы используете бит типа (который является одним из очень немногих типов, определенных в стандарте VHDL) с xor.
Самое простое решение - изменить вывод 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?