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

 
 
> Строковый парсер на VHDL
Jenya7
сообщение Jul 3 2017, 06:51
Сообщение #1


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

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



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


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 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 778
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 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 778
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 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 778
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 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 778
Регистрация: 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

Сообщений в этой теме
- Jenya7   Строковый парсер на VHDL   Jul 3 2017, 06:51
|- - novikovfb   Цитата(Jenya7 @ Jul 3 2017, 12:06) и как ...   Jul 3 2017, 08:14
||- - Maverick   Цитата(novikovfb @ Jul 3 2017, 11:14) При...   Jul 3 2017, 11:39
|- - AVR   Цитата(Jenya7 @ Jul 3 2017, 11:06) и как ...   Jul 3 2017, 11:46
|- - Maverick   Цитата(AVR @ Jul 3 2017, 14:46) Еще реком...   Jul 3 2017, 11:52
- - Jenya7   спасибо. буду пробовать. хотелось не с нуля, но ви...   Jul 3 2017, 14:46
- - Raven   Решение подобной задачи описывается тут: "Как...   Jul 3 2017, 16:29
|- - Maverick   Цитата(Raven @ Jul 3 2017, 19:29) Решение...   Jul 3 2017, 19:10
||- - XVR   Цитата(Maverick @ Jul 3 2017, 22:10) не п...   Jul 4 2017, 10:31
|||- - Maverick   Зачем микропроцессор, неужели команд так много и с...   Jul 4 2017, 11:44
||||- - XVR   Цитата(Maverick @ Jul 4 2017, 14:44) Или ...   Jul 4 2017, 14:31
||||- - Jenya7   Цитата(Maverick @ Jul 4 2017, 17:44) Заче...   Jul 5 2017, 05:58
||||- - Maverick   Цитата(Jenya7 @ Jul 5 2017, 08:58) Проток...   Jul 5 2017, 07:15
||||- - Jenya7   Цитата(Maverick @ Jul 5 2017, 13:15) Прив...   Jul 5 2017, 07:37
||||- - Maverick   Цитата(Jenya7 @ Jul 5 2017, 10:37) в конт...   Jul 5 2017, 07:52
||||- - XVR   Цитата(Jenya7 @ Jul 5 2017, 10:37) неужел...   Jul 5 2017, 08:27
|||- - Maverick   Цитата(XVR @ Jul 4 2017, 13:31) http://ww...   Jul 5 2017, 08:46
||- - Raven   Цитата(Maverick @ Jul 3 2017, 22:10) хоро...   Jul 5 2017, 20:58
||- - Maverick   Цитата(Raven @ Jul 5 2017, 23:58) Дык, а ...   Jul 5 2017, 21:24
|- - Jenya7   Цитата(Raven @ Jul 3 2017, 21:29) Решение...   Jul 4 2017, 06:13
|- - novikovfb   Цитата(Jenya7 @ Jul 4 2017, 10:13) спасиб...   Jul 4 2017, 11:08
|- - Tausinov   Цитата(novikovfb @ Jul 4 2017, 14:08) MIP...   Jul 4 2017, 11:28
|- - novikovfb   Цитата(Tausinov @ Jul 4 2017, 15:28) Вам ...   Jul 4 2017, 11:35
- - GriXa   Добрый день! Мне кажется, с помощью простых if...   Jul 4 2017, 09:26
|- - Jenya7   Цитата(GriXa @ Jul 4 2017, 15:26) Добрый ...   Jul 4 2017, 11:06
- - vladec   Посмотрите по ресурсам, может уложите задачу в оди...   Jul 5 2017, 07:45
|- - Jenya7   Цитата(vladec @ Jul 5 2017, 13:45) Посмот...   Jul 5 2017, 08:02
|- - novikovfb   Цитата(Jenya7 @ Jul 5 2017, 11:57) я не х...   Jul 5 2017, 08:04
||- - Jenya7   Цитата(novikovfb @ Jul 5 2017, 14:04) как...   Jul 5 2017, 08:23
||- - Maverick   Цитата(Jenya7 @ Jul 5 2017, 11:23) вариан...   Jul 5 2017, 08:25
|- - Maverick   Цитата(Jenya7 @ Jul 5 2017, 11:02) я хочу...   Jul 5 2017, 08:14
- - Leka   Цитатаsome_command arg1 arg2 \r "Железны...   Jul 5 2017, 09:25
|- - XVR   Цитата(Leka @ Jul 5 2017, 12:25) "Же...   Jul 5 2017, 10:12
|- - Jenya7   Цитата(Leka @ Jul 5 2017, 15:25) "Же...   Jul 5 2017, 10:32
- - Unfog   Если есть возможность самому выбирать протокол, до...   Jul 10 2017, 12:07


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

 


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


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