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

 
 
> Сравнить два массива
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
Ответов
KalashKS
сообщение Jul 12 2017, 10:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755



Как видится мне, у вас принципиальная ошибка в типах.

commands_list у вас получился массивом 8-битных векторов. Соответственно commands_list(i) - восьмибитный вектор, который вы сравниваете с массивом векторов command.name.
То же самое со вторым примером, где вы вытаетесь сравнить бит commands_list(i)(j) с восьмибитным вектором command.name(j).
Чтобы все заработало вам надо объявить новый тип. Ну и commands_list, наверно, по смыслу должен быть константой.
CODE
type t_commands_list is array(natural range <>) of commands;

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



В принципе выше то же самое написали. И да, лучше код целиком кидайте.

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


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

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



Цитата(KalashKS @ Jul 12 2017, 16:33) *
Как видится мне, у вас принципиальная ошибка в типах.

commands_list у вас получился массивом 8-битных векторов. Соответственно commands_list(i) - восьмибитный вектор, который вы сравниваете с массивом векторов command.name.
То же самое со вторым примером, где вы вытаетесь сравнить бит commands_list(i)(j) с восьмибитным вектором command.name(j).
Чтобы все заработало вам надо объявить новый тип. Ну и commands_list, наверно, по смыслу должен быть константой.
CODE
type t_commands_list is array(natural range <>) of commands;

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



В принципе выше то же самое написали. И да, лучше код целиком кидайте.


Я выкинул record
Код
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);

signal rx_command : com_str;
signal arg1 : arg_str;
signal arg2 : arg_str;
signal arg3 : arg_str;

теперь я сравниваю одинаковые типы. однако получаю ту же ошибку.
Прикрепленные файлы
Прикрепленный файл  parser.vhd ( 6.82 килобайт ) Кол-во скачиваний: 15
 
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:23
Рейтинг@Mail.ru


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