Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: VHDL - сравнение строк.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Jenya7
Есть сигналы
Код
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";
Нужно сравнивать чар-чар? иначе никак?
andrew_b
Цитата(Jenya7 @ Apr 23 2018, 09:46) *
Нужно сравнивать чар-чар? иначе никак?


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

И что вы стравниваете:
x"123" = x"010203000000"?
Естественно, это не равно.
Jenya7
Цитата(andrew_b @ Apr 23 2018, 11:49) *
Я тут вообще никаких чаров не вижу. Только std_logic_vector.

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

я писал в десятичном формате, а в hex формате так и получается g_command = x"010203000000"
и вообще то это std_logic_vector of std_logic_vector
andrew_b
Мой тестовый код:

Код
     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.
Jenya7
Цитата(andrew_b @ Apr 23 2018, 12:50) *
Мой тестовый код:

Код
     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 но я не попадаю в этот кейс.

ой. мой косяк. извиняюсь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.