Перейти к содержанию
    

MATLAB HDL Coder + Quartus

Доброго здоровья! 

В MATLAB имеется блок "RS Encoder/Decoder HDL Optimized". Я синтезирую его HDL-код, получается неплохо + еще довольно читабельно. И казалось бы можно праздновать, но нет. В синтезированном коде есть много объявлений памяти и её инициализации в виде 

  wire [7:0] gfomegapowertable_43 [0:255];  // ufix8 [256]

  assign gfomegapowertable_43[0] = 8'b00000000;
  assign gfomegapowertable_43[1] = 8'b10000000;
  assign gfomegapowertable_43[2] = 8'b00011101;
  assign gfomegapowertable_43[3] = 8'b10011101;
  assign gfomegapowertable_43[4] = 8'b00111010;
    
  ....
    
  assign gfomegapowertable_43[255] = 8'b01100010;
    
  assign omega8powertable = gfomegapowertable_43[omega8powerreg];

 

Подсовываю код в квартус и получаю закономерный результат - он вообще не определяет данный код как память и клепает всё на логике. В результате чего получаю скорость ~70 МГц, что неприемлемо. Данный способ объявления памяти я встречаю впервые, поскольку альтера рекомендует описывать память только через регистры. 

Сталкивался ли кто-нибудь с подобными вещами? Самостоятельно переписывать весь код больно уж ресурсозатратно. Да и к тому же матлаб везде нахваливают за его удобство и чуть ли не пару кнопок нажал и всё - код сгенерирован и можно работать. 

Использование директив ramstyle не дало никакого эффекта

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 minutes ago, nbjkm said:

Доброго здоровья! 

В MATLAB имеется блок "RS Encoder/Decoder HDL Optimized". Я синтезирую его HDL-код, получается неплохо + еще довольно читабельно. И казалось бы можно праздновать, но нет. В синтезированном коде есть много объявлений памяти и её инициализации в виде 


  wire [7:0] gfomegapowertable_43 [0:255];  // ufix8 [256]

  assign gfomegapowertable_43[0] = 8'b00000000;
  assign gfomegapowertable_43[1] = 8'b10000000;
  assign gfomegapowertable_43[2] = 8'b00011101;
  assign gfomegapowertable_43[3] = 8'b10011101;
  assign gfomegapowertable_43[4] = 8'b00111010;
    
  ....
    
  assign gfomegapowertable_43[255] = 8'b01100010;
    
  assign omega8powertable = gfomegapowertable_43[omega8powerreg];

 

Подсовываю код в квартус и получаю закономерный результат - он вообще не определяет данный код как память и клепает всё на логике. В результате чего получаю скорость ~70 МГц, что неприемлемо. Данный способ объявления памяти я встречаю впервые, поскольку альтера рекомендует описывать память только через регистры. 

Сталкивался ли кто-нибудь с подобными вещами? Самостоятельно переписывать весь код больно уж ресурсозатратно. Да и к тому же матлаб везде нахваливают за его удобство и чуть ли не пару кнопок нажал и всё - код сгенерирован и можно работать. 

Использование директив ramstyle не дало никакого эффекта

Давненько я в RTL не залезал, но судя по коду - это вообще не память. Это чистая комбинационка, поэтому ramstyle здесь бессилен.

>>Да и к тому же матлаб везде нахваливают за его удобство и чуть ли не пару кнопок нажал и всё - код сгенерирован и можно работать. 
К сожалению результат нагенеренного кода не всегда оптимален для ПЛИС, особенно для конкретного сеймейства, где могут быть дополнительные заморочки связанные с конвейрезицией, ресетами и пр. Поэтому старайтесь использовать родные вендорские IP ядра или DSP builder, который знает все тонкости целевого семейства ПЛИС.

Изменено пользователем goodsoul

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, goodsoul said:

Давненько я в RTL давненько не залезал, но судя по коду - это вообще не память. Это чистая комбинационка, поэтому ramstyle здесь бессилен.

>>Да и к тому же матлаб везде нахваливают за его удобство и чуть ли не пару кнопок нажал и всё - код сгенерирован и можно работать. 
К сожалению результат нагенеренного кода не всегда оптимален для ПЛИС, особенно для конкретного сеймейства, где могут быть дополнительные заморочки связанные с конвейрезицией, ресетами и пр. Поэтому старайтесь использовать родные вендорские IP ядра или DSP builder, который знает все тонкости целевого семейства ПЛИС.

DSP Builder так и не научился нормально использовать, ошибка на ошибке и ошибкой погоняет. К тому же на высокоскоростной IP RS нет лицензии в Quartus, а в MATLAB всё выглядело довольно удобненько. 

Кстати, к слову, раньше сталкивался с генерацией Lookup table из того же матлаба. Это была обычная ROM, но синтезировалась точно таким же образом как и в данном случае. Там всё легко можно было руками поправить, я просто менял wire на logic и квартус все прекрасно понимал. Но опять же, делалось это только вручную. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ramstyle к wire не применяется. Только к reg подобному. Потом в отчете квартуса можно глянуть, где он расположил в ram или нет, насколько помню в разделе Fitter, сейчас не с руки смотреть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

4 hours ago, new123 said:

ramstyle к wire не применяется. Только к reg подобному. Потом в отчете квартуса можно глянуть, где он расположил в ram или нет, насколько помню в разделе Fitter, сейчас не с руки смотреть

Вам нужно в своей моделе сделать так  чтобы был как минимум такт задержки для чтения из такой ROM (чтобы  был регистр на входе адреса или выходе данных), а  иначе Qu  не может засунуть такую память в свои примитивы.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, nbjkm said:

Сталкивался ли кто-нибудь с подобными вещами? Самостоятельно переписывать весь код больно уж ресурсозатратно.

на форуме выкладывал RS кодек, можете оттуда взять генерацию нужных вам полей галуа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...