Ako detekovať prvý "1"

E

eexuke

Guest
Zdravím všetkých,
Keď budem mať postupnosť binárnych bitov ako "00001010111", ako môžem zistiť pozíciu prvého "1" na piatej pozícii zľava v priebehu realizácie hardvéru?
Jedna cesta je kontinuálne "alebo" susediace kúsky do "1" je tu.napr tam "0" | piatej "1" = 1, takže viem, prvý z nich je na pozícii päť.Avšak, já si nemyslím, že je efektívnym spôsobom.Môže mi niekto dať nejaké rady, ako riešiť takúto situáciu?

Many thanks in advance!

 
Myslím, že prioritné enkodér je veľmi jednoduchý digitálny obvod, ktorý môžete nájsť v akejkoľvek digitálnej logiky návrhu textu knihy.

Kód RTL obvode bude vyzerať.

If (vector [0] == 1'b1) z = 0;
else if (vector [1] == 1'b1) z = 1;
else if (vector [2] == 1'b1) z = 2;
else if (vector [3] == 1'b1) z = 3;
...
...
...
...

else out = 0;

/ / / Koniec vzorka kód

7 modul pri_encoder_using_if (
8 binary_out, / / 4 bitové binárne výstup
9 encoder_in, / / 16-bitové vstupné
10 zapnúť / / Zapne pre enkodér
11);
12 výstup [3:0] binary_out;
13 vstupov umožňujú;
14 vstup [15:0] encoder_in;
15
16 reg [3:0] binary_out;
17
18 @ vždy (zapnúť alebo encoder_in)
19 begin
20 binary_out = 0;
21 if (enable) begin
22 if (encoder_in == 16'h0002) begin
23 binary_out = 1;
24 end else if (encoder_in == 16'h0004) begin
25 binary_out = 2;
26 end else if (encoder_in == 16'h0008) begin
27 binary_out = 3;
28 end else if (encoder_in == 16'h0010) begin
29 binary_out = 4;
30 end else if (encoder_in == 16'h0020) begin
31 binary_out = 5;
32 end else if (encoder_in == 16'h0040) begin
33 binary_out = 6;
34 end else if (encoder_in == 16'h0080) begin
35 binary_out = 7;
36 end else if (encoder_in == 16'h0100) begin
37 binary_out = 8;
38 end else if (encoder_in == 16'h0200) begin
39 binary_out = 9;
40 end else if (encoder_in == 16'h0400) begin
41 binary_out = 10;
42 end else if (encoder_in == 16'h0800) begin
43 binary_out = 11;
44 end else if (encoder_in == 16'h1000) begin
45 binary_out = 12;
46 end else if (encoder_in == 16'h2000) begin
47 binary_out = 13;
48 end else if (encoder_in == 16'h4000) begin
49 binary_out = 14;
50 end else if (encoder_in == 16'h8000) begin
51 binary_out = 15;
52 konca
53 konca
54 konca
55
56 endmoduletiež pozrieť tu ..
http://toolbox.xilinx.com/docsan/3_1i/data/fise/xst/chap02/xst02010.htm

 
prioritné enkodér sa používa, ak máte sekvencie uložené v registri, ale jo, čo robiť, keď sa blíži sériovo, a neviete, dĺžka?
Myslím, že by mal počítať čeliť v nadchádzajúcich bitov a skontrolujte, či prvý 1.

 
Môžete použiť alebo Moore Mealyho automat.Bude to jednoduchšie.Štátu, v jednom štáte, až sa dostanete jeden, a ak chcete získať trochu polohu, v ktorej došlo k 1, môžete použiť pult.Akonáhle máte jednu môžete preskočiť na fázu spracovania.Nájdete tu veľa informácií o stave maching na webe, odporúčam vám ísť po nich.

 
Hi whizkid,
Ďakujem vám za informácie.Počas svoje vyhlásenie, dekódovanie tok je sekvenčná od najvyššieho bitu k najnižšiemu bitu.Dĺžka lehoty bude závisieť na dĺžke vstupných dát.Avšak, já som premýšľal, viac energie účinné, alebo vysoko výkonné spôsob, ako to dosiahnuť.Tiež nemám radšej použiť multi-cyklus na to.Má niekto ďalší nápad na to?

 
Ak chcete informácie o "stave" prvá 1, počítadlo je jediný spôsob, podľa mňa.Rád by som počuť akékoľvek iné metódy.

To navyše komplikuje, keď nepoznáte dĺžku prichádzajúce dáta, teda budete musieť zistiť 'čo je veľkosť counter' inde to bude pretekať a dostanete nesprávne miesto.

Taktiež budete potrebovať, aby ste sa uistili, že závada, alebo nejaký hluk nie je detekovaný ako 1, buď použiť dva FFS (jeden a jeden vo okraj-v), alebo vzorky prichádzajúce dáta rýchlejšie ako normálne hodiny, rovnako ako jej urobiť v UART.

HTH,
Beowulf

 
eexuke Napísal:

Dĺžka lehoty bude závisieť na dĺžke vstupných dát.
 
Myslím, že môžete použiť tento spôsob:

Upozorňujeme, teraz som pomocou VHDL,
tak tam môže byť syntaktická chyba v mojom Verilog kódy.

Modul tt (RST, CLK, in, out);
vstup;
vstup rst;
vstup;
Výstup z / / uviesť flag

reg out;

reg [4:0] in_buf;

Vždy @ (posedge CLK a negedge RST)
začať
if (rst == 0)
in_buf <= 5'b00000;
iné
in_buf <= (in_buf [3:0], v);
koniec

Vždy @ (posedge CLK a negedge RST)
začať
if (rst == 0)
z <= 0;
iné
začať
if (in_buf == "00001")
z <= 1'b1;
iné
z <= 1'b0;
koniec

endmodule

To si myslím, že nie je potrebné využívať štátnu zariadenia pre toto, musí sa zvážiť oveľa viac, a súčasne, použite rovnakej oblasti.Tu som si použite 5 DFFs, a jedna malá kombinácia logické, rovnako ako 3 A.

Dúfam pomôže.

S pozdravom,
Tony Tao

 
Nazdar

Použitie Melay Stroj je najlepšie pre detekciu sekvencie.

 
tony_taoyh,

Čo je využitie in_buf Shfit registrovať?
Čo o pozíciu prvého '1 'do potoka?

 
ahoj lidi

ak rýchlosť nie je obavy po tom, čo si myslím, že u previesť tieto dáta do sériovej podobe a po jednom kúsku porovnaní s 1 a aktivujte počítadlo zakaždým u previesť dáta do sériovej podobe a v čase zápasu pri porovnaní kontrola counter pozíciu.Ak chcete u jednoduchého programu Verilog napíšte mi, že som sa snažiť, že pre u

ashish

 

Welcome to EDABoard.com

Sponsor

Back
Top