Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сравнение чисел (больше/меньше)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Serega Doc
Как написать быстрое сравнение безннаковых чисел на больше меньше?
Anton_org
Вот простой вариант для 48 разрядных чиселок.

reg data0[47:0];
reg data1[47:0];
reg diff[48:0]
always @(posedge clk ....)
diff<={1'b0, data0}-{1'b0,data1};
assign sing=diff[48];
Serega Doc
Что синтезированная схема сравнения будет медленнее работать чем вычитатор?
Мне нужно так чтобы синтез в Quartus показал наибольшую скорость.
des00
Цитата(Serega Doc @ Apr 13 2005, 06:52)
Что синтезированная схема сравнения будет медленнее работать чем вычитатор?
Мне нужно так чтобы синтез в Quartus показал наибольшую скорость.
*


ХЗ как будет работать синтезированная схема сравнения,
но вот этот код занял в 4.2 циклон, отдельный модуль 49 ячеек на 275 метрах по квартусу (кстати Антон спасибо, я благодаря вам я выиграл пиво) cheers.gif
acex2
Цитата(Serega Doc @ Apr 13 2005, 05:54)
Как написать быстрое сравнение безннаковых чисел на больше меньше?
*


Самый быстрый (и ресурсоемкий) вариант - это на базе ROM (адрес - числа, данные - результат сравнения). Если числа большой разрядности - то делим их на части и результат сравнения каждой части выдаем еще на одну ROM.
Serega Doc
Не знаю как отдельно но в блоке простое сравнение работает быстрее чем вычитание
Synplify_8 -> Quartus 4.2 --- Cyclon -8
A и B 8bit
A-B - 156 MHz 100 LUt - думаю не самое оптимальное решение
A>B - 175 MHz 98 LUt

Надеюсь что у когото получится лучше организовать сравнение.
Yra
Если не жалко функциональных генераторов, делаем на комбинаторике
структура боевая, работает в живую:
/**************************************************************************
** Двухпороговый компаратор 6/5-битного аргумента с **
** порогом/инв.порогом результат: Solution=1 - превышен один из порогов, **
** nInverse='1' - прямой порог, nInverse='0' - инверсный порог **
**************************************************************************/
module Comparator
(input wire [5:0] InputArgument, InputThreshold,
input wire Mode63_n31,
output reg Solution, nInverse
);

always @(InputArgument, InputThreshold, Mode63_n31)
if ( {Mode63_n31 & InputArgument[5], InputArgument[4:0]} >= {Mode63_n31 & (~ InputThreshold[5]), ~ InputThreshold[4:0]} )
begin Solution = 1'b1; nInverse =1'b1; end
else
if ( {Mode63_n31 & InputArgument[5], InputArgument[4:0]} <= {Mode63_n31 & InputThreshold[5], InputThreshold[4:0]} )
begin Solution = 1'b1; nInverse =1'b0; end
else
begin Solution = 1'b0; nInverse =1'b0; end

endmodule
des00
Цитата(Serega Doc @ Apr 13 2005, 08:47)
Не знаю как отдельно но в блоке простое сравнение работает быстрее чем вычитание
Synplify_8 -> Quartus 4.2 --- Cyclon -8
A и B 8bit
A-B - 156 MHz 100 LUt - думаю не самое оптимальное решение
A>B - 175 MHz 98 LUt

Надеюсь что у когото получится лучше организовать сравнение.
*


хмм Антоном то приведен совершенно другой варант, ему не нужна вся разность, его интересует только знаковый бит !!!!
belena7
Ispolzui MegaFunction ona optimizirovana imenno dlya dannogo device
Serega Doc
2 belena7

Писал просто A>B скорость 175 MHz
Пользовал LPM получал 156 MHz

В чем загадка?

2 des00

А как вы получите знак не выполнив вычитания?
Или
diff<={1'b0, data0}-{1'b0,data1};
-это не 49 битные операнды?
des00
Цитата(Serega Doc @ Apr 14 2005, 07:24)
2 des00

А как вы получите знак не выполнив вычитания?
Или
diff<={1'b0, data0}-{1'b0,data1};
-это не 49 битные операнды?
*


Вот этот код

module proj
(
input sys_clk,
input [47:0] data0,
input [47:0] data1,
output sing
);

wire [47:0] data0, data1;
wire sing;

reg [48:0] d;

assign sing = d[48];

always @(posedge sys_clk)
begin
d <= {1'b0,data0} - {1'b0,data1};
end

endmodule

Вот отчеты синтезатора
+-----------------------------------------------------------------------+
; Fitter Summary ;
+-----------------------+-----------------------------------------------+
; Fitter Status ; Successful - Wed Apr 13 17:49:41 2005 ;
; Quartus II Version ; 4.2 Build 178 01/19/2005 SP 1 SJ Full Version ;
; Revision Name ; Bosik ;
; Top-level Entity Name ; Bosik ;
; Family ; Cyclone ;
; Device ; EP1C6F256C8 ;
; Timing Models ; Final ;
; Total logic elements ; 49 / 5,980 ( < 1 % ) ;
; Total pins ; 98 / 185 ( 52 % ) ;
; Total virtual pins ; 0 ;
; Total memory bits ; 0 / 92,160 ( 0 % ) ;
; Total PLLs ; 0 / 2 ( 0 % ) ;
+-----------------------+-----------------------------------------------+
+---------------------------------------------------------------------------------------------------------------------------------------------------+
; Timing Analyzer Summary ;
+------------------------------+-------+---------------+-------------+-------------------+-------------------+------------+----------+--------------+
; Type ; Slack ; Required Time ; Actual Time ; From ; To ; From Clock ; To Clock ; Failed Paths ;
+------------------------------+-------+---------------+-------------+-------------------+-------------------+------------+----------+--------------+
; Worst-case tsu ; N/A ; None ; 8.629 ns ; B[19] ; Compar:inst|d[48] ; ; Clock ; 0 ;
; Worst-case tco ; N/A ; None ; 8.353 ns ; Compar:inst|d[48] ; AGB ; Clock ; ; 0 ;
; Worst-case th ; N/A ; None ; -1.691 ns ; A[39] ; Compar:inst|d[48] ; ; Clock ; 0 ;
; Total number of failed paths ; ; ; ; ; ; ; ; 0 ;
+------------------------------+-------+---------------+-------------+-------------------+-------------------+------------+----------+--------------+

При запросе максимальной тактовой в 475 метров
квартус ругнулся
Clock Setup: 'Clock' N/A 475.06 MHz ( period = 2.105 ns ) Restricted to 275.03 MHz ( period = 3.636 ns ) Compar:inst|d[48] AGB Clock Cloc

вот еще оттуда

Info: Clock "Clock" Internal fmax is restricted to 275.03 MHz between source register "Compar:inst|d[48]" and destination register "AGB"
Info: fmax restricted to Clock High delay (1.818 ns) plus Clock Low delay (1.818 ns) : restricted to 3.636 ns. Expand message to see actual delay path.
Info: + Longest register to register delay is 1.049 ns
Info: 1: + IC(0.000 ns) + CELL(0.000 ns) = 0.000 ns; Loc. = LC_X33_Y14_N9; Fanout = 1; REG Node = 'Compar:inst|d[48]'
Info: 2: + IC(0.740 ns) + CELL(0.309 ns) = 1.049 ns; Loc. = LC_X32_Y14_N0; Fanout = 0; REG Node = 'AGB'
Info: Total cell delay = 0.309 ns ( 29.46 % )
Info: Total interconnect delay = 0.740 ns ( 70.54 % )
Info: - Smallest clock skew is 0.000 ns
Info: + Shortest clock path from clock "Clock" to destination register is 2.962 ns
Info: 1: + IC(0.000 ns) + CELL(1.469 ns) = 1.469 ns; Loc. = PIN_H1; Fanout = 2; CLK Node = 'Clock'
Info: 2: + IC(0.782 ns) + CELL(0.711 ns) = 2.962 ns; Loc. = LC_X32_Y14_N0; Fanout = 0; REG Node = 'AGB'
Info: Total cell delay = 2.180 ns ( 73.60 % )
Info: Total interconnect delay = 0.782 ns ( 26.40 % )
Info: - Longest clock path from clock "Clock" to source register is 2.962 ns
Info: 1: + IC(0.000 ns) + CELL(1.469 ns) = 1.469 ns; Loc. = PIN_H1; Fanout = 2; CLK Node = 'Clock'
Info: 2: + IC(0.782 ns) + CELL(0.711 ns) = 2.962 ns; Loc. = LC_X33_Y14_N9; Fanout = 1; REG Node = 'Compar:inst|d[48]'
Info: Total cell delay = 2.180 ns ( 73.60 % )
Info: Total interconnect delay = 0.782 ns ( 26.40 % )
Info: + Micro clock to output delay of source is 0.224 ns
Info: + Micro setup delay of destination is 0.037 ns
Serega Doc
На самом деле у меня кроме сравнеия еще и простейшие вычисления (сложение и вычитание) в зависимости от результатов сравнения.

Наилучшие результаты -8 Cyclon показал при использовании LPM блока сравнения, а суматоры синтезированные с помощью синтезатора. Все разогналось до 189 MHz. Больше выжать не удалось.
sad.gif

А по поводу простой схемы сравнения, то предельные 275 MHz легко получаются у любого LPM (и сравнение и вычитание)
des00
Цитата(Serega Doc @ Apr 22 2005, 02:36)
На самом деле у меня кроме сравнеия еще и простейшие вычисления (сложение и вычитание) в зависимости от результатов сравнения.

*

может я туплю но решение через тригерочек и на слуд суматор/вычитатель ??
правда задержка появиться, зато частотка увеличиться smile.gif)
Builder
Я вот открыл свой учебник времён универа, вот что есть по поводу сравнения чисел, может будет полезно:
Логические уравнения для сравнения чисел строятся исходя из следующих соображений. Если в старшем разряде слова А - единица, а В - ноль, то независимо от младших разрядов имеем A>B. Если равны - анализируются младшие разряды. Думаю идея понятна.
И кажись Альтера строит дерево компараторов именно этим способом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.