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

C++ -> Matlab -> VHDL

Есть код на си++. Надо получить синтезируемый VHDL код, используя в качестве посредника MATLAB.

Т.е. надо сначала перевести си++ код в матлабовский. Затем из матлабовского в VHDL.

Как это делается если такое возможно кто знает ?

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


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

не весь код на C++ можно запихнуть в matlab. и далеко не вcе из матлаба можно превратить в VHDL.

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


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

Есть код на си++. Надо получить синтезируемый VHDL код, используя в качестве посредника MATLAB.

Т.е. надо сначала перевести си++ код в матлабовский. Затем из матлабовского в VHDL.

Как это делается если такое возможно кто знает ?

может выложи(напиши) задачу которую нужно Вам реализовать на FPGA. А тут посоветуют с чего начать и как поступить

 

ЗЫ просто совет

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


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

какими средствами и как это делается
руки/голова или матлаб(но как уже сказали он не всё из с++ кушает потому опять же нужны руки/голова :laughing: ). Есть в принципе и другие кроме матлаба средства но вроде они похуже будут...

 

Перекладывал с просто СИ на верилог - геморно и относительно долго, но эффективнее чем через матлаб в конце получилось.

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


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

Все та же задача: http://electronix.ru/forum/index.php?showtopic=69474

Я сколько мучался, так и не смог написать синтезируемый код на Verilog. То одно то другое.

Вот по совту форумчан поставил Matlab.

Суть такая:

Я пишу программу на Matlab или импортирую Си++ код, что было бы лучше.

Далее мне надо перейти от чисел с плавающей запятой к числам с фиксированной запятой.

Или есть вариант программы на Си++ на числах integer.

Далее надо сгенерировать синтезируемый код VHDL.

Программу вроде бы оптимизировал для ПЛИСки. Все коэффициенты предварительно уже посчитаны. Много чего выкинул. Минимальный код вот такой.

void __fastcall TForm1::Button2Click(TObject *Sender)
{

int    coeff[31]=
   {
88551,
88833,
88833,
89114,
89114,
89395,
89395,
89676,
89676,
89957,
89957,
90237,
90237,
90517,
90517,
90797,
90797,
91077,
91077,
91357,
91357,
91636,
91636,
91915,
91915,
92194,
92194,
92473,
92473,
92751,
92751
} ;

   int Q0=0, Q1=0, Q2=0;
   int magnitude[32],magn=0;
   short int cc=0;
   short int magcnt=0;
   short int Fsig;

   for(Fsig=2585;Fsig<2616;Fsig++)
   {

    for(int y=0;y<op+1;y++)
    {
           Q0=(coeff[cc]*Q1+100000*Q2-100000*data[y])/-100000;
           Q2=Q1;
           Q1=Q0;

    }
         /*y=a*x-w+z
         y=((-100000*(a*x-w+z))/-100000)
         y=((-100000*a*x+100000*w-100000*z))/-100000)  */
         /*
         y=a*a+b*b+a*b*с
         y=(-100000*(a*a+b*b+a*b*с))/-100000
         y=(-100000*a*a-100000*b*b-100000a*b*с))/-100000
         */
   magnitude[magcnt]=Q1*Q1+Q2*Q2-((Q1*Q2*coeff[cc])/100000); // мощность в квадрате
   Form1->Memo2->Lines->Add(FloatToStr(magnitude[magcnt]));
   Q1=0;Q2=0;Q0=0;
   magcnt++;
   cc++;
   }
       Form1->Edit1->Text= FloatToStr(magn);

  return;

 

Изначально коэф-ты имели значения около -0.9346235 типа такого. Чтобы перейти на integer я их умножил на -100000. Соответственно некоторые остальные переменные тоже пришлось умножить на это число. Тут не самый лучший вариант конечно. Лучше умножать на 131072 - это 2^17. Таким образом вместо умножения будет просто сдвиг регистра влево на 17 разрядов, что ускорит вычислительный процесс.

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


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

самое правильный алгоритм такой:

1. Делаете в симулинке модель, того что вы написали с floating point из простейших модулей сложения, умножения, вычитания, задержек и так далее (от операций деления отличного от степени 2ки посторонитесь(!) )...

2. проверяете что действительно все одинаково получилось.

3. Смотрите на Scope'ах максимальные значения, которые у вас получаются, и приводите к fixed point определенной разрядности.

4. Перекидываете свои коэффициенты в fixed point в блок памяти ROM.

5. Описываете свою схему в vhdl на основе того что нарисовали в simulink.

6. симулируете-верифицируете все это добро.

 

PS может помочь с понимание как написать те или иные функции. только хз сколько оно памяти у вас сожрет из плис, вполне возможно так вот в лоб ваш алгоритм и не удастся разместить в разумных размерах FPGA.

http://www.c-to-verilog.com/online.html

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


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

Что такое op в коде? Если константа, то этот код можно перевести на HDL - получится афигительная портянка из умножителей и сумматоров. Чип, в который это влезет, будет стоить килобаксы (не меньше) :(

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


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

Вот это:

for(Fsig=2585;Fsig<2616;Fsig++)

что такое? В цикле Fsig не используется. Значит на самом деле от 0 до 31. В параллель эти итерации в аппаратуре считать - действительно нужен монстр.

 

Разумно разложить расчет для начала на 32 этапа (потом посмотрим, вложится ли один этап в один такт или нет, IMHO нет). Значит, заводите счетчик состояний от 0 до 31 (или больше, если выделяются этапы инициализации/завершения например).

 

Про умножения на степень двойки сами Вы правильно написали. Уберите эти страшные 100000. Уберите деления и умножения, все замените сдвигами.

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


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

MegaFPGA,

я вижу 2 класса тулзов, автоматизирующих решение Вашей задачи.

1. Перевод с++ -> hdl . Например mentor catapult.

2. Перевод simulink model -> hdl. Универсальная - synplify dsp, под альтеру dspbuilder, под ксайлинкс не помню как называется.

Мой совет - сделать руками и написать на veriloge или vhdl. Времени займет едва и больше, а знания Ваши и умения возрастут значительно.

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


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

Перевод с++ -> hdl . Например mentor catapult.

Любителей плюсов там ждёт много интересного :laughing:

Думаю лучше самому переписать, хотя если опыта в HDL нет - как знать...

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

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


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

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

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

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

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

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

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

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

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

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