Jump to content

    
Sign in to follow this  
Skryppy

Генерация синхронного кода VHDL из блоков Matlab Function

Recommended Posts

Здравствуйте. Генерирую VHDL код из блока Matlab Function, проблема в том, что сгенерированный VHDL код часто

асинхронен и не содержит портов clk,rst,ce. Непонятно как сделать генерируемый код синхронным.

Пример матлаба по генерации "Symmetric Fir Filter" делает синхронный VHDL код, так что дело в правильном написании функции.

Я думаю, что умножение, сравнение чисел, должно обязательно быть синхронным, иначе все развалится на высоких частотах,

может это не так?

 

Конкретный пример, пусть есть функция матлаб:

 

function data_out = my_mult(data_in1, data_in2)
    data_out = int32(data_in1 * data_in2);
end

 

Сгенерированный код VHDL:

 

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY my_mult IS
  PORT( data_in1                          :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        data_in2                          :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        data_out                          :   OUT   std_logic_vector(31 DOWNTO 0)  -- int32
        );
END my_mult;


ARCHITECTURE rtl OF my_mult IS

  -- Signals
  SIGNAL data_in1_signed                  : signed(15 DOWNTO 0);  -- int16
  SIGNAL data_in2_signed                  : signed(15 DOWNTO 0);  -- int16
  SIGNAL data_out_tmp                     : signed(31 DOWNTO 0);  -- int32
  SIGNAL mul_temp                         : signed(31 DOWNTO 0);  -- sfix32
  SIGNAL cast                             : signed(15 DOWNTO 0);  -- int16

BEGIN
  data_in1_signed <= signed(data_in1);

  data_in2_signed <= signed(data_in2);

  mul_temp <= data_in1_signed * data_in2_signed;
  
  cast <= X"7FFF" WHEN (mul_temp(31) = '0') AND (mul_temp(30 DOWNTO 15) /= X"0000") ELSE
      X"8000" WHEN (mul_temp(31) = '1') AND (mul_temp(30 DOWNTO 15) /= X"FFFF") ELSE
      mul_temp(15 DOWNTO 0);
  data_out_tmp <= resize(cast, 32);

  data_out <= std_logic_vector(data_out_tmp);

END rtl;

Edited by Skryppy

Share this post


Link to post
Share on other sites

Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

Share this post


Link to post
Share on other sites

Обычно использование блока Matlab Function усугубляет непонимание, лучше его избегать, имеется достаточный набор примитивных блоков, чтобы описать всё.

Share this post


Link to post
Share on other sites
Да, я так и сделаю. Но этот пример простой, блоки на 3000 строк кода тоже придется так переделывать и еще не факт, что внутри блока все успеет за такт. На форумах по матлаб пишут, что компилятор сам выбирает когда ему ставить порты, а когда нет, не понятна причина, по которой в одном случае все синхронно, а в другом и так пойдет.

Причина как раз понятна. В вашем простом примере нет ни одного состояния (регистра, Unit Delay). Когда логика полностью stateless, генератор кода не генерирует дополнительные порты.

 

Как сказали выше, добавьте Unit Delay, А еще правильней - правой мышью по блоку MATLAB Function, HDL Code -> HDL Block Properties -> OutputPipeline поставить 1. Тогда модель не будет захламляться лишними блоками.

Edited by MiPe

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