Как да се открие първата "1"

E

eexuke

Guest
Здравейте всички,
Ако имам поредица от двоични битове като "00001010111", как мога да открие позиция на първия "1" в пета позиция от ляво по време на хардуер изпълнение?
Един от начините е постоянен "или" прилежащите бита, докато "1" е имам.например изложени "0" | пети "1" = 1, за да знам, първата е на позиция пет.Въпреки това, аз не мисля, че е ефикасен начин.Някой може ли да ми дадете някои съвети за това как да се справят с такава ситуация?

Много благодаря предварително!

 
Какво ще кажете за една верига приоритет енкодер?

 
whizkid написа:

Какво ще кажете за една верига приоритет енкодер?
 
Мисля, че приоритет енкодер е много основната цифрова схема, която можете да намерите във всеки цифров книга логика дизайн текст.

Кодът RTL на веригата ще изглежда така.

Ако (вектор [0] == 1'b1) извън = 0;
иначе, ако (вектор [1] == 1'b1) извън = 1;
иначе, ако (вектор [2] == 1'b1) извън = 2;
иначе, ако (вектор [3] == 1'b1) извън = 3;
...
...
...
...

иначе се = 0;

/ / / Пълен примерен код по-долу

7 модул pri_encoder_using_if (
8 binary_out, / / 4 битови двоични продукция
9 encoder_in, / / 16-битов вход
10 включите / / Давам възможност за възхвала
11);
12 продукция [3:0] binary_out;
13 принос даде възможност;
14 принос [15:0] encoder_in;
15
16 обл [3:0] binary_out;
17
18 винаги @ (разрешите или encoder_in)
19 започне
20 binary_out = 0;
21, ако (позволи) започва
22, ако (encoder_in == 16'h0002) започва
23 binary_out = 1;
24 края иначе, ако (encoder_in == 16'h0004) започва
25 binary_out = 2;
26 края иначе, ако (encoder_in == 16'h0008) започва
27 binary_out = 3;
28 края иначе, ако (encoder_in == 16'h0010) започва
29 binary_out = 4;
30 края иначе, ако (encoder_in == 16'h0020) започва
31 binary_out = 5;
32 края иначе, ако (encoder_in == 16'h0040) започва
33 binary_out = 6;
34 края иначе, ако (encoder_in == 16'h0080) започва
35 binary_out = 7;
36 края иначе, ако (encoder_in == 16'h0100) започва
37 binary_out = 8;
38 края иначе, ако (encoder_in == 16'h0200) започва
39 binary_out = 9;
40 края иначе, ако (encoder_in == 16'h0400) започва
41 binary_out = 10;
42 края иначе, ако (encoder_in == 16'h0800) започва
43 binary_out = 11;
44 края иначе, ако (encoder_in == 16'h1000) започва
45 binary_out = 12;
46 края иначе, ако (encoder_in == 16'h2000) започва
47 binary_out = 13;
48 края иначе, ако (encoder_in == 16'h4000) започва
49 binary_out = 14;
50 края иначе, ако (encoder_in == 16'h8000) започва
51 binary_out = 15;
52 края
53 края
54 края
55
56 endmoduleсъщо така гледам тук ..
http://toolbox.xilinx.com/docsan/3_1i/data/fise/xst/chap02/xst02010.htm

 
приоритет енкодер се използва, когато имате последователност се съхранява в регистър, но какво да направя, когато Йо Той идва серийно и не знаете на дължина?
Мисля, че трябва да се смята брояч следващите битове и се проверява за първите 1.

 
Можете да използвате като брашно или Мур държавната машина.Тя ще бъде по-опростена.В една държава-членка, докато не получите един и ако искате да получите малко позиция, в който 1 настъпили можете да използвате брояч.Веднага след като се появят един може да скочи до етап на преработка.Тук ще намерите много информация за състоянието на уеб maching Предлагам ви да мине през тях.

 
Здравейте whizkid,
Благодарим ви за вашата информация.По време на Вашия отчет, декодиране поток е последователно от най-малко до най-малко.Забавянето ще зависи от входните данни дължина.Въпреки това, аз се чудех по-ефективна мощност или висока ефективност начин да направите това.Също така, аз не предпочитат да използват няколко цикъла на него.Дали някой има повече представа за това?

 
Ако искате информация относно "позицията" на първата 1, брояч е единственият начин, според мен.Бих искал да чуе за друг метод.

Това стана сложно, когато не знаеш дължината на постъпващите данни, т.е. трябва да се определи какво е в размер на контра "иначе ще нахлуе и ще получите неправилно положение.

Също така, ще трябва да се уверите, че бъг или някакъв шум не е открит като 1, или да използват две FFS (един си край и един-VE) или пробата на входящите данни и по-бързо от нормалните часовник, като си направи в UARTs.

HTH,
Беоулф

 
eexuke написа:

Забавянето ще зависи от входните данни дължина.
 
Мисля, че можете да използвате този метод:

Имайте предвид, сега аз съм с VHDL,
така че може да има синтаксис грешка в моя Verilog кодове.

модул TT (RST, CLK, в, изход);
въвеждане в;
вход RST;
въвеждане в;
продукцията се / / показват знамето на

обл Out;

обл [4:0] in_buf;

Винаги @ (posedge CLK и RST negedge)
започвам
IF (RST == 0)
in_buf <= 5'b00000;
в противен случай
in_buf <= (in_buf [3:0], в);
приключвам

Винаги @ (posedge CLK и RST negedge)
започвам
IF (RST == 0)
посочени <= 0;
в противен случай
започвам
IF (in_buf == "00001")
посочени <= 1'b1;
в противен случай
посочени <= 1'b0;
приключвам

endmodule

Това мисля, че е необходимо да се използва държавна машина за това, трябва да помисли за много повече, и в същото време, използвайте същия район.Ето, аз просто използвайте 5 DFFs, и една малка комбинация логично, като 3 и.

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

С най-добри пожелания,
Тони Тао

 
Здрасти

Използването на Melay машина е най-доброто за пореден откриване.

 
tony_taoyh,

Какво е използването на in_buf shfit се регистрирам?
Какво ще кажеш за позицията на първата "1" в поток?

 
Здравейте хора

ако скоростта не е загрижеността, след това което си мисля е, че ф конвертирате тези данни в сериен вид и едно по едно сравнение на малко с 1 и активирате брояч всеки ф време преобразуване на данните в сериен вид и по време на мач, докато сравнение проверка контра позиция.ако искаш простите Verilog програма просто ме изпрати по пощата аз ще се опитам, че за ф

Ashish

 

Welcome to EDABoard.com

Sponsor

Back
Top