Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Строковый парсер на VHDL
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Jenya7
Хотел узнать насколько реально реализовать строковый парсер на FPGA. Команды от пользователя приходят из терминала по UART модулю. Их надо парсить, проверять аргументы (количество, макс/мин значения). Команд довольно много. Мне кажеться что такой парсер сожрет все ресурсы FPGA.
Acvarif
Цитата(Jenya7 @ Jul 3 2017, 09:51) *
Хотел узнать насколько реально реализовать строковый парсер на FPGA. Команды от пользователя приходят из терминала по UART модулю. Их надо парсить, проверять аргументы (количество, макс/мин значения). Команд довольно много. Мне кажеться что такой парсер сожрет все ресурсы FPGA.

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

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

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

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

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

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

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

Прием строки - совсем не в тему, надо читать байты из порта на аппаратном уровне, а парсер переписать без использования библиотечных функций, с побайтовым анализом.
Т.е. считан байт из порта, по его значению переходим на соответствующую ветку состояний (все команды, начинающиеся на этот байт), по следующему байту - уточняем состояние и т.д. Вот если команды не имеют явных разделителей - будет тоскливо: придется буферизировать входной поток и искать в нем требуемые последовательности, что гораздо затратнее. Почитайте про машины состояний.
И еще, после изучения и попыток написать на VHDL, возможно, придет понимание, что с встраиванием микропроцессоров в ПЛИС люди заморачиваются не от нечего делать, а для облегчения таких действий = громоздких и не требующих большого быстродействия.
Maverick
Цитата(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 (не надо думать про синхронизацию)
AVR
Цитата(Jenya7 @ Jul 3 2017, 11:06) *
и как это переписать на VHDL?

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

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

это я думаю уже понятно sm.gif
Язык описания это всего лишь средство.... sm.gif
Jenya7
спасибо. буду пробовать. хотелось не с нуля, но видно не судьба.
Raven
Решение подобной задачи описывается тут:
"Как делать парсинг текста голым хардвером, без процессора и без софтвера"
Maverick
Цитата(Raven @ Jul 3 2017, 19:29) *

хорошая статейка... sm.gif
не подскажите, где лежат исходники MIPSfpga процессора?
Jenya7
Цитата(Raven @ Jul 3 2017, 21:29) *

спасибо.
GriXa
Добрый день!
Мне кажется, с помощью простых if и else, парсер сделать крайне затруднительно. Нужно думать в сторону сложной комбинаторики, функций и for ... loop'ов
Подобный парсер видел для SPI интерфейса. Решение для VHDL было весьма изящно, на мой взгляд.
Для модуля создавался package, в котором с помощью констант и type были описаны параметры строковых данных.
К примеру,

Код
package parser_pkg is
    --! maximum length of data packet
    constant MAX_DATA_LEN       : integer := 54;
    -- Serial communication constants
    --! message is from command interface
    constant SER_COM_CMD_INTF_TYPE : std_logic_vector(7 downto 0) := X"55";
    -- ... куча других констант

    --! command data structure
    type cmd_t is record
        --! message command
        cmd         : std_logic_vector(15 downto 0);
        --! message type
        msg_type    : bc_msg_type_t;
        --! interface
        intf_type    : bc_intf_type_t;        
        --! message length
        msg_len     : integer range 0 to MAX_DATA_LEN;
        --! answer code
        answer      : std_logic_vector(15 downto 0);
        --! answer length
        answer_len : integer range 0 to MAX_DATA_LEN;
        --! target host FPGA (Master / Slave)
        target_host: target_host_t;
    end record cmd_t;

    constant CMD_MIO_DUMMY : std_logic_vector(15 downto 0)          := X"0000"; --! dummy command to reset interface

    type cmd_arr is array(integer range <>) of cmd_t;

    -- List of all supported commands with length (in bytes) and category
    constant BC_CMD_CMD_LIST : bc_cmd_arr := (
        (CMD_MIO_DUMMY, MIO, CMD_INTF,0,EC_OK,0,BOTH),
        (CMD_MIO_GETNBTIMMEAS, MIO, CMD_INTF,0,EC_OK,2,SINGLE),
        (CMD_MIO_GETSTATUS, MIO, CMD_INTF,0,EC_OK,2,SINGLE),
        (CMD_MIO_GETLKDMODINF, MIO, CMD_INTF,4,EC_OK,12,SINGLE),    
        (CMD_MIO_GETNBLKDMOD, MIO, CMD_INTF,0,EC_OK,2,SINGLE),
        (CMD_MIO_STOREUID, MIO, CMD_INTF,6,EC_OK,0,BOTH),
        (CMD_MIO_GETUID,MIO, CMD_INTF,0,EC_OK,6,SINGLE),
        (CMD_MIO_GETVERSION,MIO, CMD_INTF,0,EC_OK,8,SINGLE),
        (CMD_MIO_GETERRORCODE,MIO, CMD_INTF,0,EC_OK,4,SINGLE),
        (CMD_MIO_GETHWINF,MIO, CMD_INTF,0,EC_OK,52,BOTH),
        (CMD_MIO_DECLAREMASTER,SCO,CMD_INTF,16,EC_OK,12,BOTH),
        (CMD_MIO_STARTSAFECOM,SCO,CMD_INTF,0,EC_OK,0,BOTH),
        (CMD_MIO_TAKECFGDATA,SCO,CMD_INTF,24,EC_OK,0,BOTH),
        (CMD_MIO_STORECFGDATA,SCO,CMD_INTF,0,EC_OK,0,BOTH)
    );


-- далее следует огромный список функций для работы с командами, к примеру:

Код
    -- Function declaration
    --! @details    Get command message properties
    --!
    --! InP:        Command  
    --! OutP:       message properties
    function get_bc_cmd_cmd (cmd : std_logic_vector(15 downto 0)) return cmd_t;
end package parser_pkg;


Подобные функции используются в State Machine для реализации парсера.
Получился большой блок комбинаторной логики. К счастью, он работал лишь на частотах меньше 50МГц.
XVR
Цитата(Maverick @ Jul 3 2017, 22:10) *
не подскажите, где лежат исходники MIPSfpga процессора?

http://www.silicon-russia.com/2015/12/11/m...d-instructions/

Ну или просто возьмите MicroBlase - он и есть MIPS
Jenya7
Цитата(GriXa @ Jul 4 2017, 15:26) *
Добрый день!
Мне кажется, с помощью простых if и else, парсер сделать крайне затруднительно. Нужно думать в сторону сложной комбинаторики, функций и for ... loop'ов
Подобный парсер видел для SPI интерфейса. Решение для VHDL было весьма изящно, на мой взгляд.
Для модуля создавался package, в котором с помощью констант и type были описаны параметры строковых данных.
К примеру,

Подобные функции используются в State Machine для реализации парсера.
Получился большой блок комбинаторной логики. К счастью, он работал лишь на частотах меньше 50МГц.

спасибо. думаю этот подход можно взять за основу.
novikovfb
Цитата(Jenya7 @ Jul 4 2017, 10:13) *
спасибо.

MIPSfpga - это не спортивно, ведь тогда задача решается на прошитом в FPGA процессоре.
Tausinov
Цитата(novikovfb @ Jul 4 2017, 14:08) *
MIPSfpga - это не спортивно, ведь тогда задача решается на прошитом в FPGA процессоре.


Вам шашечки или ехать? (с)
novikovfb
Цитата(Tausinov @ Jul 4 2017, 15:28) *
Вам шашечки или ехать? (с)

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

Maverick
Зачем микропроцессор, неужели команд так много и сложные? Неужели связки декодер + мультиплексор не достаточно?
Тем более данные приходят последовательно и на более низкой частоте, чем частота ПЛИС
Jenya7 Выложите протокол обмена на основе которого Вы хотите делать парсер
Или Вы хотите хардкор, как ранее предположили?
XVR
Цитата(Maverick @ Jul 4 2017, 14:44) *
Или Вы хотите хардкор, как ранее предположили?


Цитата
«Механитис – профессиональное заболевание тех, кто верит, что ответ математической задачи, которую он не может ни решить, ни даже сформулировать, легко будет найти, если получить доступ к достаточно дорогой вычислительной машине».
Б. Купман, Исследование операций, 4, 442 (1956).
Jenya7
Цитата(Maverick @ Jul 4 2017, 17:44) *
Зачем микропроцессор, неужели команд так много и сложные? Неужели связки декодер + мультиплексор не достаточно?
Тем более данные приходят последовательно и на более низкой частоте, чем частота ПЛИС
Jenya7 Выложите протокол обмена на основе которого Вы хотите делать парсер
Или Вы хотите хардкор, как ранее предположили?

Протокол простой. Пользователь вводит команду в терминале. Конец команды - \r. Например задать верхний лимит - top 1000\r. Прочитать верхний лимит - top\r без аргумента. В FPGA модуль UART принял чары до \r. Ну а дальше надо парсить - выделить аргументы, найти команду, по команде выполнить действие. Выше я приводил реализацию на С в микроконтроллере.
Maverick
Цитата(Jenya7 @ Jul 5 2017, 08:58) *
Протокол простой. Пользователь вводит команду в терминале. Конец команды - \r. Например задать верхний лимит - top 1000\r. Прочитать верхний лимит - top\r без аргумента. В FPGA модуль UART принял чары до \r. Ну а дальше надо парсить - выделить аргументы, найти команду, по команде выполнить действие. Выше я приводил реализацию на С в микроконтроллере.

Вы можете принимать/отправлять данные с/на ПК?
Если да, то дальше вы получаете 3 байта (top) - у Вас есть декодер который должен эту команду понять и данные пердать на вход соответсвующий модуль.
Также декодер должен декодировать конец команды - \r - 2 байта.
Если Вы должны получить массив данных то вначале их записывете в блочную память. Потом по приему всего пакета начать вычитывать данные и подавать их на соответствующий модуль.

Здесь декодер это обычный компаратор на равенство.
Jenya7
Цитата(Maverick @ Jul 5 2017, 13:15) *
Приведенная программа не расскрывает "аргументы, найти команду, по команде выполнить действие". Расскажите подробнее. Это и есть протокол обмена
Вы можете принимать отправлять данные с/на ПК?

в контроллер пришла строка
Цитата
some_command arg1 arg2 \r
. делимитер пробел. я разбиваю строки на массив строк по делимитеру. беру команду и ищу в списке. если есть такая команда - указатель на функцию отсылает нас к функции обработки команды. если есть аргументы - происходит валидация аргументов и запись значений в нужные переменные и сохранение в памяти, нет аргументов - отсылаю значение переменной на терминал по UART.

неужели никто до меня не решал такой задачи? это ж маст! как без этого? у меня 90% проектов имеют интерфейс с пользователем через терминал. я в шоке. sm.gif
vladec
Посмотрите по ресурсам, может уложите задачу в один-два PicoBlaze
Maverick
Цитата(Jenya7 @ Jul 5 2017, 10:37) *
в контроллер пришла строка . делимитер пробел. я разбиваю строки на массив строк по делимитеру. беру команду и ищу в списке. если есть такая команда - указатель на функцию отсылает нас к функции обработки команды. если есть аргументы - происходит валидация аргументов и запись значений в нужные переменные и сохранение в памяти, нет аргументов - отсылаю значение переменной на терминал по UART.

неужели никто до меня не решал такой задачи? это ж маст! как без этого? у меня 90% проектов имеют интерфейс с пользователем через терминал. я в шоке. sm.gif

правильно для общеня с микропроцессором/ПК возможно такой протокол и прокатит.
Для ПЛИС сделайте проще протокол обмена.
Данные это цифры правильно? Можно сделать после команды цифровые данные ПЛИС их сразу принимает и выполняет.
Не надо будет делать в ПЛИС преобразователя из аски кода в обычные цифры для ПЛИС.
Тогда сделать по одной букве в аске коде - команду.
Количество данных фиксированное.
Тогда получиться

а236369к

что будет обозначать
а - аски код - команда top
236369 - 4 байта (например) - значение данных
к - аски код - команда окончание

В зависимости от команды данные в 4 байта сами разбираете...

Для подобного протокола процессор не нужен...
В простом случае подтверждение получения команды ПЛИС - Вы просто возвращаете обратно всю команду в ПК (можно какую-то константу в каком-то байте добавлять при отправке при желании)
Реализация этого простая - простой loopback, т.е. замыкаете приемник и передатчик
Jenya7
Цитата(vladec @ Jul 5 2017, 13:45) *
Посмотрите по ресурсам, может уложите задачу в один-два PicoBlaze

я не хочу начинать миссию спасти рядового Райена портирования кора в FPGA. у меня в этом нету опыта и отладить такой кор для меня проблема. к тому же найди С компайлер под кор, учи его...

Цитата(Maverick @ Jul 5 2017, 13:52) *
правильно для общеня с микропроцессором/ПК возможно такой протокол и прокатит.
Для ПЛИС сделайте проще протокол обмена.
Данные это цифры правильно? передаете в аски коде Можно сделать после команды цифровые данные ПЛИС их сразу принимает и выполняет.
Не надо будет делать в ПЛИС преобразователя из аски кода в обычные цифры для ПЛИС.
Тогда сделать по одной букве в аске коде команду.
Количество данных фиксированное.
Тогда получиться

а236369к

что будет обозначать
а - аски код - команда top
4 байта - значение данных - 236369
к - аски код - команда окончание


я хочу чтоб это было юзер френдли. Красивые команды top, speed все понятно. а236369к - это ж надо человеку книгу написать с прояснением йоги комманд.
и я не думаю что это значительно усложнит задачу и увеличит потребление ресурсов послать такую строку а236369к или такую top 236369 \r

я так понимаю что если я в гугле не нашел готового решения - это не практикуется на FPGA.
novikovfb
Цитата(Jenya7 @ Jul 5 2017, 11:57) *
я не хочу начинать миссию спасти рядового Райена портирования кора в FPGA. у меня в этом нету опыта и отладить такой кор для меня проблема. к тому же найди С компайлер под кор, учи его...

как ни печально, волшебным образом сделать парсер не получится. Надо или писать громоздкую конструкцию на VHDL (см. машины состояний), либо отвести изрядный кусок ПЛИС под готовое ядро микропроцессора и использовать готовый компилятор, либо взять за основу маленькое ядро микропроцессора, допилить в нужном направлении и мучиться с его ассемблером, либо заплатить тому, кто это сделает.
Ядра микропроцессоров и много другого интересного водятся на opencores.org
Maverick
Цитата(Jenya7 @ Jul 5 2017, 11:02) *
я хочу чтоб это было юзер френдли. Красивые команды top, speed все понятно. а236369к - это ж надо человеку книгу написать с прояснением йоги комманд.
и я не думаю что это значительно усложнит задачу и увеличит потребление ресурсов послать такую строку а236369к или такую top 236369 \r
я так понимаю что если я в гугле не нашел готового решения - это не практикуется на FPGA.

как пожелаете... Все в Ваших руках...

Команда top не слишком понятно, лучше
"Установить верхний предел вращения 1 мотора равным 1000."
тогда юзеру все понятно... biggrin.gif
Jenya7
Цитата(novikovfb @ Jul 5 2017, 14:04) *
как ни печально, волшебным образом сделать парсер не получится. Надо или писать громоздкую конструкцию на VHDL (см. машины состояний), либо отвести изрядный кусок ПЛИС под готовое ядро микропроцессора и использовать готовый компилятор, либо взять за основу маленькое ядро микропроцессора, допилить в нужном направлении и мучиться с его ассемблером, либо заплатить тому, кто это сделает.
Ядра микропроцессоров и много другого интересного водятся на opencores.org

вариант "заплатить тому, кто это сделает" вполне приемлим.
Maverick
Цитата(Jenya7 @ Jul 5 2017, 11:23) *
вариант "заплатить тому, кто это сделает" вполне приемлим.

тогда Вам в ветку " Предлагаю работу"
XVR
Цитата(Jenya7 @ Jul 5 2017, 10:37) *
неужели никто до меня не решал такой задачи?
Решали конечно. Делали soft процессор и решали на нем

Цитата
это ж маст! как без этого?
Делать этот 'маст' напрямую в железе - занятие для отъявленных мазохистов. На порядок проще сделать десяток разных процессоров и написать программу для них в ассемблере, чем делать то, что вы хотите
Maverick
Цитата(XVR @ Jul 4 2017, 13:31) *
http://www.silicon-russia.com/2015/12/11/m...d-instructions/

Ну или просто возьмите MicroBlase - он и есть MIPS

не увидел, спасибо sm.gif

Цитата(Jenya7 @ Jul 5 2017, 11:23) *

Судя с темы
Вам там советовали брать несколько микроконтроллеров, пробуйте...
Только помните про возможное требование в синхронизации работы двигателей...
Leka
Цитата
some_command arg1 arg2 \r

"Железный" парсер подобного займет меньше места, чем Ниос и тп.
Числа переводятся в бинарное представление "на лету", по мере поступления символов.
Текстовая строка также переводится "на лету" в сжатый бинарный код, с пропуском некоторых/последних символов, подбирается по списку команд.
На выходе получаем 3 числа.
XVR
Цитата(Leka @ Jul 5 2017, 12:25) *
"Железный" парсер подобного займет меньше места, чем Ниос и тп.
Вот только Nios уже готовый, а 'железный парсер' писать надо
Цитата
Числа переводятся в бинарное представление "на лету", по мере поступления символов.
Текстовая строка также переводится "на лету" в сжатый бинарный код, с пропуском некоторых/последних символов, подбирается по списку команд.
Судя по коду на С, который тут приводил ТС, он еще отрабатывает минимальное редактирование принимаемой строки (отрабатывает код Backspace). Аппаратно 'на лету' это не так просто сделать sad.gif
Jenya7
Цитата(Leka @ Jul 5 2017, 15:25) *
"Железный" парсер подобного займет меньше места, чем Ниос и тп.
Числа переводятся в бинарное представление "на лету", по мере поступления символов.
Текстовая строка также переводится "на лету" в сжатый бинарный код, с пропуском некоторых/последних символов, подбирается по списку команд.
На выходе получаем 3 числа.

вот это слова не мальчика но мужа. а пример можно? хотя нет, не надо, а то и эту тему перенесут в раздел - Предлагаю работу.
Raven
Цитата(Maverick @ Jul 3 2017, 22:10) *
хорошая статейка... sm.gif
не подскажите, где лежат исходники MIPSfpga процессора?

Дык, а разве на приводимой где-то по тексту ссылке на GitHub не исходники? Там нетлист? Я, если честно, не копался в этих репозиториях.

Вот статья с подборкой ссылок по MIPSfpga.
Maverick
Цитата(Raven @ Jul 5 2017, 23:58) *
Дык, а разве на приводимой где-то по тексту ссылке на GitHub не исходники? Там нетлист? Я, если честно, не копался в этих репозиториях.

Вот статья с подборкой ссылок по MIPSfpga.

Спасибо за информацию sm.gif
Unfog
Если есть возможность самому выбирать протокол, достаточно легко реализовать какой-нибудь простой байт-стаффинг, например как тут.
Собрали в буфер, расшифровав на лету, далее передали на обработку по коду команды.
При этом, по опыту, крайне желательно передавать длину посылки. Например 0-й байт - команда, 1-й - длина передачи, дальше тело, в конце контрольная сумма.
P.S. У данного алгоритма возможен большой оверхед (до двух раз, если все посылка из FEND будет состоять), но зато сам алгоритм очень простой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.