essev 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 (изменено) · Жалоба Всем привет. Нарисовал схему для альтера epm1270. Развожу в квартусе.... у меня 8-битная входная шина данных (data_in). с этой 8-битной шины данные идут на 24-битный сумматор, работающий за 1 такт. сумматор суммируется сам с собой (аля sum = sum + data_in). логикой работы сумматора управляет "синхронная логика" - т.е. глубоких комбинационных схем нет частота нужна 150 МГц. Если ставлю регистр по входу (data_in), то частота начинает занижаться на 20 МГц - квартус дает 130 МГц, убираю 150 МГц. При занижении ругается на критичный путь от входного регистра до выхода сумматора... сделал сумматор 2-х тактным, а также убрал логику разрешения работы сумматора (всегда разрешен) - ситуация вообще не улучшилась Подскажите, в чем беда? может буз входного регистра можно обойтись? спасибо Изменено 11 ноября, 2010 пользователем essev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 · Жалоба И какие у Вас tsu/th без этого регистра на входе получаются? :) Почитайте вот здесь: http://electronix.ru/forum/index.php?showt...=73715&st=0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 · Жалоба tsu = 7.764 ns tco = 9.01 ns th = -1.269 ns Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба Подскажите, в чем беда? может буз входного регистра можно обойтись? что не понятного то ? нет регистра и входных констрейнов путь от data_in не анализируется. Есть регистр, есть анализ. 24 бита сумматор за такт на 150МГц на втором максе (телепатирую, еще и на самом медленном) это фантастика %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 (изменено) · Жалоба уменьшил разрядность сумматора до 16-ти частота со 130 до 140 поднялась. не понимаю почему если я делаю сумматор 2-тактным (мегафунция LPM_add_sub_unsigned), то частота становится 143 МГц. Изменено 12 ноября, 2010 пользователем essev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба не понимаю почему если я делаю сумматор 2-тактным (мегафунция LPM_add_sub_unsigned), то частота становится 143 МГц. телепаты все еще в отпуске, проект в студию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба module sum( input clk, input rstn, input [ 7:0] din, input dvin, output [23:0] dout ); reg [ 8:0] lsb; reg [15:0] msb; reg [ 7:0] lsb_d; always @(posedge clk or negedge rstn) if(!rstn) begin lsb<=0; lsb_d<=0; msb<=0; end else begin if(dvin) lsb<={1'b0,lsb[7:0]}+{1'b0,din}; if(lsb[8]) msb<=msb+1; lsb_d<=lsb[7:0]; end assign dout={msb,lsb_d}; endmodule Это для беззнакового сложения. Если надо со знаком - додумайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба не понимаю почему если я делаю сумматор 2-тактным (мегафунция LPM_add_sub_unsigned), то частота становится 143 МГц. Конвейер подключили. Вам ведь дали ссылку на пост, в котором рассмотрено все это. За счет ресурсов можно сделать что угодно. (разбить по разрядности, или четные, нечетные отсчеты, в конвейере). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба так, что мегафункция может медленно работать? нужно свое писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба Уважаемый, я двумя постами выше вам уже все написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба сделал по коду Sergey'F. Квартус 6.0 результат практически не изменился. DmitryR, у Вас вроде сходный результат синтез даст? а будет ли работать схема если она не дотягивает по частоте 10 МГц ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба DmitryR, у Вас вроде сходный результат синтез даст? Об этом легко узнать, проведя этот синтез. Мало того, что я в хорошем расположении духа написал вам идею кода, так вы хотите чтобы я его еще сам отсинтезил и добился времянки. Я конечно это могу, но это в раздел "предлагаю работу" тогда уже. а будет ли работать схема если она не дотягивает по частоте 10 МГц ? Может быть по-всякому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба DmitryR, у Вас вроде сходный результат синтез даст? а будет ли работать схема если она не дотягивает по частоте 10 МГц ? Вы din через регистр пропустите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
essev 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба DmitryR, вы уж не обессудьте меня - долбаюсь с этой частотой уже 2 дня - и все никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба с этой частотой Можно поиграть разрядностями сумматора и счетчика module pipelined_accumulator //XAPP 039.001 ( input clk, input rst, input [7:0] data, output [23:0] result ); reg [7:0] sync_reg = 8'd0; reg [11:0] accum_l = 12'd0; reg reg_crry = 1'b0; reg [11:0] accum_h = 12'd0; reg [11:0] regl_out = 12'd0; wire [12:0] alu_l = {1'b0, accum_l} + {{5'd0, sync_reg}}; always @ (posedge clk or posedge rst) begin if (rst) begin sync_reg <= 8'd0; accum_l <= 12'd0; reg_crry <= 1'b0; accum_h <= 12'd0; regl_out <= 12'd0; end else begin sync_reg <= data; accum_l <= alu_l[11:0]; reg_crry <= alu_l[12]; if(reg_crry) accum_h <= accum_h + 1'b1; regl_out <= accum_l; end end assign result = {accum_h, regl_out}; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться