Jump to content
    

Matlab Simulink HDL Coder

Доброго времени суток!

 

Давненько пользуюсь Матлабом для моделирования систем управления, обращал внимание на его возможность транслирования собираемых моделей под Visual C/C++ и Embedded Target Texas Instruments, однако ввиду очевидной неоптимальности транслируемого кода так и не применял его на практике.

 

Чуть позже довелось познакомиться с System Generator Toolbox от Xilinx. Подумал ну вот наконец-то скорость разработок систем увеличется. Собрал коскадную систему регулирования для DC мотора и до чего удивился когда эта моделька не влезала в Миллионник: генерируемый код со всеми "wrapper" переваливал за 7000 строк и плюс к этому некоторые блоки сравнения отказывались синтезироваться. В результате хирургического вмешательсвта моделька заработала. Вывод для себя:

1.Попробовать что то собрать можно, но применять как готовую билиотеку нет смысла.

2.Подключать рукотворные кусочки в System Generator, и далее пользоваться им как ТОП модулем лишь только красоты ради.

 

Жаль а как всё хорошо начиналось.

 

И вот недавно наткнулся на Simulink HDL Coder. Обладает аж 84 синтезируемыми блоками (r2006b) (в коммандной строке набрать hdllib) и плюс к этому поддерживаются диаграммы состояний. Собрал ту же самую модельку. Сгенерил код. ~100 строк. Каждое соединение блочка assign в коде, каждое действие над отдельным операндом always. Как всё это будет работать?

 

Прикрепляю материал на обсуждение

 

// -------------------------------------------------------------

//

// Module: asd

// Simulink Path: asd

// Created: 2007-04-20 10:49:28

// Hierarchy Level: 0

//

//

// -------------------------------------------------------------

 

`timescale 1 ns / 1 ns

 

module asd

(

clk,

reset,

clk_enable

);

 

 

input clk;

input reset;

input clk_enable;

 

parameter [31:0] Gain1_gainparam = 32'h0000000A; // uint32

 

wire enb;

reg [31:0] Counter_Limited_out1; // uint32

reg [31:0] Integer_Delay1_out1; // uint32

wire [31:0] Sum_out1; // uint32

reg [31:0] Integer_Delay_out1; // uint32

wire [31:0] Gain1_out1; // uint32

wire [31:0] add_cast; // uint32

wire [31:0] add_cast_1; // uint32

wire [32:0] add_temp; // ufix33

wire [63:0] mul_temp; // ufix64

 

always @ (posedge clk or posedge reset)

begin: Counter_Limited_process

if (reset == 1'b1) begin

Counter_Limited_out1 <= 32'h00000000;

end

else begin

if (enb == 1'b1) begin

if (Counter_Limited_out1 == 32'h02FAF080) begin

Counter_Limited_out1 <= 32'h00000000;

end

else begin

Counter_Limited_out1 <= Counter_Limited_out1 + 1;

end

end

end

end // Counter_Limited_process

 

always @ (posedge clk or posedge reset)

begin: Integer_Delay1_process

if (reset == 1'b1) begin

Integer_Delay1_out1 <= 0;

end

else begin

if (enb == 1'b1) begin

Integer_Delay1_out1 <= Counter_Limited_out1;

end

end

end // Integer_Delay1_process

 

assign add_cast = Integer_Delay1_out1;

assign add_cast_1 = Integer_Delay_out1;

assign add_temp = add_cast + add_cast_1;

assign Sum_out1 = (add_temp[32] != 1'b0) ? 32'b11111111111111111111111111111111 : add_temp[31:0];

 

always @ (posedge clk or posedge reset)

begin: Integer_Delay_process

if (reset == 1'b1) begin

Integer_Delay_out1 <= 0;

end

else begin

if (enb == 1'b1) begin

Integer_Delay_out1 <= Sum_out1;

end

end

end // Integer_Delay_process

 

assign mul_temp = Sum_out1 * Gain1_gainparam;

assign Gain1_out1 = (mul_temp[63:32] != 32'h00000000) ? 32'b11111111111111111111111111111111 : mul_temp[31:0];

 

assign enb = clk_enable;

 

endmodule // asd

post-12984-1177084826_thumb.jpg

Share this post


Link to post
Share on other sites

Как всё это будет работать?

А никак. У этого модуля ни одного выхода нет. :)

 

Ну а если серьёзно то что Вы хотите получить в результате? Чтобы из схемы которую Вы нарисовали сделать HDL код SimuLink можно было не устанавливать. Что бы понять как она работает - тем более.

 

Обычно процесс создания кода для FPGA выглядит так (по крайней мере у меня):

1. Построение алгоритма (функциональной схемы и т.п.)

2. Проверка работы алгоритма в Matlab, просто на С или как-то ещё. Тут же подбираю коэффициенты/инженерные параметры и пр.

3. Перенос алгоритма на Verilog

4-6. Синтез, симуляция, совмещение с другими модулями, отладка, тестирование

 

И этап 3 по сравнению с остальными отнимает совсем не много времени.

Share this post


Link to post
Share on other sites

"3. Перенос алгоритма на Verilog"

Подскажите , с помощью чего и как это можно сделать?

Share this post


Link to post
Share on other sites

"3. Перенос алгоритма на Verilog"

Подскажите , с помощью чего и как это можно сделать?

 

Извините, что вклиниваюсь, но все равно отвечу. Лучше чем вы это сделаете руками, вряд ли получится, в этом лично я абсолютно убежден. Что касается, так сказать, "автоматизации процесса", то это уже из области синтеза кода на С, SystemC и т.п. Для примера.

Share this post


Link to post
Share on other sites

"Лучше чем вы это сделаете руками, вряд ли получится, в этом лично я абсолютно убежден"

Бывают случаи , когда нужно понять в какую сторону двигаться в плане разработки , что лучше использовать, а что лучше не использовать, другими словами найти нужный метод, алгоритм. Делать всё своими руками ради пробы, я думаю очень долго и не практично.

Но ближе к теме. Вы сами используете эту программу "Catapult Synthesis" какие впечатления? что умеет? Как её связать с Матлабом, а полученный код упаковать в крастал от Altera. Поделитесь

Share this post


Link to post
Share on other sites

"Лучше чем вы это сделаете руками, вряд ли получится, в этом лично я абсолютно убежден"

Бывают случаи , когда нужно понять в какую сторону двигаться в плане разработки , что лучше использовать, а что лучше не использовать, другими словами найти нужный метод, алгоритм. Делать всё своими руками ради пробы, я думаю очень долго и не практично.

Но ближе к теме. Вы сами используете эту программу "Catapult Synthesis" какие впечатления? что умеет? Как её связать с Матлабом, а полученный код упаковать в крастал от Altera. Поделитесь

 

У нас в конторе никто, к сожалению, не занимался синтезом с такого высокого уровня. В силу специфики заказчика для нас не слишком критично время и цена разработки, зато важно качество конечного продукта в плане быстродействия и запаса по условиям эксплуатации, поэтому RTL описания делаются вручную, а сами алгоритмы предварительно обкатываются программно на С++, но код напрямую в HDL никто не перегоняет. Лично с Catapult не работал, но в области синтеза с высокоуровневых описаний это один из реально работающих продуктов, думаю что на форуме есть тесно знакомые с ним люди, к сожалению, я пока не из их числа, но надеюсь со временем это обстоятельство исправить. О ручном переводе на HDL я заговорил только потому, что автоматические методы, на сколько я знаю, пока еще дают очень большую избыточность, поэтому быстродействие и требования к ресурсам ПЛИС оставляют желать много лучшего, так что уменьшившееся time-to-market компенсируется возросшей себестоимостью продукции (кристаллы пожирнее и побыстрее). Услышать мнение людей, реально работающих в этой области мне самому было бы очень интересно.

Share this post


Link to post
Share on other sites

"3. Перенос алгоритма на Verilog"

Подскажите , с помощью чего и как это можно сделать?

 

При переводе алгоритма из С в HDL возникает очень много степеней свободы для реализации. Совершенно очевидно, например, как преревести строчку типа "A = (B+C) << 2" в Verilog. Но это недолго переписать и руками.

А теперь представьте как Вы будете описывать "автоматизатору процесса" способы обработки и хранения данных (конвейер, асинхронная обработка, очередь и т.п.); внешние интерфейсы модуля; во что преобразовывать циклы и условные операторы.

 

В результате оказывается что в большинстве случаев проще и быстрее использовать какую-то имеющуюся заготовку и немного модифицировать её под конкретный алгоритм. Лично у меня не возникало ситуации когда перенос _смысловой_ части алгоритма на HDL отнимал бы много времени. И соответственно не возникает потребность в каком-либо стороннем софте для этих целей.

Share this post


Link to post
Share on other sites

На сайте Altera много примеров DSP разработок в М файлах.

У них же есть фирменная утилита DSP билдер , которая генирит HDL код

Вот я и подумал , что в матлабе должны быть какие то свои средства для этого

Share this post


Link to post
Share on other sites

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

 

 

Все эти инструменты в данное время позиционируются именно для БЫСТРОГО создания прототипа устройства, отладки алгоритма и определения требуемых параметров. Если при этом реализация в железе удовлетворяет в плане быстродействия и объема, то это только большой плюс.

Сам периодически использую Matlab + Xilinx или Synplify DSP генератор для моделирования и отладки своих устройств. Правда после этого всегда приходится переписывать реализацию руками для получения требуемой скорости. Так как при генерации по модели используются блоки Xilinx Coregen или библиотеки Synplify, а оптимизация у них не всегда на высоте.

 

Успехов! Rob.

Share this post


Link to post
Share on other sites

Постоянно использую Xilinx System Generator. Все блоки в нем дают прекрасное быстродействие, все в конвейере , все быстро и классно. Есть глючки - но где их нет.

Synplify DSP - нету Cosimulation - .

Accel DSP - буду пробовать щас (cosimualtion в 9.1 вроде сделали +) .

 

Скачал HDL Coder для MATLAB (интересно сравнить)- там какойто файл hdlcoder.enc . А как его установить в MATLAB?

Share this post


Link to post
Share on other sites

Сейчас скачиваю MATLAB2007а, там вроде HDL Coder должен входить в комплект. Когда докачается посмотрю.

А у вас какая версия MATLAB?

Share this post


Link to post
Share on other sites

MATLAB2007а вышел пару недель назад

Может у вас MATLAB2006а, если так , то там точно HDL Coder нет. У меня сейчас MATLAB2006а стоит

Share this post


Link to post
Share on other sites

Постоянно использую Xilinx System Generator. Все блоки в нем дают прекрасное быстродействие, все в конвейере , все быстро и классно. Есть глючки - но где их нет.

Synplify DSP - нету Cosimulation - .

Accel DSP - буду пробовать щас (cosimualtion в 9.1 вроде сделали +) .

 

Скачал HDL Coder для MATLAB (интересно сравнить)- там какойто файл hdlcoder.enc . А как его установить в MATLAB?

 

Извините, что вклиниваюсь, но не могли ли вы подсказать, как использовать xilinx system genarator?

Точнее готовый код из него получить.

Что именно нужно компилировать?

HDL netlist, NGC Netlist, Bitstrem, EDK export tool, Hardware Co-S..., Timing an...?

И что делать после компиляции с полученными файлами.

Будет ли там сразу готовый код или его надо будет куда-нибудь грузить и дальше компилировать.

Или хотя бы ссылку дайте, где про процесс компиляции можно почитать, а то help не очень пока понятен. Спасибо.

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.

×
×
  • Create New...