преброи 1's

C

cnivaz

Guest
Уважаеми екип,
Аз трябва да направя, проектиране, която ще преброи 1 в един 32 битов регистър.
Направих това, като използвате брояч, но взе, че 32 часа импулс за производството на резултата.

Без да се отнема 32 часа, как да направите това дизайн.

С уважение
Nivaz

 
можете да направите изявление случай ... с всички случаи на "1" и можете да имате
но тъй като се снабдете със 32 битов регистър ... че ще бъде наистина досаден ...

така че можете да ги има на части, като ... като всеки 4 бита
след добавянето на тези, които на всяка страна ...

за пр: имате един '1 'в 1, 2, 4 и 8 (ще ги събера в една декларация в случай)

 
Може да се помисли за всяко късче да бъде цяло число, и се изчислява тяхната сума:
тези = bit0 bit1 bit2 bit3 ...Bit31.

 
търсите таблица може да бъде опция, както и

 
Случай декларация или търсите маса е вън от въпроса!
2 ^ 32 = 4294967296.

Мисля, че най-добре можете да направите, е да смени и добави, но това ще отнеме> 32 цикъла.Added след 11 минути:Код:грозен Int ones32 (грозен Int х)

(

X -= ((х>> 1) & 0x55555555);

X = (((х>> 2) & 0x33333333) (X & 0x33333333));

X = (((х>> 4) X) & 0x0f0f0f0f);

X = (х>> 8);

X = (х>> 16);

връщане (X & 0x0000003f);

)

 
Ето един не-pipelined версия на сумиране моето предложение в Verilog.Той прави пълни изчисления в един часовник цикъл, и работи на около 100 MHz в малък XC3S200-4-FG256 Спартан-3 FPGA.Той използва куп малки adders, и заема около 1% от FPGA.Входните и регистри продукция не са необходими за изчисляване, но аз ги добавя да помогне на оценка на скоростта.
Код:

модул отгоре (CLK, в, такива);

вход CLK;

вход [31:0] В;

обл [31:0] г;

продукция обл [5:0] такива;Винаги @ (posedge CLK) започва

D <= в;

тези, <= (((г [0] г [1] г [2] г [3]) (г [4] г [5] г [6] г [7]))

((Г [8] г [9] г [10] г [11]) (г [12] г [13] г [14] г [15])))

(((Г [16] г [17] г [18] г [19]) (г [20] г [21] г [22] г [23]))

((Г [24] г [25] г [26] г [27]) (г [28] г [29] г [30] г [31 ])));

приключвам

endmodule
 
Ако Verilog език се използва метода, предвиден от echo47 е по-проста.

За да btbass, ако е на езика С се използва, там е друг начин за изчисляване на броя.

Код:

грозен Int ones32 (грозен Int бр)

(

връщане бр - (бр <<1) - (бр <<2) - (бр <<3) - (бр <<4)

- (Бр <<5) - (бр <<6) - (бр <<7) - (бр <<8)

- (Бр <<9) - (бр <<10) - (бр <<11) - (бр <<12)

- (Бр <<13) - (бр <<14) - (бр <<15) - (бр <<16)

- (Бр <<17) - (бр <<18) - (бр <<19) - (бр <<20)

- (Бр <<21) - (бр <<22) - (бр <<23) - (бр <<24)

- (Бр <<25) - (бр <<26) - (бр <<27) - (бр <<28)

- (Бр <<29) - (бр <<30) - (бр <<31);

)
 
не може да използваме за линия и след това, ако използвате изявление и нарастване на гишето за намиране 1?

 
В изпълнение не е добро, ако се използва електрическа верига.

 
Можете да използвате следните техника

Разделете на 32 бита, т.е.,
1.
Първо се първоначално 16 бита, да я сравни с 0,, ако е равно на нула, а след това U освен 15 CLK циклиАко не е равно отново го разделят на два байта, сравнете байта поотделно с нула, ако има такива байт е нула, можете отново освен почти шест CLK цикли.
Повторете го, докато дойде до едно малко ...

2.Вземете останалите 16 бита и повторете процедурата .........!!!!!!!!!

Това определено ще даде висока ефективност, когато имате големи номера.да се брои за 1S .....

Ishan
Електроника и телекомуникациите.ИнженерAdded след 4 минути:smileysam написа:

не може да използваме за линия и след това, ако използвате изявление и нарастване на гишето за намиране 1?
 
Бих предпочел да използва комбинаторни логика (аз просто го обичам) ...

Да се използва 2 входящи или порта, свържете един от въвеждане на ПИН GND, друга за малко един от 32 бита.ако това е "1" в THT малко, то ще изведе от 1 ...след като сте направили това с всички 32 бита, можете да използвате ехидна да добавите всичките 32 бита изход от и порти

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Усмивка" border="0" />Hehe ...Добре ли си? ..

SP

 
Може би имате нужда от FPGA, включва го използва хардуер, така че няма много като забавяне на хилядни.

 
А 8-битов адрес с 4-битов LUT ширина и 4 тръбопровод равнище ще бъде добре за вас.

Или 16-битов адрес с 5-битов LUT широчина и 2-ро ниво тръбопровод?

Надявам се това да помогне

 
Здравейте опитвам този

модул (брой, X);
вход [31:0] X;
продукция обл [4:0] брой;
Аз цяло число;
Винаги @ (X)
започвам
count_one (брой, X);
приключвам

Задачата count_one;
продукция [4:0] брой;
вход [31:0] X;
Аз цяло число;
започвам
Count = 5'b0;
за (I = 1; I <= 32; I = I 1)
ако (X == 1)
брой брой 1 = b1;
в противен случай
Count = броя;
приключвам
endtask
endmodule

 
Здравейте research_vlsi, Вашият пример ще понякога дават неверни резултати.
"броя" трябва да има шест бита, и "за" линия трябва да върви от 0 до 31.

 
те трябва да бъдат от 0 до 31, по линия на

 
Вземи брояч за interger.

брояч = REG (0) REG (2 ) ... REG (31);

тя може да даде решение.
Наслаждавайте се!

 
обикновен човек,
употреба и-XOR порти стълба.Всяка врата ще бъде 2 входа.U ще трябва 16and "и 16" XOR порти.Крайната продукция ще бъде граф не на 1S.
с уважение

 
anoop12, аз не виждам как да го изградим с толкова малко порти.Моля, покажете диаграма или код.

 

Welcome to EDABoard.com

Sponsor

Back
Top