|
|
  |
Строковый парсер на VHDL |
|
|
|
Jul 4 2017, 09:26
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 4 2017, 11:28
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(novikovfb @ Jul 4 2017, 14:08)  MIPSfpga - это не спортивно, ведь тогда задача решается на прошитом в FPGA процессоре. Вам шашечки или ехать? (с)
|
|
|
|
|
Jul 4 2017, 11:35
|
Знающий
   
Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450

|
Цитата(Tausinov @ Jul 4 2017, 15:28)  Вам шашечки или ехать? (с) ТС хочет хардкор... Цитата(Jenya7 @ Jul 3 2017, 11:06)  Я хотел избежать связки микроконтроллер + FPGA. Nios не расматривается. Хочу попробовать поднять на голом FPGA. А как мне подойти к этому вопросу? Я со строками в FPGA дело не имел. Хочу начать и посмотреть как ресурсы расходуются.
|
|
|
|
|
Jul 4 2017, 14:31
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Maverick @ Jul 4 2017, 14:44)  Или Вы хотите хардкор, как ранее предположили? Цитата «Механитис – профессиональное заболевание тех, кто верит, что ответ математической задачи, которую он не может ни решить, ни даже сформулировать, легко будет найти, если получить доступ к достаточно дорогой вычислительной машине». Б. Купман, Исследование операций, 4, 442 (1956).
|
|
|
|
|
Jul 5 2017, 07:15
|

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

|
Цитата(Jenya7 @ Jul 5 2017, 08:58)  Протокол простой. Пользователь вводит команду в терминале. Конец команды - \r. Например задать верхний лимит - top 1000\r. Прочитать верхний лимит - top\r без аргумента. В FPGA модуль UART принял чары до \r. Ну а дальше надо парсить - выделить аргументы, найти команду, по команде выполнить действие. Выше я приводил реализацию на С в микроконтроллере. Вы можете принимать/отправлять данные с/на ПК? Если да, то дальше вы получаете 3 байта (top) - у Вас есть декодер который должен эту команду понять и данные пердать на вход соответсвующий модуль. Также декодер должен декодировать конец команды - \r - 2 байта. Если Вы должны получить массив данных то вначале их записывете в блочную память. Потом по приему всего пакета начать вычитывать данные и подавать их на соответствующий модуль. Здесь декодер это обычный компаратор на равенство.
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 5 2017, 07:37
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Maverick @ Jul 5 2017, 13:15)  Приведенная программа не расскрывает "аргументы, найти команду, по команде выполнить действие". Расскажите подробнее. Это и есть протокол обмена Вы можете принимать отправлять данные с/на ПК? в контроллер пришла строка Цитата some_command arg1 arg2 \r . делимитер пробел. я разбиваю строки на массив строк по делимитеру. беру команду и ищу в списке. если есть такая команда - указатель на функцию отсылает нас к функции обработки команды. если есть аргументы - происходит валидация аргументов и запись значений в нужные переменные и сохранение в памяти, нет аргументов - отсылаю значение переменной на терминал по UART. неужели никто до меня не решал такой задачи? это ж маст! как без этого? у меня 90% проектов имеют интерфейс с пользователем через терминал. я в шоке.
Сообщение отредактировал Jenya7 - Jul 5 2017, 07:42
|
|
|
|
|
Jul 5 2017, 07:52
|

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

|
Цитата(Jenya7 @ Jul 5 2017, 10:37)  в контроллер пришла строка . делимитер пробел. я разбиваю строки на массив строк по делимитеру. беру команду и ищу в списке. если есть такая команда - указатель на функцию отсылает нас к функции обработки команды. если есть аргументы - происходит валидация аргументов и запись значений в нужные переменные и сохранение в памяти, нет аргументов - отсылаю значение переменной на терминал по UART. неужели никто до меня не решал такой задачи? это ж маст! как без этого? у меня 90% проектов имеют интерфейс с пользователем через терминал. я в шоке.  правильно для общеня с микропроцессором/ПК возможно такой протокол и прокатит. Для ПЛИС сделайте проще протокол обмена. Данные это цифры правильно? Можно сделать после команды цифровые данные ПЛИС их сразу принимает и выполняет. Не надо будет делать в ПЛИС преобразователя из аски кода в обычные цифры для ПЛИС. Тогда сделать по одной букве в аске коде - команду. Количество данных фиксированное. Тогда получиться а236369к что будет обозначать а - аски код - команда top 236369 - 4 байта (например) - значение данных к - аски код - команда окончание В зависимости от команды данные в 4 байта сами разбираете... Для подобного протокола процессор не нужен... В простом случае подтверждение получения команды ПЛИС - Вы просто возвращаете обратно всю команду в ПК (можно какую-то константу в каком-то байте добавлять при отправке при желании) Реализация этого простая - простой loopback, т.е. замыкаете приемник и передатчик
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|