Hvordan man opdage første "1"

E

eexuke

Guest
Hej alle,
Hvis jeg har en sekvens af binære bits såsom "00001010111", hvordan kan jeg afsløre placeringen af de første "1" i femte position fra venstre under hardware gennemførelse?
En måde er konstant "eller" den tilstødende bits, indtil "1" er kommet.f.eks frem "0" | femte "1" = 1, så jeg ved, den første er på position fem.Men, jeg tror ikke, at der er en effektiv måde.Kan nogen give mig nogle råd om, hvordan man håndtere en sådan situation?

Mange tak på forhånd!

 
whizkid skrev:

Hvad med en prioriteret enkoder kredsløbet?
 
Jeg tror prioritet encoder er en meget grundlæggende digitale kredsløb, som du kan finde i ethvert digitalt logik design lærebogen.

RTL-kode af kredsløbet vil se ud.

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

else out = 0;

/ / / Fuld prøve koden nedenfor

7 modul pri_encoder_using_if (
8 binary_out, / / 4 bit binær udgang
9 encoder_in, / / 16-bit input
10 aktivere / / Aktiver for encoder
11);
12 output [3:0] binary_out;
13 input muligt;
14 input [15:0] encoder_in;
15
16 reg [3:0] binary_out;
17
18 altid @ (aktivere eller encoder_in)
19 begynder
20 binary_out = 0;
21 if (enable) begynder
22 if (encoder_in == 16'h0002) begynder
23 binary_out = 1;
24 end else if (encoder_in == 16'h0004) begynder
25 binary_out = 2;
26 end else if (encoder_in == 16'h0008) begynder
27 binary_out = 3;
28 end else if (encoder_in == 16'h0010) begynder
29 binary_out = 4;
30 end else if (encoder_in == 16'h0020) begynder
31 binary_out = 5;
32 end else if (encoder_in == 16'h0040) begynder
33 binary_out = 6;
34 end else if (encoder_in == 16'h0080) begynder
35 binary_out = 7;
36 end else if (encoder_in == 16'h0100) begynder
37 binary_out = 8;
38 end else if (encoder_in == 16'h0200) begynder
39 binary_out = 9;
40 end else if (encoder_in == 16'h0400) begynder
41 binary_out = 10;
42 end else if (encoder_in == 16'h0800) begynder
43 binary_out = 11;
44 end else if (encoder_in == 16'h1000) begynder
45 binary_out = 12;
46 end else if (encoder_in == 16'h2000) begynder
47 binary_out = 13;
48 end else if (encoder_in == 16'h4000) begynder
49 binary_out = 14;
50 end else if (encoder_in == 16'h8000) begynder
51 binary_out = 15;
52 udløbet
53 udløbet
54 udløbet
55
56 endmoduleogså se her ..
http://toolbox.xilinx.com/docsan/3_1i/data/fise/xst/chap02/xst02010.htm

 
prioritet encoder bruges, når du har en sekvens lagres i et register, men hvad yo gøre, når det kommer i serie, og du ikke kender længden?
Jeg tror, en tæller skal tælle de kommende bits og kontrollere for de første 1.

 
Du kan bruge en Mealy eller Moore statsmaskine.Det vil være enklere.Tilstand i en tilstand, indtil du får en en, og hvis du ønsker at få den smule position, hvor 1 indtraf du kan bruge en tæller.Så snart du får en du kan hoppe til forarbejdning fase.Du vil finde masser af oplysninger om statens maching på web Jeg foreslår, at du går igennem dem.

 
Hi whizkid,
Tak for dine oplysninger.Under Deres erklæring, er det afkodning flow sekventiel fra højeste til laveste smule smule.Forsinkelsen vil afhænge af inddata længde.Men jeg spekulerer på en mere strømbesparende eller høj ydeevne måde at gøre dette.Også, jeg foretrækker ikke at bruge flere cyklus på den.Er der nogen, der har mere idé om dette?

 
Hvis du vil have oplysninger om "position" i de første 1, en tæller, er den eneste måde, ifølge mig.Jeg ville elske at høre om en anden metode.

Det bliver kompliceret, når du ikke kender længden af indkommende data, dvs du er nødt til at fastslå "hvad er størrelsen på disken" ellers vil overflow, og du vil få en forkert position.

Også, skal du sørge for, at en glitch eller nogle støj ikke er registreret som en 1, enten bruge en to FFS (en ve kant og en-ve) eller prøve de indgående data hurtigere end den normale uret, ligesom sine gjort i UARTs.

HTH,
Beowulf

 
eexuke skrev:

Forsinkelsen vil afhænge af inddata længde.
 
Jeg tror, du kan bruge denne metode:

Bemærk, nu er jeg bruger VHDL,
så der kan være syntaksfejl i min verilog koder.

modul tt (RST, CLK, ind, ud);
input i;
input rst;
input i;
output out; / / Det viser flaget

reg out;

reg [4:0] in_buf;

altid @ (posedge clk og negedge rst)
begynd
if (rst == 0)
in_buf <= 5'b00000;
anden
in_buf <= (in_buf [3:0], i);
ende

altid @ (posedge clk og negedge rst)
begynd
if (rst == 0)
out <= 0;
anden
begynd
if (in_buf == "00.001")
out <= 1'b1;
anden
out <= 1'b0;
ende

endmodule

Det synes, det er ikke nødvendigt at bruge statsmaskine til dette, skal du overveje meget mere, og på samme tid, skal du bruge samme område.Her vil jeg bare bruge 5 DFFs, og en lille kombination logisk, ligesom 3 OG.

Hope hjælpe dig.

Venlig hilsen,
Tony Tao

 
tony_taoyh,

Hvad er brugen af in_buf shfit register?
Hvad med placeringen af de første »1« i strøm?

 
Hi Folks

hvis hastigheden ikke er den bekymring, så synes jeg, at u konvertere disse data til seriel form, og én efter én sammenligne det lidt med 1 og aktivere disken hver gang u konvertere dataene til serie form og på det tidspunkt af kampen, mens sammenligning check tælleren position.hvis u savn den enkle verilog programmet bare mail mig ud jeg skal forsøge at for u

Ashish

 

Welcome to EDABoard.com

Sponsor

Back
Top