Что это за код ошибки VHDL 10309?

Сейчас я работаю с двумя проектами, и у меня есть проблемы с теми же темами, которые нужно исправить - ошибка объявления интерфейса 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, имеют разрешение, позволяющее последним переменным выполнять свою работу либо переходить в другую форму, либо работать как переменная в функции.

Что означает эта ошибка? И как мне это исправить?

В вашем первом коде много синтаксических ошибок. Maxa и b — целочисленный подтип. Но им присваиваются литералы битовой строки, например, «0110000». Целое число не является двоичным типом и, следовательно, не может быть присвоено литералу битовой строки.

Tricky 05.05.2022 20:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Интерфейсный объект режима out не может быть прочитан: в версиях VHDL до VHDL 2008 порты режима out не могли быть прочитаны внутри кода. У вас есть пример: carry <= mid_sum_out;, где mid_sum_out — выходной порт объекта.

Ответы на это:

  1. Измените версию компиляции vhdl на VHDL 2008
  2. Используйте промежуточный внутренний сигнал, например:
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;
  1. Измените режим out на режим buffer (рекомендую этого не делать)

Другие вопросы по теме