реклама на сайте
подробности

 
 
> Сравнить два массива
Jenya7
сообщение Jul 12 2017, 07:30
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



есть список команд и команда полученная по UART
Код
type commands is array(0 to COM_SIZE) of std_logic_vector(7 downto 0);

signal commands_list : commands(0 to COM_COUNT) :=
(
    x"73746F700000", --stop
    x"667764000000", --fwd
    x"726576000000"  --rev
);

type com_str is array (0 to 31) of std_logic_vector(7 downto 0);
type arg_str is array (0 to 9) of std_logic_vector(7 downto 0);

type com is
record
      name : com_str;
      arg1 : arg_str;
      arg2 : arg_str;
      arg3 : arg_str;
      name_len : integer;
end record;
        
signal command : com;


Сравниваю весь массив
Код
for i in 0 to COM_COUNT loop  
    if (commands_list(i) /=  command.name) then
     end if;  
end loop;

И побайтово
Код
for i in 0 to COM_COUNT loop
    for j in 0 to command.name_len loop    
    if (commands_list(i)(j) /=  command.name(j)) then
     end if;
    end loop;      
end loop;

В обоих случаях получаю ошибку
Error (10327): VHDL error at parser.vhd(253): can't determine definition of operator ""/="" -- found 0 possible definitions

Не могу сообразить в чем подвох.

Сообщение отредактировал Jenya7 - Jul 12 2017, 07:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
andrew_b
сообщение Jul 12 2017, 09:53
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Как только вы пишете слово type, вы вводите абсолютно новый тип, для которого не определена ни одна операция. Вы сами для нового типа должны написать функции сравнения.

Даже если два типа определены абсолютно одинаково (например, std_ulogic_vector, signed, unsigned), это разные типы, и напрямую объекты этих типов между собой сравнивать нельзя.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 12 2017, 10:05
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(andrew_b @ Jul 12 2017, 15:53) *
Как только вы пишете слово type, вы вводите абсолютно новый тип, для которого не определена ни одна операция. Вы сами для нового типа должны написать функции сравнения.

Даже если два типа определены абсолютно одинаково (например, std_ulogic_vector, signed, unsigned), это разные типы, и напрямую объекты этих типов между собой сравнивать нельзя.

понял. не знал. но record всегда создается через type. я не могу создать record так
record com is
name : com_str;
arg1 : arg_str;
arg2 : arg_str;
arg3 : arg_str;
name_len : integer;
end record;

а как тогда написать функцию сравнения? В С# был operator override, тут наверно что то похожее.

Цитата(Tausinov @ Jul 12 2017, 16:04) *
А мне кажется, тут еще в самом начале с типами ошибка. И должно быть что-то типа такого:

Код
    type commands is array(5 downto 0) of std_logic_vector(7 downto 0);
    type commands_l is array(natural range <>) of commands;

    signal commands_list : commands_l(2 downto 0) := (
    0 => (0 => x"00", 1 => x"01", 2 => x"10", 3 => x"11", 4 => x"20", 5 => x"21"), --stop
    1 => (0 => x"00", 1 => x"01", 2 => x"10", 3 => x"11", 4 => x"20", 5 => x"21"), --fwd
    2 => (0 => x"00", 1 => x"01", 2 => x"10", 3 => x"11", 4 => x"20", 5 => x"21")  --rev
    );

так компайлер ругается
Error (10515): VHDL type mismatch error at parser.vhd(71): std_ulogic type does not match string literal

Сообщение отредактировал Jenya7 - Jul 12 2017, 10:13
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016