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

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

 

Давненько пользуюсь Матлабом для моделирования систем управления, обращал внимание на его возможность транслирования собираемых моделей под 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

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


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

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

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

 

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

 

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

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

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

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

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

 

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

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


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

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

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

 

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

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


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

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

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

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

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


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

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

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

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

 

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

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


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

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

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

 

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

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

 

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

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


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

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

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

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

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


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

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

 

 

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

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

 

Успехов! Rob.

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


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

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

Synplify DSP - нету Cosimulation - .

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

 

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

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


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

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

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

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


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

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

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

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


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

Постоянно использую 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 не очень пока понятен. Спасибо.

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


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

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

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

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

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

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

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

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

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

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