Сейчас я работаю с двумя проектами, и у меня есть проблемы с теми же темами, которые нужно исправить - ошибка объявления интерфейса VHDL, известная как ID 10309 (невозможно прочитать интерфейсный объект режима out. Измените режим объекта на буфер).
Итак, первый касается схемы сортировки, которая сравнивает, какая из них большая, а какая нет для двух переменных, и для каждой из них требуется 7 сегментов.
library ieee;
use ieee.std_logic_1164.all;
package use_package is
constant sorting_in_width : integer :=4;
constant sorting_out_width : integer :=4;
subtype sorting_in_value is integer range 0 to 2**sorting_in_width-1;
subtype sorting_out_value is integer range 0 to 2**sorting_out_width-1;
end use_package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use work.use_package.all;
entity SortingCircuit is
port ( a, b : in sorting_in_value;
enable : in std_logic;
min, max : out sorting_out_value);
end SortingCircuit;
architecture SC_Design of SortingCircuit is
signal maxSeg, minSeg : integer range 0 to 15;
begin
process(a,b)
begin
if (enable = '1') then
if (a>b) then
max <= a;
min <= b;
case maxSeg is
when 0 => max <= "1111110";
when 1 => max <= "0110000";
when 2 => max <= "1101101";
when 3 => max <= "1111001";
when 4 => max <= "0111011";
when 5 => max <= "1011011";
when 6 => max <= "1011111";
when 7 => max <= "1110000";
when 8 => max <= "1111111";
when 9 => max <= "1111011";
when 10 => max <= "1111101";
when 11 => max <= "0011111";
when 12 => max <= "0001101";
when 13 => max <= "0111101";
when 14 => max <= "1101111";
when 15 => max <= "1000111";
end case;
case minSeg is
when 0 => b <= "1111110";
when 1 => b <= "0110000";
when 2 => b <= "1101101";
when 3 => b <= "1111001";
when 4 => b <= "0111011";
when 5 => b <= "1011011";
when 6 => b <= "1011111";
when 7 => b <= "1110000";
when 8 => b <= "1111111";
when 9 => b <= "1111011";
when 10 => b <= "1111101";
when 11 => b <= "0011111";
when 12 => b <= "0001101";
when 13 => b <= "0111101";
when 14 => b <= "1101111";
when 15 => b <= "1000111";
end case;
else
max<= b;
min<= a;
case maxSeg is
when 0 => b <= "1111110";
when 1 => b <= "0110000";
when 2 => b <= "1101101";
when 3 => b <= "1111001";
when 4 => b <= "0111011";
when 5 => b <= "1011011";
when 6 => b <= "1011111";
when 7 => b <= "1110000";
when 8 => b <= "1111111";
when 9 => b <= "1111011";
when 10 => b <= "1111101";
when 11 => b <= "0011111";
when 12 => b <= "0001101";
when 13 => b <= "0111101";
when 14 => b <= "1101111";
when 15 => b <= "1000111";
end case;
case minSeg is
when 0 => a <= "1111110";
when 1 => a <= "0110000";
when 2 => a <= "1101101";
when 3 => a <= "1111001";
when 4 => a <= "0111011";
when 5 => a <= "1011011";
when 6 => a <= "1011111";
when 7 => a <= "1110000";
when 8 => a <= "1111111";
when 9 => a <= "1111011";
when 10 => a <= "1111101";
when 11 => a <= "0011111";
when 12 => a <= "0001101";
when 13 => a <= "0111101";
when 14 => a <= "1101111";
when 15 => a <= "1000111";
end case;
end if;
end if;
end process;
end SC_Design;
Как вы могли бы знать, запустив C-Ping и запустив его, вы заметите, что max не подходит для 7-сегментного кода. То же самое относится и к другому коду — который является BCD Adder, конечно, должен быть 7-сегментным — имеет ту же тему.
library ieee;
use ieee.std_logic_1164.all;
package use_package is
constant add_width : integer := 4;
constant result_width: integer :=4;
subtype add_value is integer range 0 to 2**add_width-1;
subtype result_value is integer range 0 to 2**result_width-1;
end use_package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.use_package.all;
entity BCDAdder is
port( a,b : in add_value; --in integers
mid_sum_out : out result_value;
seg1 : out std_logic_vector(7 downto 0);
seg2 : out std_logic_vector(7 downto 0));
end BCDAdder;
architecture arch of BCDAdder is
begin
process(a,b)
variable carry : integer; --middle integer for carry, will be 7-segmentated after calculated
begin
mid_sum_out <= 0;
mid_sum_out <= a + b; -- possible mid_sum, like 0A or so
if (mid_sum_out > 9) then --!error point!
seg1 <= "0110000"; --changes into 7-segmentated digits
carry <= resize((mid_sum_out - 9),1);
else
seg1 <= "1111110";
carry <= mid_sum_out;
end if;
case carry is
when 0 => seg2 <= "1111110";
when 1 => seg2 <= "0110000";
when 2 => seg2 <= "1101101";
when 3 => seg2 <= "1111001";
when 4 => seg2 <= "0111011";
when 5 => seg2 <= "1011011";
when 6 => seg2 <= "1011111";
when 7 => seg2 <= "1110000";
when 8 => seg2 <= "1111111";
when 9 => seg2 <= "1111011";
when 10 => seg2 <= "1111101";
when 11 => seg2 <= "0011111";
when 12 => seg2 <= "0001101";
when 13 => seg2 <= "0111101";
when 14 => seg2 <= "1101111";
when 15 => seg2 <= "1000111";
end case;
end process;
end arch;
По крайней мере, я помню, что современные инструменты программирования, такие как C, python и Java, имеют разрешение, позволяющее последним переменным выполнять свою работу либо переходить в другую форму, либо работать как переменная в функции.
Что означает эта ошибка? И как мне это исправить?
Интерфейсный объект режима out не может быть прочитан: в версиях VHDL до VHDL 2008 порты режима out
не могли быть прочитаны внутри кода. У вас есть пример: carry <= mid_sum_out;
, где mid_sum_out
— выходной порт объекта.
Ответы на это:
signal mid_sum_out_i : result_value;
...
mid_sum_out_i <= a + b;
carry <= mid_sum_out_i;
... outside process
mid_sum_out <= mid_sum_out_i;
out
на режим buffer
(рекомендую этого не делать)
В вашем первом коде много синтаксических ошибок.
Max
a
иb
— целочисленный подтип. Но им присваиваются литералы битовой строки, например, «0110000». Целое число не является двоичным типом и, следовательно, не может быть присвоено литералу битовой строки.