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