Перейти к содержанию
    

Сравнение чисел (больше/меньше)

Как написать быстрое сравнение безннаковых чисел на больше меньше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот простой вариант для 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];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что синтезированная схема сравнения будет медленнее работать чем вычитатор?

Мне нужно так чтобы синтез в Quartus показал наибольшую скорость.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что синтезированная схема сравнения будет медленнее работать чем вычитатор?

Мне нужно так чтобы синтез в Quartus показал наибольшую скорость.

 

ХЗ как будет работать синтезированная схема сравнения,

но вот этот код занял в 4.2 циклон, отдельный модуль 49 ячеек на 275 метрах по квартусу (кстати Антон спасибо, я благодаря вам я выиграл пиво) :cheers:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как написать быстрое сравнение безннаковых чисел на больше меньше?

 

Самый быстрый (и ресурсоемкий) вариант - это на базе ROM (адрес - числа, данные - результат сравнения). Если числа большой разрядности - то делим их на части и результат сравнения каждой части выдаем еще на одну ROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю как отдельно но в блоке простое сравнение работает быстрее чем вычитание

Synplify_8 -> Quartus 4.2 --- Cyclon -8

A и B 8bit

A-B - 156 MHz 100 LUt - думаю не самое оптимальное решение

A>B - 175 MHz 98 LUt

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не жалко функциональных генераторов, делаем на комбинаторике

структура боевая, работает в живую:

/**************************************************************************

** Двухпороговый компаратор 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю как отдельно но в блоке простое сравнение работает быстрее чем вычитание

Synplify_8 -> Quartus 4.2 --- Cyclon -8

A и B 8bit

A-B - 156 MHz 100 LUt - думаю не самое оптимальное решение

A>B - 175 MHz 98 LUt

 

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

 

хмм Антоном то приведен совершенно другой варант, ему не нужна вся разность, его интересует только знаковый бит !!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 belena7

 

Писал просто A>B скорость 175 MHz

Пользовал LPM получал 156 MHz

 

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

 

2 des00

 

А как вы получите знак не выполнив вычитания?

Или

diff<={1'b0, data0}-{1'b0,data1};

-это не 49 битные операнды?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле у меня кроме сравнеия еще и простейшие вычисления (сложение и вычитание) в зависимости от результатов сравнения.

 

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

:(

 

А по поводу простой схемы сравнения, то предельные 275 MHz легко получаются у любого LPM (и сравнение и вычитание)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле у меня кроме сравнеия еще и простейшие вычисления (сложение и вычитание) в зависимости от результатов сравнения.

 

может я туплю но решение через тригерочек и на слуд суматор/вычитатель ??

правда задержка появиться, зато частотка увеличиться :))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Логические уравнения для сравнения чисел строятся исходя из следующих соображений. Если в старшем разряде слова А - единица, а В - ноль, то независимо от младших разрядов имеем A>B. Если равны - анализируются младшие разряды. Думаю идея понятна.

И кажись Альтера строит дерево компараторов именно этим способом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...