_Ivan_ 0 1 сентября, 2014 Опубликовано 1 сентября, 2014 · Жалоба Я раньше игрался с кордиком в матлабе и увидел реализацию тригонометрической функции в верилоге - да, это кордик. Круто же! Описание блоков нашел в справке матлаба. Вообщем, вопросы пока что кончились. Крутая штука этот hdl coder... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 1 сентября, 2014 Опубликовано 1 сентября, 2014 · Жалоба Команда hdllib внутри Матлаба открывает библиотеку поддерживаемых элементов для hdl кодера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба Все-таки остался висеть следующий вопрос: Вот я сделал модель, прогнал симуляцию, перевел все в fixed-point, прогнал симуляцию, сравнил результаты. Теперь я генерю hdl код. Он у меня делается как wire, без регистров. Если вставить туда блок delay z^-1 то выходной график сдвигается на 2 единицы времени относительно модель без блока delay и отбрасываются биты дробной части из-за чего график становится угловатым. HDL код вообще не генерится. Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба Блок Delay спокойно синтезируется и, в общем случае, не должен влиять на точность выхода. Если вам нужно поставить регистры по входу или выходу подсистемы, то это можно сделать в настройках "HDL Code" -> "HDL Block Properties". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 4 сентября, 2014 Опубликовано 4 сентября, 2014 · Жалоба а вот еще вопрос - у меня получилось так, что длина слова меньше, чем длина дробной части - это глюк или фича? может я что-то недопонимаю, или прога мне намекает, что надо увеличить ширину слова? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 4 сентября, 2014 Опубликовано 4 сентября, 2014 · Жалоба Просто динамический диапазон вашего числа меньше единицы. Например, для типа unsigned: ufi(x, 16, 16) - диапазон 0 <= x < 1 ufi(x, 16, 17) - диапазон 0 <= x < 0.5 ufi(x, 16, 18) - диапазон 0 <= x < 0.25 и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 4 сентября, 2014 Опубликовано 4 сентября, 2014 · Жалоба спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 5 сентября, 2014 Опубликовано 5 сентября, 2014 · Жалоба Еще вопрос - что то не получается у меня сделать конвеиеризацию дизайна. Я нашел в свойствах только HDL Block Properties и там есть Input pipeline и output pipeline, а также включение distributed pipelining. Но что-то не помогает. Подскажите, куда копать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 5 сентября, 2014 Опубликовано 5 сентября, 2014 (изменено) · Жалоба Вроде, все так и делается. Включается опция "DistributedPipelining" и, скажем, в "InputPipeline" прописывается количество регистров конвейера. На семинаре показывали пример, где Матлаб делал временной анализ через подключенный Xilinx ISE, находил наиболее критические пути, вставлял регистры, и прямо в окне Симулинка отображал время распространения сигнала на каждом отрезке. Изменено 5 сентября, 2014 пользователем SemperAnte Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 5 сентября, 2014 Опубликовано 5 сентября, 2014 · Жалоба `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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 сентября, 2014 Опубликовано 8 сентября, 2014 · Жалоба `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 на выходе. что именно вам не нравится ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 8 сентября, 2014 Опубликовано 8 сентября, 2014 · Жалоба Ну хотелось бы 1 регистр на входе, 1 после умножения, 1 на выходе у вычитания и 1 на выходе блока по насыщению. Как то это не по феншую, что 3 регистра конвейера просто на входе, какой смысл тогда делать конвейеризацию, если остальная часть дизайна утянет значение тактовой вниз. Или я что-то много требую от этого САПР? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 сентября, 2014 Опубликовано 8 сентября, 2014 · Жалоба Ну хотелось бы 1 регистр на входе, 1 после умножения, 1 на выходе у вычитания и 1 на выходе блока по насыщению. Как то это не по феншую, что 3 регистра конвейера просто на входе, какой смысл тогда делать конвейеризацию, если остальная часть дизайна утянет значение тактовой вниз. Или я что-то много требую от этого САПР? Ретайминг оставляют на совести средства синтеза. по феншую это руками или кодом :) ЗЫ. уберите saturation который по умолчанию у вас стоит. частотку валит достаточно сильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 8 сентября, 2014 Опубликовано 8 сентября, 2014 · Жалоба Увы, saturation стоит осознанно. То что синтезом будут добавляться новые регистры - знал, но то, что это очень сильно исправит тайминги - нет. Буду иметь в виду, хотя по всей видимости придется все дописывать ручками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 сентября, 2014 Опубликовано 8 сентября, 2014 · Жалоба Увы, saturation стоит осознанно. То что синтезом будут добавляться новые регистры - знал, но то, что это очень сильно исправит тайминги - нет. Буду иметь в виду, хотя по всей видимости придется все дописывать ручками. поставьте saturation ручками через триггер тогда :) ретайминг это не добавление регистров, это разрешение синтезатору двигать уже имеющиеся регистры по сложной логике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться