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

fixed-point, matlab, fpga - помогите разобраться

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

Описание блоков нашел в справке матлаба. Вообщем, вопросы пока что кончились.

Крутая штука этот hdl coder...

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


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

Команда hdllib внутри Матлаба открывает библиотеку поддерживаемых элементов для hdl кодера.

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


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

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

 

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

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


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

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

 

Если вам нужно поставить регистры по входу или выходу подсистемы, то это можно сделать в настройках "HDL Code" -> "HDL Block Properties".

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


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

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

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


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

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

 

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

 

ufi(x, 16, 16) - диапазон 0 <= x < 1

ufi(x, 16, 17) - диапазон 0 <= x < 0.5

ufi(x, 16, 18) - диапазон 0 <= x < 0.25

и т.д.

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


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

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

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


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

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

 

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

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

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


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

`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

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


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

`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 на выходе. что именно вам не нравится ?

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


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

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

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


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

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

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

 

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

 

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


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

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

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


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

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

поставьте saturation ручками через триггер тогда :)

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

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


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

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

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

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

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

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

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

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

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

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