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

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


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

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



Цитата(Raven @ Jul 3 2017, 19:29) *

хорошая статейка... sm.gif
не подскажите, где лежат исходники MIPSfpga процессора?


--------------------
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 4 2017, 06:13
Сообщение #17


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

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



Цитата(Raven @ Jul 3 2017, 21:29) *

спасибо.
Go to the top of the page
 
+Quote Post
GriXa
сообщение Jul 4 2017, 09:26
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 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
XVR
сообщение Jul 4 2017, 10:31
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 032
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Maverick @ Jul 3 2017, 22:10) *
не подскажите, где лежат исходники MIPSfpga процессора?

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

Ну или просто возьмите MicroBlase - он и есть MIPS
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 4 2017, 11:06
Сообщение #20


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

Группа: Участник
Сообщений: 1 383
Регистрация: 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
novikovfb
сообщение Jul 4 2017, 11:08
Сообщение #21


Местный
***

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



Цитата(Jenya7 @ Jul 4 2017, 10:13) *
спасибо.

MIPSfpga - это не спортивно, ведь тогда задача решается на прошитом в FPGA процессоре.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jul 4 2017, 11:28
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 19-10-13
Пользователь №: 78 795



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


Вам шашечки или ехать? (с)
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jul 4 2017, 11:35
Сообщение #23


Местный
***

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



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

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

Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 4 2017, 11:44
Сообщение #24


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

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



Зачем микропроцессор, неужели команд так много и сложные? Неужели связки декодер + мультиплексор не достаточно?
Тем более данные приходят последовательно и на более низкой частоте, чем частота ПЛИС
Jenya7 Выложите протокол обмена на основе которого Вы хотите делать парсер
Или Вы хотите хардкор, как ранее предположили?


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

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


Гуру
******

Группа: Свой
Сообщений: 3 032
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Maverick @ Jul 4 2017, 14:44) *
Или Вы хотите хардкор, как ранее предположили?


Цитата
«Механитис – профессиональное заболевание тех, кто верит, что ответ математической задачи, которую он не может ни решить, ни даже сформулировать, легко будет найти, если получить доступ к достаточно дорогой вычислительной машине».
Б. Купман, Исследование операций, 4, 442 (1956).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 5 2017, 05:58
Сообщение #26


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

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



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

Протокол простой. Пользователь вводит команду в терминале. Конец команды - \r. Например задать верхний лимит - top 1000\r. Прочитать верхний лимит - top\r без аргумента. В FPGA модуль UART принял чары до \r. Ну а дальше надо парсить - выделить аргументы, найти команду, по команде выполнить действие. Выше я приводил реализацию на С в микроконтроллере.

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


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

Группа: Модераторы
Сообщений: 3 394
Регистрация: 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.

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


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

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



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

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

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

Сообщение отредактировал Jenya7 - Jul 5 2017, 07:42
Go to the top of the page
 
+Quote Post
vladec
сообщение Jul 5 2017, 07:45
Сообщение #29


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

Группа: Свой
Сообщений: 1 024
Регистрация: 3-10-05
Из: Москва
Пользователь №: 9 158



Посмотрите по ресурсам, может уложите задачу в один-два PicoBlaze
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 5 2017, 07:52
Сообщение #30


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

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



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

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

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

а236369к

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

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

Для подобного протокола процессор не нужен...
В простом случае подтверждение получения команды ПЛИС - Вы просто возвращаете обратно всю команду в ПК (можно какую-то константу в каком-то байте добавлять при отправке при желании)
Реализация этого простая - простой loopback, т.е. замыкаете приемник и передатчик


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

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

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

 


RSS Текстовая версия Сейчас: 20th November 2017 - 00:24
Рейтинг@Mail.ru


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