Перейти к содержанию

VHDL - сравнение строк.

Есть сигналы
Код
type str_t is array(integer range<>) of std_logic_vector(7 downto 0);

signal g_command : str_t(0 to COM_SIZE-1);

type commands is array(integer range<>) of str_t(0 to COM_SIZE-1);
constant commands_list : commands(0 to COM_COUNT-1) :=
(
    0 => (0 => x"73", 1 => x"74", 2 => x"6F", 3 => x"70", 4 => x"00", 5 => x"00"), --stop
    1 => (0 => x"66", 1 => x"77", 2 => x"64", 3 => x"00", 4 => x"00", 5 => x"00"), --fwd
    2 => (0 => x"72", 1 => x"65", 2 => x"76", 3 => x"00", 4 => x"00", 5 => x"00"), --rev
    3 => (0 => x"01", 1 => x"02", 2 => x"03", 3 => x"00", 4 => x"00", 5 => x"00")  --123
);

Вижу в g_command - '123'.
Сравниваю
Код
if(g_command = commands_list(3)) then
    received_char <= X"03";
else
   received_char <= X"01";
end if;

Получаю received_char <= X"01";
Нужно сравнивать чар-чар? иначе никак?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Jenya7 @ Apr 23 2018, 09:46) <{POST_SNAPBACK}>
Нужно сравнивать чар-чар? иначе никак?


Я тут вообще никаких чаров не вижу. Только std_logic_vector.

И что вы стравниваете:
x"123" = x"010203000000"?
Естественно, это не равно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(andrew_b @ Apr 23 2018, 11:49) <{POST_SNAPBACK}>
Я тут вообще никаких чаров не вижу. Только std_logic_vector.

И что вы стравниваете:
x"123" = x"010203000000"?
Естественно, это не равно.

я писал в десятичном формате, а в hex формате так и получается g_command = x"010203000000"
и вообще то это std_logic_vector of std_logic_vector
Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Мой тестовый код:

Код
     g_command (0) <= x"01";
     g_command (1) <= x"02";
     g_command (2) <= x"03";
     g_command (3) <= x"00";
     g_command (4) <= x"00";
     g_command (5) <= x"00";

     process
     begin
          wait for 100 ns;

          if (g_command = commands_list(3)) then
              received_char <= X"03";
          else
              received_char <= X"01";
          end if;

          wait;
     end process;


В симуляторе received_char = X"03.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(andrew_b @ Apr 23 2018, 12:50) <{POST_SNAPBACK}>
Мой тестовый код:

Код
     g_command (0) <= x"01";
      g_command (1) <= x"02";
      g_command (2) <= x"03";
      g_command (3) <= x"00";
      g_command (4) <= x"00";
      g_command (5) <= x"00";

      process
      begin
           wait for 100 ns;

           if (g_command = commands_list(3)) then
               received_char <= X"03";
           else
               received_char <= X"01";
           end if;

           wait;
      end process;


В симуляторе received_char = X"03.

я понял. спасибо. значит косяк где то у меня.

нашел косяк. g_command нужно присваивать значение в предыдущем стэйте, чтоб он успел защелкнуть значение.
Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
у меня такое несчастье - не заходит в when X"20"
Код
when ST_PARSE_STR =>  --get command and arguments from the string
          
              if (char_idx < RX_BUF_SIZE) then
                    
                    case rx_uart_buf(char_idx) is
                    
                         when X"0D"  =>  --end of string \r
                               DBG_OUT <= "1000000100";
                               Parse1State <= ST_PARSE_VALIDATE;
                                    
                          when X"20"  =>  --spase - arguments delimiter
                              DBG_OUT <= "1110000111";
                                            
                          when others =>    
                               DBG_OUT <= "1000000111";
                                    
                    
                    char_idx := char_idx + 1;
                
              else
                    Parse1State <= ST_PARSE_IDLE;
             end if;

я посылаю 123 567\r - в ASCII table - пробел x20 но я не попадаю в этот кейс.

ой. мой косяк. извиняюсь.
Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация