Lutovid 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Всем привет! Столкнулся с такой задачей: есть массив регистров reg [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH]; В нем записан блок данных; в начале данных есть 3 заголовка R_ID_block, OFFSET_block, SIZE_block; максимальная величина первого 6 байт, остальных двух - 12; загвоздка в том, что они могут быть меньшей длины - каждый может быть от 1 до максимального значения байт и между ними разделительный символ 8'h3B Иначе говоря надо задетектить сначала первый разделительный символ, записать данные, потом второй, потом третий, сохранить данные в 3 соответствущих регистра и все это за один такт. Получается дерево из if - ничего лучше пока в голову не пришло< может вы что-нибудь подскажете(но не повышение частоты для парсинга)? Но вопрос заключается в том - как сократить запись и не писать целое дерево такого вида: if(xgmii_rxd_in_sh_r[1][15:8] == 8'h3B)begin R_ID_block <= {32'h30303030, xgmii_rxd_in_sh_r[1][7:0]}; if (xgmii_rxd_in_sh_r[1][31:24] == 8'h3B) begin OFFSET_block <= {88'h3030303030303030303030, xgmii_rxd_in_sh_r[1][23:16]}; if (xgmii_rxd_in_sh_r[1][47:40] == 8'h3B) begin SIZE_block <= {88'h3030303030303030303030, xgmii_rxd_in_sh_r[1][39:32]}; end else if (xgmii_rxd_in_sh_r[1][55:48] == 8'h3B) begin SIZE_block <= {80'h30303030303030303030, xgmii_rxd_in_sh_r[1][39:32], xgmii_rxd_in_sh_r[1][47:40]}; end ........etc // :cranky: Если я опишу через 3 вложенных цикла с операциями if, то это приведет к некорректному детектированию - внешний цикл отработает параллельно все 8'h3B в массиве xgmii_rxd_in_sh_r , а нужно, что бы внешний задетектировал только первый, второй цикл - второй символ и третий - третий символ P.S. Извиняюсь что кривовато объяснил, но надеюсь вы меня все же поймете) P.P.S. сразу скажу, что парсинг этих полей нельзя перенести на микроблэйз или другой процессор Заранее спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Столкнулся с такой задачей: есть массив регистров reg [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH]; В нем записан блок данных; в начале данных есть 3 заголовка R_ID_block, OFFSET_block, SIZE_block; максимальная величина первого 6 байт, остальных двух - 12; загвоздка в том, что они могут быть меньшей длины - каждый может быть от 1 до максимального значения байт и между ними разделительный символ 8'h3B P.S. Извиняюсь что кривовато объяснил, но надеюсь вы меня все же поймете) P.P.S. сразу скажу, что парсинг этих полей нельзя перенести на микроблэйз или другой процессор Судя по "xgmii" речь идет о принятых пакетах данных. А это означает, что подход "сначала принимаем, а потом обрабатываем" - не правильный. А парсить можно и в темпе приема, ведь все данные не появляются одномоментно. А это значит, что можно организовать дополнительные поля для служебной информации и в темпе приема туда записавать частично обработанную информацию... Что же касается приведенных ТС кодов - то это жуткий дешифратор на логике или ПЗУ, и с жуткой разрядностью, который сожрет прорву ресурсов.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Судя по "xgmii" речь идет о принятых пакетах данных. А это означает, что подход "сначала принимаем, а потом обрабатываем" - не правильный. А парсить можно и в темпе приема, ведь все данные не появляются одномоментно. А это значит, что можно организовать дополнительные поля для служебной информации и в темпе приема туда записавать частично обработанную информацию... Абсолютно с вами согласен, я так и делаю< просто не стал вдаваться в такие подробности - суть проблемы это не меняет - если бы был например gmii интерфес в 1 байт - то да; но в моем случае интерфейс 8 байт, это приведет к созданию конечного автомата на (6+12+12)/8 состояний в каждом из который здоровое дерево из if Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Абсолютно с вами согласен, я так и делаю< просто не стал вдаваться в такие подробности - суть проблемы это не меняет - если бы был например gmii интерфес в 1 байт - то да; но в моем случае интерфейс 8 байт, это приведет к созданию конечного автомата на (6+12+12)/8 состояний в каждом из который здоровое дерево из if " в каждом из который здоровое дерево из if" - это в файле... Но в железе это немного по-другому. Есть регистр автомата и к нему на входе один дешифратор. Он один для всех состояний автомата. И он определяется разрядностью автомата + разрядностью входных сигналов автомата... И вот в этом вся проблема. Другое дело, что дешифратор может оказаться не полным... Т.е. не все разряды нужны для дешифрации состояний... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба " в каждом из который здоровое дерево из if" - это в файле... Но в железе это немного по-другому. Есть регистр автомата и к нему на входе один дешифратор. Он один для всех состояний автомата. И он определяется разрядностью автомата + разрядностью входных сигналов автомата... И вот в этом вся проблема. Другое дело, что дешифратор может оказаться не полным... Т.е. не все разряды нужны для дешифрации состояний... Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Так вопрос у меня по сокращению записи... А зачем "сокращать", если эта запись будет работать? Дело не в том, как записать, а в том, как удобно отлаживать и сопровождать. Если Вам так удобнее, то пишите так. Если удобнее через casex, то напишите через casex. Вот только что написал: https://electronix.ru/forum/index.php?s=&am...t&p=1490539 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба А зачем "сокращать", если эта запись будет работать? Затем что бы 1)код было проще отлаживать; 2)быстрее написать код; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Приветствую! Так вопрос у меня по сокращению записи... об удобстве конечного автомата я не спорю... Разбивайте сложную проблему на простые компоненты. Что нужно сделать - 1) найти положение разделителей во входном векторе function find_poz (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], input [..] pattern, output [...] poz0,poz1,poz2); 2) скопировать диапазон байт между разделителями function mux_out (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], [...] pz_begin, pz_end, output [...] out); И ни какого леса if ... else :) Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Затем что бы 1)код было проще отлаживать; 2)быстрее написать код; Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет... Да хоть их уберите в отдельный файл, если в этом они мешают... Вот и будет Вам "сокращение"... А все остальное - не имеет смысла... А "быстрее написать код" - вовсе неправильный метод, но об этом я уже написал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Приветствую! Разбивайте сложную проблему на простые компоненты. Что нужно сделать - 1) найти положение разделителей во входном векторе function find_poz (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], input [..] pattern, output [...] poz0,poz1,poz2); 2) скопировать диапазон байт между разделителями function mux_out (input [63:0] xgmii_rxd_in_sh_r [1:XGMII_RX_REG_LENGTH], [...] pz_begin, pz_end, output [...] out); И ни какого леса if ... else :) Успехов! Rob. Отличная идея, спасибо! Ну так и сделайте параметры или локальные параметры вместо 88'h3030303030303030303030 и прочей... Дайте им адекватные названия, всяко легче читаться будет... Да хоть их уберите в отдельный файл, если в этом они мешают... Вот и будет Вам "сокращение"... А все остальное - не имеет смысла... А "быстрее написать код" - вовсе неправильный метод, но об этом я уже написал... for generate тоже сокращение записи - я говорил примерно об этом, мне кажется вы меня не правильно поняли, так как я, возможно, формулировал вопрос не совсем корректно, прошу прощения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться