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

 
 
> Строковый парсер на 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
Ответов
GriXa
сообщение Jul 4 2017, 09:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-05-09
Пользователь №: 49 385



Добрый день!
Мне кажется, с помощью простых 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МГц.

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


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

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



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

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

спасибо. думаю этот подход можно взять за основу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Строковый парсер на VHDL   Jul 3 2017, 06:51
- - Acvarif   Цитата(Jenya7 @ Jul 3 2017, 09:51) Хотел ...   Jul 3 2017, 06:55
|- - Jenya7   Цитата(Acvarif @ Jul 3 2017, 11:55) Такие...   Jul 3 2017, 07:06
|- - Acvarif   Цитата(Jenya7 @ Jul 3 2017, 10:06) Я хоте...   Jul 3 2017, 07:14
|- - Jenya7   Цитата(Acvarif @ Jul 3 2017, 12:14) У мен...   Jul 3 2017, 07:19
|- - novikovfb   Цитата(Jenya7 @ Jul 3 2017, 11:19) Это я ...   Jul 3 2017, 07:31
|- - Jenya7   Цитата(novikovfb @ Jul 3 2017, 12:31) Есл...   Jul 3 2017, 07:41
|- - novikovfb   Цитата(Jenya7 @ Jul 3 2017, 11:41) а как ...   Jul 3 2017, 07:44
|- - Jenya7   Цитата(novikovfb @ Jul 3 2017, 12:44) Я б...   Jul 3 2017, 08:06
|- - 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
- - 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 - 13:51
Рейтинг@Mail.ru


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