gotcha 0 9 октября, 2014 Опубликовано 9 октября, 2014 · Жалоба Без анализа результатов синтеза никак. Смотреть критический путь и применять техники которые вы перечислили. В этом может помочь schematic view. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба Исправил умножитель который действует на 32-х битных операндах, получилось 54 МГц. Дальше сделал в столбик умножение с применением 2-х ячеек dsp48 - 1 модуль - получилась скорость около 190 МГц, но пока что додумался только для unsigned операндов. Как делать со знаковыми - пока в голову приходит только перевод в обычное представление, мухлеж со знаками и перевод обратно по знаку. Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба STA не пользовался никогда, ибо все решалось с первого раза, либо примерно прикидывал, где что нужно изменить, чтоб частота была лучше. Незнание закона не освобождает от ответственности.... Но похоже в элементарных дизайнах (с точки зрения STA) и парится ненадо - достаточно дефолтных устиановок (для одноклокового чистосинхронного дизайна). А с другой стороны прям чешется спросить - а для каких условий эксплуатации вы свою ПЛИС слепили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере. есть. на верилоге умножение описывается так A<= $signed(B) * $signed©. Пихаете в синтезатор типа ISE и о чудо все получилось само%). Чуть более правильно найти нормальную схему умножителя (описание данной схемы) и запихать это все инстансом. Умножителей очень много и 1 тактовые и многотактовые, и тд и тп Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gotcha 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба Какой чип? Какой тулчейн используете? Какую частоту надо получить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба Вы молодец. Движетесь в нужном направлении. Как скомбинировать 2 маленьких знаковых умножителя в один большой знаковый можно посмортреть здесь на стр. 6. Исправил умножитель который действует на 32-х битных операндах, получилось 54 МГц. Дальше сделал в столбик умножение с применением 2-х ячеек dsp48 - 1 модуль - получилась скорость около 190 МГц, но пока что додумался только для unsigned операндов. Как делать со знаковыми - пока в голову приходит только перевод в обычное представление, мухлеж со знаками и перевод обратно по знаку. Есть еще какие нибудь способы? Использовать ядра xilinx нельзя, код будет работать и на альтере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 10 октября, 2014 Опубликовано 10 октября, 2014 · Жалоба А с другой стороны прям чешется спросить - а для каких условий эксплуатации вы свою ПЛИС слепили? Для злых. Оно будет летать... Я понимаю бреши в своих знаниях, думаю еще месяцок буду писать hdl код, потом все отлаживать и параллельно с этим разбираться как правильно делать крайнюю стадию проекта. Чуть более правильно найти нормальную схему умножителя (описание данной схемы) и запихать это все инстансом. Умножителей очень много и 1 тактовые и многотактовые, и тд и тп Я быстренько просмотрел книжку про реализацию арифметических схем в ПЛИС, реально много, да... но DSP ячеек мне будет достаточно. Вот задача была сделать на них Какой чип? Какой тулчейн используете? Какую частоту надо получить? Чип спартан 6 и циклон 4, использую ISE, частоту... ну как бы сказать... меня бы эти 47 МГц в принципе устроили, сделал бы тактовую модуля мегагерц 30 и в ус бы не дул, но хочется больше ста чисто чтоб разобраться что да как. Fat Robot, огромное спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 11 октября, 2014 Опубликовано 11 октября, 2014 · Жалоба но DSP ячеек мне будет достаточно. Вот задача была сделать на них Использовать ядра xilinx нельзя, код будет работать и на альтере. иногда вас сложно понять:) то есть речь шла об IP ядрах что ли, их нельзя, а дсп модули можно? В целом задача то для 5 класса. AB*CD = (A*10 + B ) * (C*10 + D) = A*10*C*10 + B*C*10 + A*10*D + B * D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 13 октября, 2014 Опубликовано 13 октября, 2014 · Жалоба Сделал. Получилось почти 169 мегагерц. Мне достаточно. Убил 3 часа на поиск простой ошибки, ручками на листочке умножал 1 и -1, а потом сравнивал. В итоге все подтверждается, что самые сложные ошибки в поиске - самые глупые. module test_mult_module( input clk, input reset_n, input mult_en, input signed [34:0] A, input signed [34:0] B, output reg signed [69:0] result, output reg result_valid ); localparam idle = 2'b00, state0 = 2'b01, state1 = 2'b10, state2 = 2'b11; reg signed [34:0] A_reg; reg signed [34:0] B_reg; reg [1:0] state_reg; reg signed [17:0] mult0_reg; reg signed [17:0] mult1_reg; reg signed [35:0] mult32_res0_reg; reg signed [17:0] mult2_reg; reg signed [17:0] mult3_reg; reg signed [35:0] mult32_res1_reg; wire signed [35:0] sum_wire; assign sum_wire = mult32_res1_reg + mult32_res0_reg; always@(posedge clk) begin if(reset_n == 1'b0) begin mult32_res0_reg <= 36'sb0; end else begin mult32_res0_reg <= mult0_reg * mult1_reg; end end always@(posedge clk) begin if(reset_n == 1'b0) begin mult32_res1_reg <= 36'sb0; end else begin mult32_res1_reg <= mult2_reg * mult3_reg; end end always@(posedge clk) begin if(reset_n == 1'b0) begin result <= 70'sb0; result_valid <= 1'b0; end else begin case(state_reg) idle: begin result_valid <= 1'b0; if(mult_en) begin result <= 70'sb0; A_reg <= A; B_reg <= B; mult0_reg <= A[34:17]; //18 bit signed mult1_reg <= B[34:17]; //18 bit signed mult2_reg <= {1'b0, A[16:0]}; //15 bit unsigned mult3_reg <= {1'b0, B[16:0]}; //15 bit unsigned state_reg <= state0; end end state0: begin mult1_reg <= {1'b0, B_reg[16:0]}; mult3_reg <= B_reg[34:17]; state_reg <= state1; end state1: begin result[69:34] <= mult32_res0_reg[35:0]; result[33:0] <= mult32_res1_reg[33:0]; state_reg <= state2; end state2: begin result <= result + {{17{sum_wire[34]}},sum_wire,17'b0}; result_valid <= 1'b1; state_reg <= idle; end default: begin state_reg <= idle; result_valid <= 1'b0; end endcase end end endmodule Еще раз огромное спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться