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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Строковый парсер на VHDL
Jenya7
сообщение Jul 3 2017, 06:51
Сообщение #1


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

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



Хотел узнать насколько реально реализовать строковый парсер на FPGA. Команды от пользователя приходят из терминала по UART модулю. Их надо парсить, проверять аргументы (количество, макс/мин значения). Команд довольно много. Мне кажеться что такой парсер сожрет все ресурсы FPGA.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jul 3 2017, 06:55
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 862
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Jenya7 @ Jul 3 2017, 09:51) *
Хотел узнать насколько реально реализовать строковый парсер на FPGA. Команды от пользователя приходят из терминала по UART модулю. Их надо парсить, проверять аргументы (количество, макс/мин значения). Команд довольно много. Мне кажеться что такой парсер сожрет все ресурсы FPGA.

Такие вещи выгоднее делать на микроконтроллере, дешиво и сердито. FPGA в принципе можно. Ресурсы в зависимости от объема парсинга. Если FPGA имеет возможность встроить Nios (или др.) в минимальном варианте, тогда все решаемо.

Сообщение отредактировал Acvarif - Jul 3 2017, 06:58
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 3 2017, 07:06
Сообщение #3


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

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



Цитата(Acvarif @ Jul 3 2017, 11:55) *
Такие вещи выгоднее делать на микроконтроллере, дешиво и сердито. FPGA в принципе можно. Ресурсы в зависимости от объема парсинга. Если FPGA имеет возможность встроить Nios (или др.) в минимальном варианте, тогда все решаемо.

Я хотел избежать связки микроконтроллер + FPGA. Nios не расматривается. Хочу попробовать поднять на голом FPGA. А как мне подойти к этому вопросу? Я со строками в FPGA дело не имел.
Хочу начать и посмотреть как ресурсы расходуются.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jul 3 2017, 07:14
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 862
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Jenya7 @ Jul 3 2017, 10:06) *
Я хотел избежать связки микроконтроллер + FPGA. Nios не расматривается. Хочу попробовать поднять на голом FPGA. А как мне подойти к этому вопросу? Я со строками в FPGA дело не имел.
Хочу начать и посмотреть как ресурсы расходуются.

У меня стояла такая задача - обмен по RS485 с датчиком давления "Сапфир". От использовать FPGA отказался сразу. Большой объем вычислений и преобразований. У Вас может быть по другому. Для того, чтобы понять, можно попробовать для теста распарсить чего нибудь. По результату можно будет судить что будет дальше.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 3 2017, 07:19
Сообщение #5


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

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



Цитата(Acvarif @ Jul 3 2017, 12:14) *
У меня стояла такая задача - обмен по RS485 с датчиком давления "Сапфир". От использовать FPGA отказался сразу. Большой объем вычислений и преобразований. У Вас может быть по другому. Для того, чтобы понять, можно попробовать для теста распарсить чего нибудь. По результату можно будет судить что будет дальше.

Это я и хочу. Попробовать парсить. Но я не знаю как подойти к этому вопросу на VHDL.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jul 3 2017, 07:31
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 392
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Jenya7 @ Jul 3 2017, 11:19) *
Это я и хочу. Попробовать парсить. Но я не знаю как подойти к этому вопросу на VHDL.

Если не охота связываться с софт-процессором внутри FPGA (а есть очень компактные, например, MCPU на сайте opencores.org) - придется делать машину состояний и разбирать поток побайтно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 3 2017, 07:41
Сообщение #7


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

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



Цитата(novikovfb @ Jul 3 2017, 12:31) *
Если не охота связываться с софт-процессором внутри FPGA (а есть очень компактные, например, MCPU на сайте opencores.org) - придется делать машину состояний и разбирать поток побайтно.

а как мне определить строку? как массив байтов?
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jul 3 2017, 07:44
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 392
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Jenya7 @ Jul 3 2017, 11:41) *
а как мне определить строку? как массив байтов?

Я бы разбирал непосредственно поток байтов на входе парсера. А шаблоны - константы и переходы в машине состояний.
Попробуйте написать парсер на Си в виде функции, принимающей входной поток побайтно и разбирающей его с использованием статических переменных предыдущего состояния. А потом переписать это на VHDL.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 3 2017, 08:06
Сообщение #9


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

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



Цитата(novikovfb @ Jul 3 2017, 12:44) *
Я бы разбирал непосредственно поток байтов на входе парсера. А шаблоны - константы и переходы в машине состояний.
Попробуйте написать парсер на Си в виде функции, принимающей входной поток побайтно и разбирающей его с использованием статических переменных предыдущего состояния. А потом переписать это на VHDL.

шутите? с С на VHDL?

это прием строки по UART
Код
void USART1_IRQHandler(void)
{
  /* RXNE handler */
  if ((USART1->SR & USART_IT_RXNE) != RESET) // Received character?
  {
    /* Copy data into RX Buffer */
    uint8_t chr = (USART1->DR & (uint16_t)0x01FF);
    if (chr=='\r')  //0xD,0xA
    {
      usart1_rx_buf[usart1_rx_idx] = '\0';
      usart1_rx_idx = 0;
      usart1_rx_ready = 1;
    }
    else
    {
        if(chr=='\b')
        {
            if (usart1_rx_idx > 0)
                usart1_rx_idx--;
            return;
        }
        if(usart1_rx_idx < RX1_BUFFERSIZE)  //no overflow
        {
                usart1_rx_buf[usart1_rx_idx] = chr;
                usart1_rx_idx++;
        }
        else
            usart1_rx_overflow = 1;
    }
        /* Clear RXDATAV interrupt */
        //USART_IntClear(UART0, UART_IF_RXDATAV);
        USART1->SR = (uint16_t)~USART_FLAG_RXNE;
  }
}


а это парсер строки
Код
uint32_t PARSER_ParseInputString(char* str, char** args)
{
    uint32_t argc=0;

    args[argc] = strtok(str, ARGS_DELIM);

    while (args[argc] != NULL)
    {
        if(argc >= ARGS_MAX)
           return (ARGS_MAX+1);
        args[++argc] = strtok (NULL, ARGS_DELIM);
    }

    return argc;
}

uint32_t PARSER_ParseCommand(char *str)
{
     uint32_t len = strlen(str);
     char temp_str[len];
     strcpy (temp_str, str);
     uint32_t argc = PARSER_ParseInputString(temp_str, args);
    
    if (!argc)
      return ST_PARSE_NO_ARGS;
    
    uint32_t arg_count = (argc - 1);
    uint32_t i;
    uint32_t result;
    
    char *com = ToLower(args[0]);
    
    for (i = 0; i < sizeof(commands); i++)
    {
        //command found
        if (com_found)
            break;
        
        if (strcmp(commands[i].name,com)==0)
        {
            com_found = 1;
            
            if (arg_count < commands[i].minargs)
                return ST_PARSE_WRONG_ARGS;
            if (arg_count > commands[i].maxargs)
                return ST_PARSE_WRONG_ARGS;
            
            result = commands[i].fp(arg_count, args);
            
            switch (result)
            {
                case MSG_OK:
                    Parser_SendString(USART2, msg_ok, print_out);
                break;
                case MSG_INV_INP:
                    Parser_SendString(USART2, msg_invinp, print_out);
                break;
                case MSG_INV_ARG:
                    Parser_SendString(USART2, msg_invarg, print_out);
                break;
                case MSG_MIS_ARG:
                    Parser_SendString(USART2, msg_misarg, print_out);
                break;
            }
        }
    }
    
    if (com_found)
        com_found = 0;
    else
    {
        Parser_SendString(USART2, msg_wrncom, print_out);
        return ST_PARSE_WRONG_COM;
    }
    
    return ST_PARSE_OK;    
}

и как это переписать на VHDL?
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jul 3 2017, 08:14
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 392
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Jenya7 @ Jul 3 2017, 12:06) *
и как это переписать на VHDL?

Прием строки - совсем не в тему, надо читать байты из порта на аппаратном уровне, а парсер переписать без использования библиотечных функций, с побайтовым анализом.
Т.е. считан байт из порта, по его значению переходим на соответствующую ветку состояний (все команды, начинающиеся на этот байт), по следующему байту - уточняем состояние и т.д. Вот если команды не имеют явных разделителей - будет тоскливо: придется буферизировать входной поток и искать в нем требуемые последовательности, что гораздо затратнее. Почитайте про машины состояний.
И еще, после изучения и попыток написать на VHDL, возможно, придет понимание, что с встраиванием микропроцессоров в ПЛИС люди заморачиваются не от нечего делать, а для облегчения таких действий = громоздких и не требующих большого быстродействия.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 3 2017, 11:39
Сообщение #11


я только учусь...
******

Группа: Модераторы
Сообщений: 3 394
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(novikovfb @ Jul 3 2017, 11:14) *
Прием строки - совсем не в тему, надо читать байты из порта на аппаратном уровне, а парсер переписать без использования библиотечных функций, с побайтовым анализом.
Т.е. считан байт из порта, по его значению переходим на соответствующую ветку состояний (все команды, начинающиеся на этот байт), по следующему байту - уточняем состояние и т.д. Вот если команды не имеют явных разделителей - будет тоскливо: придется буферизировать входной поток и искать в нем требуемые последовательности, что гораздо затратнее. Почитайте про машины состояний.
И еще, после изучения и попыток написать на VHDL, возможно, придет понимание, что с встраиванием микропроцессоров в ПЛИС люди заморачиваются не от нечего делать, а для облегчения таких действий = громоздких и не требующих большого быстродействия.

не всегда, иногда наоборот берут N микропроцессоров от не знания технологий FPGA
Потом мучаются с синхронизацией процессов приема/обработки/передачи данных

Цитата(Jenya7 @ Jul 3 2017, 10:19) *
Это я и хочу. Попробовать парсить. Но я не знаю как подойти к этому вопросу на VHDL.

Для этого делают програмный протокол обмена.
Например
1 байт - синхробайт
2 байт - адрес получателя
3 байт - команда (0-255 команд в один байт можно запихнуть)
4 байт - количество данных
5-N байт - данные
N+1 байт - CRC

по такому Вы уже делаете автомат...
Который принимает/отправляет данные.
Для простоты желательно чтобы длина пакета была фиксированной

Не забываем про взаимную синхронизацию приемника и передатчка в UART.
Мое мнение лучше FTDI - SPI (не надо думать про синхронизацию)


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 3 2017, 11:46
Сообщение #12


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 104
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Jenya7 @ Jul 3 2017, 11:06) *
и как это переписать на VHDL?

Это не надо переписывать на VHDL. Во-первых на Verilog sm.gif
Во-вторых, не надо переписывать, а лучше сделать абсолютно новую реализацию.
Судя по коду, протокол простой текстовый, не вижу сложностей.

Только вот, можно ли взглянуть на команды и пакеты в их первозданном виде?
Еще рекомендация: для подобного парсера идеально использовать симулятор и отлаживать при помощи соответствующего тестбенча.


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 3 2017, 11:52
Сообщение #13


я только учусь...
******

Группа: Модераторы
Сообщений: 3 394
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(AVR @ Jul 3 2017, 14:46) *
Еще рекомендация: для подобного парсера идеально использовать симулятор и отлаживать при помощи соответствующего тестбенча.

это я думаю уже понятно sm.gif
Язык описания это всего лишь средство.... sm.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 3 2017, 14:46
Сообщение #14


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

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



спасибо. буду пробовать. хотелось не с нуля, но видно не судьба.
Go to the top of the page
 
+Quote Post
Raven
сообщение Jul 3 2017, 16:29
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



Решение подобной задачи описывается тут:
"Как делать парсинг текста голым хардвером, без процессора и без софтвера"
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd November 2017 - 18:38
Рейтинг@Mail.ru


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