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

 
 
 
Reply to this topicStart new topic
> VHDL - сравнение строк.
Jenya7
сообщение Apr 23 2018, 06:46
Сообщение #1


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

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



Есть сигналы
Код
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";
Нужно сравнивать чар-чар? иначе никак?
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 23 2018, 06:49
Сообщение #2


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

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



Цитата(Jenya7 @ Apr 23 2018, 09:46) *
Нужно сравнивать чар-чар? иначе никак?


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

И что вы стравниваете:
x"123" = x"010203000000"?
Естественно, это не равно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 23 2018, 07:13
Сообщение #3


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

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



Цитата(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

Сообщение отредактировал Jenya7 - Apr 23 2018, 07:17
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 23 2018, 07:50
Сообщение #4


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

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



Мой тестовый код:

Код
     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.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 23 2018, 07:53
Сообщение #5


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

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



Цитата(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 - Apr 23 2018, 08:09
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 24 2018, 13:18
Сообщение #6


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

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



у меня такое несчастье - не заходит в 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 - Apr 24 2018, 14:08
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th May 2018 - 21:18
Рейтинг@Mail.ru


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