Jump to content

    

Чудеса технологии

Recommended Posts

SM

И вообще. Или я что-то не так сделал (не пинайте, generate лениво было делать), или квартус дурак. 16 LE, т.е. физически все реально:

module tsts (clk, in, out,zero,inv);
input clk, inv, zero;
input [15:0] in;
output [15:0] out;

wire [15:0] o;
wire [16:0] c;

carry_sum cs0 (.sin(in[0]         )  , .cin((!in[0])& inv),  .sout(o[0]), .cout(c[1]));
carry_sum cs1 (.sin(in[1]^inv^c[1])  , .cin((in[1]^inv) & c[1]), .sout(o[1]), .cout(c[2]));
carry_sum cs2 (.sin(in[2]^inv^c[2])  , .cin((in[2]^inv) & c[2]), .sout(o[2]), .cout(c[3]));
carry_sum cs3 (.sin(in[3]^inv^c[3])  , .cin((in[3]^inv) & c[3]), .sout(o[3]), .cout(c[4]));
carry_sum cs4 (.sin(in[4]^inv^c[4])  , .cin((in[4]^inv) & c[4]), .sout(o[4]), .cout(c[5]));
carry_sum cs5 (.sin(in[5]^inv^c[5])  , .cin((in[5]^inv) & c[5]), .sout(o[5]), .cout(c[6]));
carry_sum cs6 (.sin(in[6]^inv^c[6])  , .cin((in[6]^inv) & c[6]), .sout(o[6]), .cout(c[7]));
carry_sum cs7 (.sin(in[7]^inv^c[7])  , .cin((in[7]^inv) & c[7]), .sout(o[7]), .cout(c[8]));
carry_sum cs8 (.sin(in[8]^inv^c[8])  , .cin((in[8]^inv) & c[8]), .sout(o[8]), .cout(c[9]));
carry_sum cs9 (.sin(in[9]^inv^c[9])  , .cin((in[9]^inv) & c[9]), .sout(o[9]), .cout(c[10]));
carry_sum csa (.sin(in[10]^inv^c[10]), .cin((in[10]^inv)& c[10]),.sout(o[10]), .cout(c[11]));
carry_sum csb (.sin(in[11]^inv^c[11]), .cin((in[11]^inv)& c[11]),.sout(o[11]), .cout(c[12]));
carry_sum csc (.sin(in[12]^inv^c[12]), .cin((in[12]^inv)& c[12]),.sout(o[12]), .cout(c[13]));
carry_sum csd (.sin(in[13]^inv^c[13]), .cin((in[13]^inv)& c[13]),.sout(o[13]), .cout(c[14]));
carry_sum cse (.sin(in[14]^inv^c[14]), .cin((in[14]^inv)& c[14]),.sout(o[14]), .cout(c[15]));
carry_sum csf (.sin(in[15]^inv^c[15]), .cin((in[15]^inv)& c[15]),.sout(o[15]), .cout(c[16]));


DFFEAS r0 (.d(o[0]), .clk(clk), .sclr(zero), .q(out[0]));
DFFEAS r1 (.d(o[1]), .clk(clk), .sclr(zero), .q(out[1]));
DFFEAS r2 (.d(o[2]), .clk(clk), .sclr(zero), .q(out[2]));
DFFEAS r3 (.d(o[3]), .clk(clk), .sclr(zero), .q(out[3]));
DFFEAS r4 (.d(o[4]), .clk(clk), .sclr(zero), .q(out[4]));
DFFEAS r5 (.d(o[5]), .clk(clk), .sclr(zero), .q(out[5]));
DFFEAS r6 (.d(o[6]), .clk(clk), .sclr(zero), .q(out[6]));
DFFEAS r7 (.d(o[7]), .clk(clk), .sclr(zero), .q(out[7]));
DFFEAS r8 (.d(o[8]), .clk(clk), .sclr(zero), .q(out[8]));
DFFEAS r9 (.d(o[9]), .clk(clk), .sclr(zero), .q(out[9]));
DFFEAS ra (.d(o[10]), .clk(clk), .sclr(zero), .q(out[10]));
DFFEAS rb (.d(o[11]), .clk(clk), .sclr(zero), .q(out[11]));
DFFEAS rc (.d(o[12]), .clk(clk), .sclr(zero), .q(out[12]));
DFFEAS rd (.d(o[13]), .clk(clk), .sclr(zero), .q(out[13]));
DFFEAS re (.d(o[14]), .clk(clk), .sclr(zero), .q(out[14]));
DFFEAS rf (.d(o[15]), .clk(clk), .sclr(zero), .q(out[15]));

endmodule

 

Мда. ISE оказывается круче квартуса :)

Share this post


Link to post
Share on other sites

Shtirlits

Этот процесс где-то был назван "push a rope", если я правильно понял автора статьи.

Примерно как учитель детям 5 раз рассказал, сам уже понял, а дети...

Также и синтезаторы.

Share this post


Link to post
Share on other sites

des00
И вообще. Или я что-то не так сделал (не пинайте, generate лениво было делать), или квартус дурак. 16 LE, т.е. физически все реально:

 

ква 9.0сп1 сыклон 3, все по дефолту, ваш код LC_Comb/LC_Reg 23/16 %) мегапацанский код 32LC

ква9.1 результат тот же самый

 

ква 9.1 aria II вариант в лоб 16 LC, пацанский 19, мега пацанский 16ть

Share this post


Link to post
Share on other sites

SM
ква 9.0сп1 сыклон 3, все по дефолту, ваш код LC_Comb/LC_Reg 23/16 %)

Я синтезировал мегапацанский код (на carry_sum) под просто-циклон, который не 2 и не 3, ква 9.0. Результат хоть тресни, 16 LE.

А вот под другие:

ACEX1K - 32 LE.

MAX-II - 16 LE.

Cyclone - 16 LE.

Cyclone-II - 24 LE.

Cyclone-III - 24 LE.

Arria - 20 ALUT

 

Теперь вариант "в лоб":

 

ACEX1K - 33 LE.

MAX-II - 17 LE.

Cyclone - 17 LE.

Cyclone-II - 17 LE.

Cyclone-III - 17 LE.

Arria - 16 ALUT

 

Вывод 1 - самая эффективная архитектура c учетом особенностей квартуса у Cyclone / MAX-II, которая наравне с Arria для этого примера, и позволяет упихаться в 16 LUT-ов :)

 

Вывод 2 - для Cyclone-II/III квартус проигнорировал все 16 carry_sum-ов. Вопрос - ПОЧЕМУ? Архитектура явно позволяет по аналогии с Cyclone убраться в 16 LE. Гады, что еще сказать.

 

Вывод 2.1. Пора идти в техподдержку - какого хрена игнорят мои CARRY_SUM, когда они ничему не противоречат?!

Share this post


Link to post
Share on other sites

_LD
Вывод 2.1. Пора идти в техподдержку - какого хрена игнорят мои CARRY_SUM, когда они ничему не противоречат?!

 

Я там уже был, правда, достаточно давно :)

 

Тут

 

с тех пор, наверное, ничего и не поменялось...

Share this post


Link to post
Share on other sites

des00
Вывод 1 - самая эффективная архитектура c учетом особенностей квартуса у Cyclone / MAX-II, которая наравне с Arria для этого примера, и позволяет упихаться в 16 LUT-ов :)

 

Вывод 2 - для Cyclone-II/III квартус проигнорировал все 16 carry_sum-ов. Вопрос - ПОЧЕМУ? Архитектура явно позволяет по аналогии с Cyclone убраться в 16 LE. Гады, что еще сказать.

 

Вывод 2.1. Пора идти в техподдержку - какого хрена игнорят мои CARRY_SUM, когда они ничему не противоречат?!

 

нда, нет в жизни счастья %)

Share this post


Link to post
Share on other sites

SM
Я там уже был, правда, достаточно давно :)

Хм. Но тут немного другая цель. У Вас было "as fast as possible", а мы жмемся по area. И судя по даташиту упихаться физически фозможно.

Share this post


Link to post
Share on other sites

SM

Нас так просто не возьмешь. Вот - 16 LE в любом циклоне:

 

module tsts (clk, in, out,zero,inv);
input clk, inv, zero;
input [15:0] in;
output /*reg*/ [15:0] out;

wire [15:0] t;
wire invn = ~inv;
assign t = -in;

DFFEAS r0 (.d(t[0]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[0]), .q(out[0]));
DFFEAS r1 (.d(t[1]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[1]), .q(out[1]));
DFFEAS r2 (.d(t[2]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[2]), .q(out[2]));
DFFEAS r3 (.d(t[3]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[3]), .q(out[3]));
DFFEAS r4 (.d(t[4]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[4]), .q(out[4]));
DFFEAS r5 (.d(t[5]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[5]), .q(out[5]));
DFFEAS r6 (.d(t[6]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[6]), .q(out[6]));
DFFEAS r7 (.d(t[7]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[7]), .q(out[7]));
DFFEAS r8 (.d(t[8]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[8]), .q(out[8]));
DFFEAS r9 (.d(t[9]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[9]), .q(out[9]));
DFFEAS ra (.d(t[10]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[10]), .q(out[10]));
DFFEAS rb (.d(t[11]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[11]), .q(out[11]));
DFFEAS rc (.d(t[12]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[12]), .q(out[12]));
DFFEAS rd (.d(t[13]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[13]), .q(out[13]));
DFFEAS re (.d(t[14]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[14]), .q(out[14]));
DFFEAS rf (.d(t[15]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[15]), .q(out[15]));

endmodule

Share this post


Link to post
Share on other sites

Kuzmi4

2 SM

Не подскажете из каких умозаключений мы получили из

 odat <= ({pW{inv}} ^ (idat & {pW{~zero}})) + inv;

вот такое

wire [15:0] t;
wire invn = ~inv;
assign t = -in;

DFFEAS r0 (.d(t[0]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[0]), .q(out[0]));
DFFEAS r1 (.d(t[1]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[1]), .q(out[1]));
DFFEAS r2 (.d(t[2]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[2]), .q(out[2]));
DFFEAS r3 (.d(t[3]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[3]), .q(out[3]));
DFFEAS r4 (.d(t[4]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[4]), .q(out[4]));
DFFEAS r5 (.d(t[5]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[5]), .q(out[5]));
DFFEAS r6 (.d(t[6]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[6]), .q(out[6]));
DFFEAS r7 (.d(t[7]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[7]), .q(out[7]));
DFFEAS r8 (.d(t[8]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[8]), .q(out[8]));
DFFEAS r9 (.d(t[9]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[9]), .q(out[9]));
DFFEAS ra (.d(t[10]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[10]), .q(out[10]));
DFFEAS rb (.d(t[11]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[11]), .q(out[11]));
DFFEAS rc (.d(t[12]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[12]), .q(out[12]));
DFFEAS rd (.d(t[13]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[13]), .q(out[13]));
DFFEAS re (.d(t[14]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[14]), .q(out[14]));
DFFEAS rf (.d(t[15]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[15]), .q(out[15]));

Потому как я наверно выпал из струи :laughing:

Share this post


Link to post
Share on other sites

SM
2 SM

Не подскажете из каких умозаключений мы получили из

Из соображения эквивалентности логической функции. Только я забил на параметризованность.

Share this post


Link to post
Share on other sites

des00
Нас так просто не возьмешь. Вот - 16 LE в любом циклоне:

 

респект и уважуха %) как то совсем забыл я про волшебный sload %)

 

 

Не подскажете из каких умозаключений мы получили из

вот такое

 

хоть и не SM отвечу, все просто : люты реализуют арифметическую инверсию, а sload + asdata это мультиплексор стоящий за лютом и перед триггером %)

Share this post


Link to post
Share on other sites

Kuzmi4

2 des00 - так лутов то нет, есть "волшебные" тригера :wassat:

module tsts (clk, in, out,zero,inv);
input clk, inv, zero;
input [15:0] in;
output /*reg*/ [15:0] out;

wire [15:0] t;
wire invn = ~inv;
assign t = -in;

DFFEAS r0 (.d(t[0]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[0]), .q(out[0]));
DFFEAS r1 (.d(t[1]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[1]), .q(out[1]));
DFFEAS r2 (.d(t[2]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[2]), .q(out[2]));
DFFEAS r3 (.d(t[3]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[3]), .q(out[3]));
DFFEAS r4 (.d(t[4]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[4]), .q(out[4]));
DFFEAS r5 (.d(t[5]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[5]), .q(out[5]));
DFFEAS r6 (.d(t[6]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[6]), .q(out[6]));
DFFEAS r7 (.d(t[7]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[7]), .q(out[7]));
DFFEAS r8 (.d(t[8]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[8]), .q(out[8]));
DFFEAS r9 (.d(t[9]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[9]), .q(out[9]));
DFFEAS ra (.d(t[10]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[10]), .q(out[10]));
DFFEAS rb (.d(t[11]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[11]), .q(out[11]));
DFFEAS rc (.d(t[12]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[12]), .q(out[12]));
DFFEAS rd (.d(t[13]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[13]), .q(out[13]));
DFFEAS re (.d(t[14]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[14]), .q(out[14]));
DFFEAS rf (.d(t[15]), .clk(clk), .sclr(zero), .sload(invn), .asdata(in[15]), .q(out[15]));

endmodule

С лутами есчё вроде как через раскладку ручками вроде понятно было, а с тригерами :07: видимо нужно вспоминать дедовские методы...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.