des00 25 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба и на синтезируемом Верилоге, 1 такт/разряд (32 разряда - 33 такта), ~150 ЛУТ: а мне так читать проще module div32 #(parameter int pW = 32 )( output logic [pW-1:0] qs, rs, input logic [pW-1:0] n, d, input logic clk, ena ); // synthesis bit [4 : 0] cnt; bit cnt_eq31; bit cnt_eq0; bit cnt_eq0_reg; int res; // result int p; // partial result bit decb; // decision bit int d_reg; // align reg assign cnt_eq31 = &cnt; assign cnt_eq0 = &(~cnt); always_ff @(posedge clk) begin if (~ena) cnt <= 31; else cnt <= cnt - 1'b1; if (cnt_eq31) {res[cnt], decb, p} <= div32_step(n[cnt], 1'b0, 32'd0); else {res[cnt], decb, p} <= div32_step(n[cnt], decb, p); // align delays cnt_eq0_reg <= cnt_eq0; d_reg <= d; // correct result if (cnt_eq0_reg) begin qs <= res; rs <= decb ? (p + d_reg) : p; end end function bit [33 : 0] div32_step(input bit divb, decb, input int p); bit r_decb; int r_p; begin {r_decb, r_p} = decb ? {p, divb} + d : {p, divb} - d; return {~r_decb, r_decb, r_p}; end endfunction endmodule 240/167, но это 32 такта на одно деление. если сделать 33 такта и изменить адресацию данных, тогда можно поджаться по ресурсу где то до вашего уровня %) UPD. ну вот, так оно и есть module div_seq_shift #(parameter int pW = 32 )( output logic [pW-1:0] q, r, output logic oval, input logic [pW-1:0] n, d, input logic clk, ival ); // synthesis indexing adressing mode bit [5 : 0] cnt; bit cnt_eq31; bit cnt_eq0; bit cnt_eq0_reg; int n_reg; // incoming data & result int d_reg; int res; // result int p; // partial result bit decb; // decision bit assign cnt_eq31 = &cnt[4:0]; assign cnt_eq0 = &(~cnt[4:0]); always_ff @(posedge clk) begin if (ival) begin cnt <= 31; n_reg <= n; d_reg <= d; end else if (~cnt[5]) begin cnt <= cnt - 1'b1; if (cnt_eq31) {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], 1'b0, 32'd0)}; else {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], decb, p)}; end // align delays cnt_eq0_reg <= cnt_eq0; // correct result oval <= cnt_eq0_reg; if (cnt_eq0_reg) begin q <= n_reg; r <= decb ? (p + d_reg) : p; end end function bit [33 : 0] div32_step(input bit divb, decb, input int p); bit r_decb; int r_p; begin {r_decb, r_p} = decb ? {p, divb} + d_reg : {p, divb} - d_reg; return {~r_decb, r_decb, r_p}; end endfunction endmodule 33 такта + 1 такт на коррекцию остатка. Reg/LC 214/169 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба И напоследок 32 такта + 1 такт на коррекцию остатка ....... always_ff @(posedge clk) begin if (ival) begin cnt <= 31; d_reg <= d; {n_reg, decb, p} <= {n[30:0], div32_step(n[31], 1'b0, 32'd0)}; end else if (~cnt[5]) begin cnt <= cnt - 1'b1; {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], decb, p)}; end // correct result oval <= cnt_eq0; if (cnt_eq0) begin q <= n_reg; r <= decb ? (p + d_reg) : p; end end 178/167 не могу сказать что написано сильно сложнее вашего, зато всё нутро алгоритма и плис как на ладони %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 13 апреля, 2010 Опубликовано 13 апреля, 2010 (изменено) · Жалоба Посмотрел внимательнее на свой код, первый цикл for - лишний в HDL, тк только для ускорения кода на процессоре, и его надо выкинуть. Си: int q, r, n, d; div32() { int i, r1, ge; for ( q = n, r = 0, i = 32; i > 0; i = i-1, r1 = r << 1 | q >> 31 & 1, ge = r1 >= d, r = ge ? r1-d : r1, q = q << 1 | ge ); } и Верилог: module div32( output reg [31:0] q, r, input [31:0] n, d, input clk ); reg [5:0] i; wire [31:0] r1 = r << 1 | q[31]; wire ge = r1 >= d; `always@(posedge clk) `begin `for ( q <= n; i <= 32; r <= 0; , i > 0, i <= i-1; r <= ge ? r1-d : r1; q <= q << 1 | ge; ) `end endmodule Когда алгоритм потребует FSM на большое число состояний, тогда смешанный стиль HDL+ЯП будет существенно нагляднее чистого HDL. Те к комбинаторной и регистровой логике нужно добавить "последовательную". Имхо. Увлекся, следующий этап у меня - множественные "последовательные" `always в одном модуле, задачки посложнее. Потом - перенос в свой препроцессор (`define временно - проще экспериментировать). Например, "for" у меня так описан: `define `for(s1,s2,s3) `s s1 `while(s2) `s s3 `endwhile поэтому и ограничения в синтаксисе. 178/167 не могу сказать что написано сильно сложнее вашего, зато всё нутро алгоритма и плис как на ладони %) Квартус дает ~120 ЛЕ (с одним `for). Не сказал бы, что "нутро алгоритма ... как на ладони" - и императивные ЯП, и HDL - являются обфускаторами нетривиальных алгоритмов, имхо. Изменено 13 апреля, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба Квартус дает ~120 ЛЕ (с одним `for). выложите итоговый верилог код, покрутить. спасибо. Не сказал бы, что "нутро алгоритма ... как на ладони" - и императивные ЯП, и HDL - являются обфускаторами нетривиальных алгоритмов, имхо. конечно кому как, но я не могу себе представить человека, который запутается в трех строчках {res[cnt], decb, p} <= (cnt_eq31) ? div32_step(n[cnt], 1'b0, 32'd0) : div32_step(n[cnt], decb, p); function bit [33 : 0] div32_step(input bit divb, decb, input int p); ...... {r_decb, r_p} = decb ? {p, divb} + d : {p, divb} - d; ..... и не сможет получить из них следующий код. int p [31:0]; // partial add/sub int res; // result int i; for (i = 31; i >= 0; i--) begin if (i == 31) {res[i], p[i]} = {32'd0, n[i]} - d; else {res[i], p[i]} = res[i + 1] ? {p[i+1], n[i]} + d : {p[i+1], n[i]} - d; end q = ~res; r = res[0] ? p[0] + d : p[0]; а смотря ваш задефайненый код там без бутылки точно не разберешься Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба выложите итоговый верилог код, покрутить. Sorry, там есть один момент, который не хочется раскрывать(иначе выложил бы сразу). Вечером для симуляции/синтеза попробую вывести/выложить нетлист (на уровне нетлиста еще не делал ничего, надо попробовать, пригодится). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба Не пойму, как получить нетлист для P&R и симуляции (ISE & Quartus), может, в Web-версиях нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба *.vqm в Квартусе - то, что надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба Добавил в модуль сигналы en, rdy, и регистр для делителя (без этого модуль непрактичен), число LE почему-то стало заметно превышать число LC: ~160 LE, ~130 LC comb, ~110 LC reg. module div32( output reg [31:0] q = 0, output reg [31:0] r = 0, output rdy, input [31:0] n, dd, input en, clk ); reg [5:0] i = 0; reg [31:0] d = 0; wire [31:0] r1 = r << 1 | q[31]; wire ge = r1 >= d; assign rdy = i == 0; `always@(posedge clk) `begin `while ( 1 ) `if ( en ) `for( q <= n; d <= dd; i <= 32; r <= 0; , i > 0, i <= i-1; r <= ge ? r1-d : r1; q <= q << 1 | ge; ) `els `s `endf `endw `end endmodule div32.vqm прилагается. n = dd * q + r div32.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 апреля, 2010 Опубликовано 14 апреля, 2010 · Жалоба Добавил в модуль сигналы en, rdy, и регистр для делителя (без этого модуль непрактичен), число LE почему-то стало заметно превышать число LC: ~160 LE, ~130 LC comb, ~110 LC reg. спасибо, гляну на досуге, разница в ресурсе наших вариантов обусловлена разным алгоритмом, у меня алгоритм с коррекцией остатка (разница на лишний сумматор), у вас алгоритм без коррекции. Чуть позже выложу чисто HDL ый вариант вашего алгоритма. Мне еще интересна частота обоих вариантов, мой последний, по отчетам квартуса дает ~204МГц. На первый взгляд в вашем алгоритме должен быть частотный затык в пути выхода вычитателя, который идет на enable триггера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 14 апреля, 2010 Опубликовано 14 апреля, 2010 · Жалоба :bb-offtopic: Как в ISE получить текстовый нетлист для P&R (аналогичный *.vqm в Квартусе) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 14 апреля, 2010 Опубликовано 14 апреля, 2010 · Жалоба Как в ISE получить текстовый нетлист для P&R (аналогичный *.vqm в Квартусе) ? Остановился на netgen + самопальный конвертор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 апреля, 2010 Опубликовано 15 апреля, 2010 · Жалоба На первый взгляд в вашем алгоритме должен быть частотный затык в пути выхода вычитателя, который идет на enable триггера. Ваш чисто HDL ый вариант за 32 такта module div32_others #(parameter int pW = 32 )( output logic [pW-1:0] q, r, input logic [pW-1:0] n, d, input logic clk, ival, output logic oval ); bit [5 : 0] cnt; bit cnt_eq31; bit cnt_eq0; int n_reg; int r_reg; int r_tmp; int sub; bit ge; int r_tmp31; int sub31; bit ge31; int res; assign cnt_eq0 = &(~cnt[4:0]); assign r_tmp = (r_reg << 1) | n_reg[31]; assign {ge, sub} = (r_tmp - d); assign r_tmp31 = {31'd0, n[31]}; assign {ge31, sub31} = r_tmp31 - d; always_ff @(posedge clk) begin if (ival) begin cnt <= 31; n_reg <= (n << 1); r_reg <= !ge31 ? sub31 : r_tmp31; res <= {31'd0, !ge31}; end else if (~cnt[5]) begin cnt <= cnt - 1'b1; n_reg <= (n_reg << 1); r_reg <= !ge ? sub : r_tmp; res <= (res << 1) | !ge; end // output result oval <= cnt_eq0; if (cnt_eq0) begin q <= res; r <= r_reg; end end endmodule если отбросить объявления сигналов, то алгоритм легко читается. LC/LR 178/166. По скорости на третьем сыклоне квартус меня поразил 196МГц, он смог быстро протащить сигнал переноса до всех 32 триггеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 15 апреля, 2010 Опубликовано 15 апреля, 2010 (изменено) · Жалоба В 1-ом такте фактически проверяется d==1, можно попробовать "вынести" этот тривиальный случай, чтобы уменьшить число ЛЕ или повысить частоту. Изменено 15 апреля, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 29 сентября, 2010 Опубликовано 29 сентября, 2010 · Жалоба конец RTL кодерам дспешникам? The new SimRF product lets system architects use Simulink to design and verify complete wireless communication systems with true-to-form RF subsystem models and advanced circuit-envelope and harmonic-balance methods. A major update to Simulink HDL Coder adds critical path analysis and area-speed optimizations for automatic HDL code generation, along with a new Workflow Advisor for FPGA implementations. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 29 сентября, 2010 Опубликовано 29 сентября, 2010 · Жалоба des00, да мы шутили уже на эту тему. 31 страницу нашутили. устарело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться