Ошибка (10327): ошибка VHDL: невозможно определить определение оператора = найдено 0 возможных определений

У меня много ошибок, несмотря на то, что я пробовал разные способы ввода своей программы, но в основном использовал логическое мышление. Дело в том, что я никогда раньше не пытался объединять разные вещи вместе, поэтому у меня возникла проблема с невозможностью скомпилировать это. Есть требование, и я могу обработать его логически, но мне нужна помощь с кодированием. Можно ли направлять меня? Спасибо.

Прикрепленный ниже код не завершен, но в нем уже много ошибок.

library ieee;   
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity tracking7 is
port    (   sensor      :  in  std_logic;
            reset_bar   :  in  std_logic;
            D3, D2, D1, D0          :  in std_logic;
            q           :  out std_logic;
            led         : out std_logic;
            a4,b4,c4,d4,e4,f4,g4 : out std_logic);
end tracking7;


architecture flow of tracking7 is

signal input  : std_logic_vector (3 downto 0);      --VECTORS FOR INTERNAL 
signal output : std_logic_vector (6 downto 0);    --USE IN DECODER STATEMENTS
signal count_sig: unsigned (3 downto 0); 

begin
    input <= (D3, D2 , D1, D0);
WITH input SELECT
  output <=     "0000001" when "0000",    --DISPLAY 0
                "1001111" when "0001",    --DISPLAY 1
                "0010010" when "0010",    --DISPLAY 2
                "0000110" when "0011",    --DISPLAY 3
                "1001100" when "0100",    --DISPLAY 4
                "0100100" when "0101",    --DISPLAY 5
                "0100000" when "0110",    --DISPLAY 6
                "0001111" when "0111",    --DISPLAY 7
                "0000000" when "1000",    --DISPLAY 8
                "0000100" when "1001",    --DISPLAY 9
                "0001000" when "1010",    --DISPLAY A
                "1100000" when "1011",    --DISPLAY B
                "0110001" when "1100",    --DISPLAY C
                "1000100" when "1101",    --DISPLAY D
                "0110000" when "1110",    --DISPLAY E
                "0111000" when "1111",    --DISPLAY F
                "1111111" when others;    --BLANK DISPLAY
                        

 
    process ( sensor, reset_bar) 
    begin 
        if (reset_bar = '1')    then            count_sig <= count_sig; 

    elsif  falling_edge (sensor) then if (count_sig = D3& D2& D1& D0) then  
            count_sig <= "0000"; 
            else  
            count_sig <= count_sig + 1; 
        end if;  
        end if;         
    end process; 

    
    process (D3, D2, D1, D0)
        begin
          if (q = D3&D2&D1&D0)
            then led <= '1'; --LED light up when reach ref no
          else
            led<= '0';
        
        end if;
        end process;

  a4 <= output(6);
  b4 <= output(5);
  c4 <= output(4);
  d4 <= output(3);
  e4 <= output(2);
  f4 <= output(1);
  g4 <= output(0);
        
q <= std_logic_vector (count_sig);

end flow;

Может быть, краткое примечание о том, о чем мой код, в основном для разработки системы управления запасами, которая определяет количество униформ, возвращенных в ящик. Пользователь может установить любое количество униформ, которые он хочет обнаружить на входах: D3D2D1D0. Разработайте систему со следующими характеристиками:

  1. Как только эталонный номер достигнут, загорается светодиод, и счет останавливается на эталонном номере, даже если входной датчик активирован. Покажите количество обнаруженных униформ на семисегментном дисплее и значение эталона на другом дисплее. Например: если ссылочный номер 15
  2. Когда сброс активирован, светодиод и семь сегментов должны отражать последний статус обнаруженной униформы.

Пожалуйста, порекомендуйте!


person arthur andrew    schedule 18.08.2020    source источник
comment
Привет, Артур, и добро пожаловать в StackOverflow. При обращении за помощью укажите, какие инструменты вы используете (включая версию, если вы ее знаете), покажите, какие команды вы используете и какие сообщения об ошибках вы получаете. Догадываться обо всем этом по исходному коду слишком сложно. Но самое первое, что нужно сделать, это посетить справочный центр и особенно раздел о как задать хороший вопрос и какой минимальный, полный и проверяемый пример ( MCVE) есть.   -  person Renaud Pacalet    schedule 18.08.2020
comment
Для этого предположительно логического выражения q = D3&D2&D1&D0 не существует оператора равенства, который может проверять между левым операндом с базовым типом std_ulogic и правым операндом неизвестного типа массива с базовым типом элемента std_ulogic. Возможно, эти операторы конкатенации хотели быть операторами И?   -  person    schedule 19.08.2020


Ответы (1)


Проблема в том, что q = D3&D2&D1&D0 недействителен. Символ & выполняет конкатенацию в VHDL, поэтому вы на самом деле пытаетесь сравнить тип std_logic с четырехбитным сигналом. Это незаконно в VHDL. Вместо этого вам нужно использовать ключевое слово and для объединения сигналов. Однако это необходимо сделать за пределами выражения в операторе if. Что-то вроде этого должно работать:

and_d <= D3 and D2 and D1 and D0;

process (and_q) is
begin
  if (q = and_d) then
    led <= '1'; --LED light up when reach ref no
  else
    led <= '0';
  end if;
end process;

Вы также можете использовать переменную внутри блока процесса для объединения битов Dn:

process (D3, D2, D1, D0) is
  variable and_q : std_logic;
begin
  and_q := D3 and D2 and D1 and D0;
  if (q = and_d) then
    led <= '1'; --LED light up when reach ref no
  else
    led <= '0';
  end if;
end process;
person johnfpga    schedule 20.08.2020