реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> fixed-point, matlab, fpga - помогите разобраться
_Ivan_33
сообщение Sep 1 2014, 13:22
Сообщение #16


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Я раньше игрался с кордиком в матлабе и увидел реализацию тригонометрической функции в верилоге - да, это кордик. Круто же!
Описание блоков нашел в справке матлаба. Вообщем, вопросы пока что кончились.
Крутая штука этот hdl coder...


--------------------
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Sep 1 2014, 18:22
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Команда hdllib внутри Матлаба открывает библиотеку поддерживаемых элементов для hdl кодера.
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 2 2014, 13:37
Сообщение #18


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Все-таки остался висеть следующий вопрос:

Вот я сделал модель, прогнал симуляцию, перевел все в fixed-point, прогнал симуляцию, сравнил результаты. Теперь я генерю hdl код. Он у меня делается как wire, без регистров. Если вставить туда блок delay z^-1 то выходной график сдвигается на 2 единицы времени относительно модель без блока delay и отбрасываются биты дробной части из-за чего график становится угловатым. HDL код вообще не генерится. Что я делаю не так?


--------------------
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Sep 2 2014, 14:28
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Блок Delay спокойно синтезируется и, в общем случае, не должен влиять на точность выхода.

Если вам нужно поставить регистры по входу или выходу подсистемы, то это можно сделать в настройках "HDL Code" -> "HDL Block Properties".
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 4 2014, 08:12
Сообщение #20


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



а вот еще вопрос - у меня получилось так, что длина слова меньше, чем длина дробной части - это глюк или фича? может я что-то недопонимаю, или прога мне намекает, что надо увеличить ширину слова?


--------------------
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Sep 4 2014, 08:28
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Просто динамический диапазон вашего числа меньше единицы.

Например, для типа unsigned:

ufi(x, 16, 16) - диапазон 0 <= x < 1
ufi(x, 16, 17) - диапазон 0 <= x < 0.5
ufi(x, 16, 18) - диапазон 0 <= x < 0.25
и т.д.
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 4 2014, 08:35
Сообщение #22


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



спасибо!


--------------------
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 5 2014, 07:28
Сообщение #23


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Еще вопрос - что то не получается у меня сделать конвеиеризацию дизайна. Я нашел в свойствах только HDL Block Properties и там есть Input pipeline и output pipeline, а также включение distributed pipelining. Но что-то не помогает. Подскажите, куда копать?


--------------------
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Sep 5 2014, 08:17
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Вроде, все так и делается. Включается опция "DistributedPipelining" и, скажем, в "InputPipeline" прописывается количество регистров конвейера.

На семинаре показывали пример, где Матлаб делал временной анализ через подключенный Xilinx ISE, находил наиболее критические пути, вставлял регистры, и прямо в окне Симулинка отображал время распространения сигнала на каждом отрезке.

Сообщение отредактировал SemperAnte - Sep 5 2014, 08:33
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 5 2014, 13:08
Сообщение #25


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



CODE
`timescale 1 ns / 1 ns

module Calc_X4
(
clk,
reset_n,
clk_enable,
In1,
ce_out,
Out1
);


input clk;
input reset_n;
input clk_enable;
input signed [15:0] In1; // sfix16_En10
output ce_out;
output signed [15:0] Out1; // sfix16_En10


wire enb;
reg signed [15:0] in_0_pipe_reg [0:2]; // sfix16 [3]
wire signed [15:0] in_0_pipe_reg_next [0:2]; // sfix16_En10 [3]
wire signed [15:0] In1_1; // sfix16_En10
wire signed [31:0] Gain4_mul_temp; // sfix32_En24
wire signed [15:0] Gain4_out1; // sfix16_En10
wire signed [15:0] Add6_out1; // sfix16_En10
wire signed [15:0] Saturation4_out1; // sfix16_En10
reg signed [15:0] Saturation4_out1_1; // sfix16_En10


assign enb = clk_enable;

always @(posedge clk)
begin : in_0_pipe_process
if (reset_n == 1'b0) begin
in_0_pipe_reg[0] <= 16'sb0000000000000000;
in_0_pipe_reg[1] <= 16'sb0000000000000000;
in_0_pipe_reg[2] <= 16'sb0000000000000000;
end
else if (enb) begin
in_0_pipe_reg[0] <= in_0_pipe_reg_next[0];
in_0_pipe_reg[1] <= in_0_pipe_reg_next[1];
in_0_pipe_reg[2] <= in_0_pipe_reg_next[2];
end
end

assign In1_1 = in_0_pipe_reg[2];
assign in_0_pipe_reg_next[0] = In1;
assign in_0_pipe_reg_next[1] = in_0_pipe_reg[0];
assign in_0_pipe_reg_next[2] = in_0_pipe_reg[1];



assign Gain4_mul_temp = 21105 * In1_1;
assign Gain4_out1 = Gain4_mul_temp[29:14];



assign Add6_out1 = 10222 - Gain4_out1;



assign Saturation4_out1 = (Add6_out1 > 16'sb0100110000000000 ? 16'sb0100110000000000 :
(Add6_out1 < 16'sb1011010000000000 ? 16'sb1011010000000000 :
Add6_out1));



always @(posedge clk)
begin : out_0_pipe_process
if (reset_n == 1'b0) begin
Saturation4_out1_1 <= 16'sb0000000000000000;
end
else if (enb) begin
Saturation4_out1_1 <= Saturation4_out1;
end
end



assign Out1 = Saturation4_out1_1;

assign ce_out = clk_enable;

endmodule // Calc_X4



что-то не то...


в модели delays блоков не ставил, поставил distributed pipelining в on, input pipieline - 3, output pipeline - 1


--------------------
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 8 2014, 03:29
Сообщение #26


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Ivan_33 @ Sep 5 2014, 20:08) *
CODE
`timescale 1 ns / 1 ns

module Calc_X4
(
clk,
reset_n,
clk_enable,
In1,
ce_out,
Out1
);


input clk;
input reset_n;
input clk_enable;
input signed [15:0] In1; // sfix16_En10
output ce_out;
output signed [15:0] Out1; // sfix16_En10


wire enb;
reg signed [15:0] in_0_pipe_reg [0:2]; // sfix16 [3]
wire signed [15:0] in_0_pipe_reg_next [0:2]; // sfix16_En10 [3]
wire signed [15:0] In1_1; // sfix16_En10
wire signed [31:0] Gain4_mul_temp; // sfix32_En24
wire signed [15:0] Gain4_out1; // sfix16_En10
wire signed [15:0] Add6_out1; // sfix16_En10
wire signed [15:0] Saturation4_out1; // sfix16_En10
reg signed [15:0] Saturation4_out1_1; // sfix16_En10


assign enb = clk_enable;

always @(posedge clk)
begin : in_0_pipe_process
if (reset_n == 1'b0) begin
in_0_pipe_reg[0] <= 16'sb0000000000000000;
in_0_pipe_reg[1] <= 16'sb0000000000000000;
in_0_pipe_reg[2] <= 16'sb0000000000000000;
end
else if (enb) begin
in_0_pipe_reg[0] <= in_0_pipe_reg_next[0];
in_0_pipe_reg[1] <= in_0_pipe_reg_next[1];
in_0_pipe_reg[2] <= in_0_pipe_reg_next[2];
end
end

assign In1_1 = in_0_pipe_reg[2];
assign in_0_pipe_reg_next[0] = In1;
assign in_0_pipe_reg_next[1] = in_0_pipe_reg[0];
assign in_0_pipe_reg_next[2] = in_0_pipe_reg[1];



assign Gain4_mul_temp = 21105 * In1_1;
assign Gain4_out1 = Gain4_mul_temp[29:14];



assign Add6_out1 = 10222 - Gain4_out1;



assign Saturation4_out1 = (Add6_out1 > 16'sb0100110000000000 ? 16'sb0100110000000000 :
(Add6_out1 < 16'sb1011010000000000 ? 16'sb1011010000000000 :
Add6_out1));



always @(posedge clk)
begin : out_0_pipe_process
if (reset_n == 1'b0) begin
Saturation4_out1_1 <= 16'sb0000000000000000;
end
else if (enb) begin
Saturation4_out1_1 <= Saturation4_out1;
end
end



assign Out1 = Saturation4_out1_1;

assign ce_out = clk_enable;

endmodule // Calc_X4



что-то не то...


в модели delays блоков не ставил, поставил distributed pipelining в on, input pipieline - 3, output pipeline - 1

по коду все верно. 3 на входе, 1 на выходе. что именно вам не нравится ?


--------------------
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 8 2014, 06:36
Сообщение #27


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Ну хотелось бы 1 регистр на входе, 1 после умножения, 1 на выходе у вычитания и 1 на выходе блока по насыщению. Как то это не по феншую, что 3 регистра конвейера просто на входе, какой смысл тогда делать конвейеризацию, если остальная часть дизайна утянет значение тактовой вниз. Или я что-то много требую от этого САПР? blush.gif


--------------------
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 8 2014, 06:46
Сообщение #28


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Ivan_33 @ Sep 8 2014, 13:36) *
Ну хотелось бы 1 регистр на входе, 1 после умножения, 1 на выходе у вычитания и 1 на выходе блока по насыщению. Как то это не по феншую, что 3 регистра конвейера просто на входе, какой смысл тогда делать конвейеризацию, если остальная часть дизайна утянет значение тактовой вниз. Или я что-то много требую от этого САПР? blush.gif

Ретайминг оставляют на совести средства синтеза. по феншую это руками или кодом sm.gif

ЗЫ. уберите saturation который по умолчанию у вас стоит. частотку валит достаточно сильно


--------------------
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Sep 8 2014, 06:51
Сообщение #29


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



Увы, saturation стоит осознанно. То что синтезом будут добавляться новые регистры - знал, но то, что это очень сильно исправит тайминги - нет. Буду иметь в виду, хотя по всей видимости придется все дописывать ручками.


--------------------
Go to the top of the page
 
+Quote Post
des00
сообщение Sep 8 2014, 07:14
Сообщение #30


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Ivan_33 @ Sep 8 2014, 13:51) *
Увы, saturation стоит осознанно. То что синтезом будут добавляться новые регистры - знал, но то, что это очень сильно исправит тайминги - нет. Буду иметь в виду, хотя по всей видимости придется все дописывать ручками.

поставьте saturation ручками через триггер тогда sm.gif
ретайминг это не добавление регистров, это разрешение синтезатору двигать уже имеющиеся регистры по сложной логике.


--------------------
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 20:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016