Jump to content

    
Sign in to follow this  
nbjkm

MATLAB HDL Coder + Quartus

Recommended Posts

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

В 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 не дало никакого эффекта

Share this post


Link to post
Share on other sites
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, который знает все тонкости целевого семейства ПЛИС.

Edited by goodsoul

Share this post


Link to post
Share on other sites
2 minutes ago, goodsoul said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

4 hours ago, new123 said:

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
10 hours ago, nbjkm said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this