Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to count zeros in registers?

1,451 views
Skip to first unread message

Davy

unread,
Nov 29, 2005, 9:12:56 AM11/29/05
to
Hi all,

reg[7:0] register;
The register contains data like
[0 0 0 1 0 1 0 1]
And I want to know the number of the zeros before the first 1
(in this example is 3 zeros).

How to do this in a combinational logic?

Best regards,
Davy

John Penton

unread,
Nov 29, 2005, 9:37:00 AM11/29/05
to

With a priority tree:

if (reg[7:0] == 8'b00000000)
clz = 3'h8;
else if (reg[7:1] == 7'b0000000)
clz = 3'h7;
else if ...

You can play some tricks to make it faster - particularly useful if your
register is bigger than 8 bits. It will always be quite large.

John

--
John Penton, posting as an individual unless specifically indicated
otherwise.


Stephane

unread,
Nov 29, 2005, 9:47:08 AM11/29/05
to
John Penton wrote:
> Davy wrote:
>
>>Hi all,
>>
>>reg[7:0] register;
>>The register contains data like
>>[0 0 0 1 0 1 0 1]
>>And I want to know the number of the zeros before the first 1
>>(in this example is 3 zeros).
>>
>>How to do this in a combinational logic?
>
>
> With a priority tree:
>
> if (reg[7:0] == 8'b00000000)
> clz = 3'h8;
> else if (reg[7:1] == 7'b0000000)
> clz = 3'h7;
> else if ...
>
> You can play some tricks to make it faster - particularly useful if your
> register is bigger than 8 bits. It will always be quite large.
>
> John
>

This would waste a lot of resources if the reg is large... I would have
done it sequentially with a counter!

(and cross-posting is baaaaad ;-)

Fred Bloggs

unread,
Nov 29, 2005, 10:02:42 AM11/29/05
to

Hey why don't tell us a little about the application, because this
sounds like something totally divorced from reality. Is the real
application about cheating on a homework assignment? I could understand
if applied an iota of effort, but there's no evidence of that. Aren't
you the lazy punk-assed juvenile sh_t with the loud mouth about plonking
people and shooting your f____ing mouth off about how clever you are?
Well how damned clever are you when it comes to doing something
constructive, punk-ass?

Jim Thompson

unread,
Nov 29, 2005, 10:27:49 AM11/29/05
to

See...

http://www.analog-innovations.com/SED/HowManyOnes.pdf

You'll need to modify it for "zeroes" and to stop at the first
occurrence of a "one"

...Jim Thompson
--
| James E.Thompson, P.E. | mens |
| Analog Innovations, Inc. | et |
| Analog/Mixed-Signal ASIC's and Discrete Systems | manus |
| Phoenix, Arizona Voice:(480)460-2350 | |
| E-mail Address at Website Fax:(480)460-2142 | Brass Rat |
| http://www.analog-innovations.com | 1962 |

I love to cook with wine. Sometimes I even put it in the food.

Petro...@hotmail.com

unread,
Nov 29, 2005, 11:31:46 AM11/29/05
to

Fred Bloggs wrote:
> Davy wrote:
> > Hi all,
> >
> > reg[7:0] register;
> > The register contains data like
> > [0 0 0 1 0 1 0 1]
> > And I want to know the number of the zeros before the first 1
> > (in this example is 3 zeros).
> >
> > How to do this in a combinational logic?
> >
> > Best regards,
> > Davy
> >
>
> Hey why don't tell us a little about the application, because this
> sounds like something totally divorced from reality.

Some processors have Count Leading Zeros/Ones instructions to quickly
determine how many bits to left shift data. I had to write HDL code
for a custom ASIC processor with a clz instruction. Neat little
combinational logic problem...

Pete

John Penton

unread,
Nov 29, 2005, 11:38:29 AM11/29/05
to
Jim Thompson wrote:
> On 29 Nov 2005 06:12:56 -0800, "Davy" <zhus...@gmail.com> wrote:
>
>> Hi all,
>>
>> reg[7:0] register;
>> The register contains data like
>> [0 0 0 1 0 1 0 1]
>> And I want to know the number of the zeros before the first 1
>> (in this example is 3 zeros).
>>
>> How to do this in a combinational logic?
>>
>> Best regards,
>> Davy
>
> See...
>
> http://www.analog-innovations.com/SED/HowManyOnes.pdf
>
> You'll need to modify it for "zeroes" and to stop at the first
> occurrence of a "one"

I don't think this is what the OP wanted. Perhaps he could comment.

Richard Henry

unread,
Nov 29, 2005, 11:50:44 AM11/29/05
to

"Davy" <zhus...@gmail.com> wrote in message
news:1133273576.1...@f14g2000cwb.googlegroups.com...

Use the register bits as address inputs to a ROM in which the data is coded
for the results.

Register --> ROM --> Output

Examples:

ADDR DATA
00 8
01 7
02 6
03 6
04 5
05 5
06 5
07 5
08 4
...
0f 4
10 3
...
1f 3
20 2

etc.

Or you can write a mathematical expression involving logs to the base 2.


bill....@ieee.org

unread,
Nov 29, 2005, 11:48:38 AM11/29/05
to

Fred Bloggs wrote:
> Davy wrote:
> > Hi all,
> >
> > reg[7:0] register;
> > The register contains data like
> > [0 0 0 1 0 1 0 1]
> > And I want to know the number of the zeros before the first 1
> > (in this example is 3 zeros).
> >
> > How to do this in a combinational logic?
> >
> > Best regards,
> > Davy
> >
>
> Hey why don't tell us a little about the application, because this
> sounds like something totally divorced from reality.

<snipped Fred being conversational>

The only time I had to do this, I had it easier, because I'd been asked
to produced a floating point output on a multiplexed multi-character
display, which was being driven from a shift register, back in the days
before PICs.

I don't think the system ever worked (and in fact I just found the
hardware out in the attic) but it should have worked, A colleague was
building his own photon counter, and wanted to display a wide range of
photon counts without paying for a large number of seven-segment
displays. He dumped the half-finished system on me when he went off to
concentrate on being an acadmeic chemist.

-----------
Bill Sloman, Nijmegen

soxmax

unread,
Nov 29, 2005, 11:53:21 AM11/29/05
to

In order to get combinational logic, your best bet is to use a Karnaugh
Map for each individual case. Also - never begin a sentence with a
preposition.

-Derek

Spehro Pefhany

unread,
Nov 29, 2005, 12:11:26 PM11/29/05
to
On 29 Nov 2005 06:12:56 -0800, the renowned "Davy"
<zhus...@gmail.com> wrote:

Pretty easy (a few minutes) if you can use a behavioral description.

What have you done to try and solve this (homework?) problem yourself?


Best regards,
Spehro Pefhany
--
"it's the network..." "The Journey is the reward"
sp...@interlog.com Info for manufacturers: http://www.trexon.com
Embedded software/hardware/analog Info for designers: http://www.speff.com

Frank Bemelman

unread,
Nov 29, 2005, 12:19:26 PM11/29/05
to
"Davy" <zhus...@gmail.com> schreef in bericht
news:1133273576.1...@f14g2000cwb.googlegroups.com...

> Hi all,
>
> reg[7:0] register;
> The register contains data like
> [0 0 0 1 0 1 0 1]
> And I want to know the number of the zeros before the first 1
> (in this example is 3 zeros).

Use a chain of 2-input or-gates, output to input.

Tie the other input of each gate to your register.

The outputs of each or-gate goes to an inverter.

The outputs of the inverters go to a 8-3 binary encoder.


--
Thanks, Frank.
(remove 'q' and '.invalid' when replying by email)


Spehro Pefhany

unread,
Nov 29, 2005, 12:37:15 PM11/29/05
to
On 29 Nov 2005 08:31:46 -0800, the renowned Petro...@hotmail.com
wrote:

Sure, suppose you want to normalize a floating-point mantissa using a
barrel shifter.

Rick Jackson

unread,
Nov 29, 2005, 12:30:31 PM11/29/05
to
On Tue, 29 Nov 2005 15:02:42 GMT, Fred Bloggs <nos...@nospam.com>
wrote:

>
>
>Davy wrote:
>> Hi all,
>>
>> reg[7:0] register;
>> The register contains data like
>> [0 0 0 1 0 1 0 1]
>> And I want to know the number of the zeros before the first 1
>> (in this example is 3 zeros).
>>
>> How to do this in a combinational logic?
>>
>> Best regards,
>> Davy
>>
>
>Hey why don't tell us a little about the application, because this
>sounds like something totally divorced from reality.

It's pretty fundamental, actually; there's at least one TTL priority
encoder (the '278). A couple of obvious applications are normalisation
and interrupt prioritisation.

Rick

Frank Bemelman

unread,
Nov 29, 2005, 12:31:41 PM11/29/05
to
"Spehro Pefhany" <spef...@interlogDOTyou.knowwhat> schreef in bericht
news:jnuoo11clvm7t4dnt...@4ax.com...

> On 29 Nov 2005 06:12:56 -0800, the renowned "Davy"
> <zhus...@gmail.com> wrote:
>
> >Hi all,
> >
> >reg[7:0] register;
> >The register contains data like
> >[0 0 0 1 0 1 0 1]
> >And I want to know the number of the zeros before the first 1
> >(in this example is 3 zeros).
> >
> >How to do this in a combinational logic?
> >
> >Best regards,
> >Davy
>
> Pretty easy (a few minutes) if you can use a behavioral description.

A few minutes indeed. Here's another nice puzzle I stumbled on
yesterday:

http://cgi.ebay.com/Magic-Switchboard_W0QQitemZ6581621863

Took me about 3 minutes to figure out half a solution. The problem
I have is the requirement:
"With this improved version, when the board is initially turned on
you are able to light the bulbs in any order.".

Spending another 30 minutes didn't bring me any luck ;)

Spehro Pefhany

unread,
Nov 29, 2005, 1:44:22 PM11/29/05
to
On Tue, 29 Nov 2005 18:31:41 +0100, the renowned "Frank Bemelman"
<f.bem...@xs4all.invalid.nl> wrote:

>"Spehro Pefhany" <spef...@interlogDOTyou.knowwhat> schreef in bericht
>news:jnuoo11clvm7t4dnt...@4ax.com...
>> On 29 Nov 2005 06:12:56 -0800, the renowned "Davy"
>> <zhus...@gmail.com> wrote:
>>
>> >Hi all,
>> >
>> >reg[7:0] register;
>> >The register contains data like
>> >[0 0 0 1 0 1 0 1]
>> >And I want to know the number of the zeros before the first 1
>> >(in this example is 3 zeros).
>> >
>> >How to do this in a combinational logic?
>> >
>> >Best regards,
>> >Davy
>>
>> Pretty easy (a few minutes) if you can use a behavioral description.
>
>A few minutes indeed.

It synthesized to 9 4-in LUTs on an FPGA, or 5 slices, with 6 levels
of logic.

>Here's another nice puzzle I stumbled on
>yesterday:
>
>http://cgi.ebay.com/Magic-Switchboard_W0QQitemZ6581621863
>
>Took me about 3 minutes to figure out half a solution. The problem
>I have is the requirement:
>"With this improved version, when the board is initially turned on
>you are able to light the bulbs in any order.".
>
>Spending another 30 minutes didn't bring me any luck ;)

Heh. Nonvolatile memory? ;-)

Frank Bemelman

unread,
Nov 29, 2005, 2:02:21 PM11/29/05
to
"Spehro Pefhany" <spef...@interlogDOTyou.knowwhat> schreef in bericht
news:b08po11ms5v7s0lne...@4ax.com...

I don't know. If you mount the bulbs and caps in random
order, you could "program" the board by flipping the switches
in the same sequence as the lamps are mounted. So, if the
bulbs are mounted as B-Y-G-R, flip the switches in B-Y-G-R
sequence, thus telling the board which switch belongs to
which bulb. Not many would notice that turning on the
switches in that sequence, is actually a learning cycle for
the controller. Only needed once after power-on reset, and
then the game can continue.

But then there is the claim that you can turn on the lamps
in any order, no matter in what sequence they are mounted.

Perhaps there is enough difference in resistance between the
colored bulbs to indentify them reliably. The controller
could then measure the cold resistance to find out which
bulb is in which socket.

Sounds like a fun project, bit of shame I don't need a
fun project at this moment ;)

Spehro Pefhany

unread,
Nov 29, 2005, 3:01:00 PM11/29/05
to
On Tue, 29 Nov 2005 20:02:21 +0100, the renowned "Frank Bemelman"
<f.bem...@xs4all.invalid.nl> wrote:

It depends on the meaning of "initially"-- remember it's to their
advantage to obfuscate a bit. Note the distinctions in the description
between what *you* must do and what the "spectators" can be allowed to
do (they can flip the switches, but presumably not decide *which*
switches to initially flip).

If it's previously been programmed, then you can turn it on
"initially" and it will remember the previous programming (and the
lights can be turned on in any order-- but not re-ordered with the
power off). Their early model might not have done that.

>Perhaps there is enough difference in resistance between the
>colored bulbs to indentify them reliably. The controller
>could then measure the cold resistance to find out which
>bulb is in which socket.

I don't think there's anything fancy-schmancy like that going on. Just
switches and probably detection of bulbs removed. You're thinking way
too hard about the electronics and not hard enough about the
obfuscation. It's a kind of magic trick.

Reminds me of the flashing devil horns that I bought for a couple of
dollars on the street one Halloween:

http://server2.hostingplex.com/~zstoretr/horns.JPG

Ran off of AA cells in the black cylinders on the sides, with a light
in each horn. I postulated some kind of COB ASIC with a bipolar
transistor driving each lamp. Felt pretty silly when I found one
fractional-cent thermal flasher Xmas mini-light in each horn and no
active circuitry at all. ;-)

>Sounds like a fun project, bit of shame I don't need a
>fun project at this moment ;)

Might be a fun project for a student. In VHDL, Verilog, with a
microcontroller or whatever.

Tam/WB2TT

unread,
Nov 29, 2005, 3:46:51 PM11/29/05
to
Don't reinvent the wheel. Invert the SR outputs, and run them into a 74x148.
If you look at the data sheet,the circuit is obvious. You want INPUT7 to be
the *least* significant bit. If you have more than an 8 bit SR, you have to
do some cascading. There is also a 10 bit version.

Tam

"Davy" <zhus...@gmail.com> wrote in message
news:1133273576.1...@f14g2000cwb.googlegroups.com...

petrus bitbyter

unread,
Nov 29, 2005, 4:44:13 PM11/29/05
to

"Davy" <zhus...@gmail.com> schreef in bericht
news:1133273576.1...@f14g2000cwb.googlegroups.com...

Well, Davy,

The question is clear enough but I miss the background. I cannot believe
this to be a serious design problem. Anyone who has some basic knowledge of
digital design should be able to answer immediately. A practical solution
depends on the background I'm missing. You can use a bunch of logic gates,
an EPROM or a PLD to name a few.

petrus bitbyter


Joel Kolstad

unread,
Nov 29, 2005, 5:31:24 PM11/29/05
to
"petrus bitbyter" <pieterkral...@enditookhccnet.nl> wrote in message
news:438cccb2$0$6508$e4fe...@dreader11.news.xs4all.nl...

> The question is clear enough but I miss the background. I cannot believe
> this to be a serious design problem. Anyone who has some basic knowledge of
> digital design should be able to answer immediately. A practical solution
> depends on the background I'm missing. You can use a bunch of logic gates,
> an EPROM or a PLD to name a few.

He's probably looking for a 'clever,' in this case meaning 'low gate count' or
'fast' solution. There are plenty of digital design problems out there that
are entirely straightforward to just 'code up' a solution to in, e.g., VHDL or
TTL logic, but can be an order of magnitude slower or larger than more clever
solutions.

Counting the number of consecutive zero bits is one of these problems.

This sort of problem comes up somewhat more frequently in software, where
people stuck with, e.g., 1MHz CPUs really do need every last CPU cycle they
can spare... solutions are found all over, e.g.,
http://graphics.stanford.edu/~seander/bithacks.html .


Rich Grise

unread,
Nov 29, 2005, 6:01:43 PM11/29/05
to

Google '"priority encoder" logic' - include the double-quote (")
and don't include the single-quote (').

There used to be a chip, the 74148, that would give you the answer
in one cycle.

Good Luck!
Rich


Art Stamness

unread,
Nov 29, 2005, 6:44:19 PM11/29/05
to
And the answer is (the following is pseudo code in Verilog ) :

function [3:0] CountLeadingZeros ;
input [7:0] source ;
begin
// synopsys_full_case or something like that
casex ( source )
8'b1xxxxxx : CountLeadingZeros = 4'd0 ;
8'b01xxxxx : CountLeadingZeros = 4'd1 ;
8'b001xxxx : CountLeadingZeros = 4'd2 ;
... ( you can fill in the rest here )
8'b0000000 : CountLeadingZeros = 4'd8 ;
default : CountLeadingZeros = 4'dx ; // I always put in
defaults for simulation sake
endcasex
endfunction

This should do the trick. I have no clue what the other 21 people on
this thread are talking about, or why this wasn't the first answer. but
Here it is.

-Art

sleb...@gmail.com

unread,
Nov 29, 2005, 6:44:51 PM11/29/05
to

You are thinking too much like an engineer and not enough as a
magician. It's magic, so trickery is normal. The way it's usually done
is that under each bulb there are four magnetic reed relays. Notice the
white cylinders? Each has a small magnet underneath. The trick is the
color is actually encoded by the position of the white cylinder, not
the bulb. You just need to remember to rotate the cylinder to the
correct position while screwing in the bulb.

A simple schematic for a single bulb (in ASCII of course, use
propotional font):


red
|
\
|
|
green__/ ____bulb____M____blue
|
|
\
|
yellow


M = Small magnet for closing the contact
of the reed relay. Rotate this magnet
to select which switch turns on this
bulb.

Mac

unread,
Nov 30, 2005, 12:05:36 AM11/30/05
to

I think your answer is about the best, given that the OP seems to want
verilog (although he didn't explicitly SAY that). But the original post
also is visible here in sci.electronics.design (as well as a few other
groups), where many of the other answers are more-or-less on-topic.

Probably the OP should have posted to comp.lang.verilog only.

I can't imagine that it is ever a good idea to post to comp.lang.verilog
and comp.lang.vhdl. ;-)

--Mac

Frank Bemelman

unread,
Nov 30, 2005, 3:32:14 AM11/30/05
to

"sleb...@yahoo.com" <sleb...@gmail.com> schreef in bericht
news:1133307891.0...@z14g2000cwz.googlegroups.com...

Hmm, yes, looks a bit complicated to me. It would require
a lot of fiddling with the cylinders, with the added risk
that people will notice that.

A mini version can be seen here:
http://www.wellingtonent.com/document/switchb.html

Here we see no cylinders, only sockets screwed on a wood
base. The caps on the tumbler switches don't allow for
much trickery either. Although there are some large black
mountings around it, which perhaps can be rotated. That
could be part of another deception, make people believe
these can be rotated. And when they try that, it turns out
to make no difference at all. Something like that ;)

Stephane

unread,
Nov 30, 2005, 4:04:56 AM11/30/05
to
soxmax wrote:

>> Davy wrote:
>>And I want to know the number of the zeros before the first 1

> Also - never begin a sentence with a
> preposition.

I'm not native speaker, but I don't agree :
http://grammar.uoregon.edu/prepositions/prepositions.html

Anyway, I wouldn't start a sentence with "and"...

>
> -Derek
>

Meindert Sprang

unread,
Nov 30, 2005, 5:59:22 AM11/30/05
to
"Stephane" <step...@nospam.fr> wrote in message
news:dmjq9c$l98$1...@ellebore.extra.cea.fr...

> soxmax wrote:
> >> Davy wrote:
> >>And I want to know the number of the zeros before the first 1

The book "Hacker's Delight" from Henry S. Warren, ISBN 0201914654, available
at Amazon lists several algorithms to do this. Some use loops and others
only logical test. Very interesting reading.

Meindert


Jan Decaluwe

unread,
Nov 30, 2005, 7:11:25 AM11/30/05
to

I agree about the others, but this wouldn't be my first answer.
To me the obvious solution is a for-loop over the word
that returns the loop counter as soon a '1' is found.

The reason why this "obvious" solution apparently isn't that
obvious to many people may be that this is one more occasion
in which Verilog doesn't really help. Many languages have
a 'return' or 'break' statement to break out of a loop early
and cleanly. But in Verilog, one has to use that awkward
'disable' statement to emulate this behavior.

Jan

--
Jan Decaluwe - Resources bvba - http://www.jandecaluwe.com
Losbergenlaan 16, B-3010 Leuven, Belgium
From Python to silicon:
http://myhdl.jandecaluwe.com

Arie de Muynck

unread,
Nov 30, 2005, 5:18:36 PM11/30/05
to
I found on the web some discussions, with this as the best observation:
> I'm very sure that there is some sort of electronic circuit in there
somewhere (yet another "thick base"). If you notice, the trick is
performed, so that every time the switches are thrown, the lights light up
in the order they are in the sockets, from right to left. (This is using
the Carson performance as reference).
So, I'd assume that it's some sort of circuit so that no matter what
switch is thrown, the first goes on, then the second switch thrown turns
on the second one, as so forth.


Which sounds like some very simple sequential logic.

Also, suggestions were made that tracking the order in which lamps were
removed, then replaced, allows the unit to "memorize" the positions. But
that in itself would not explain the final part of the trick with the
exchanging of the switch caps, in that part the operation (sequencing) of
the switches must be special.

--
Regards,
Arie de Muynck

lang...@ieee.org

unread,
Nov 30, 2005, 6:33:24 PM11/30/05
to

Jan Decaluwe skrev:

> Art Stamness wrote:
> > And the answer is (the following is pseudo code in Verilog ) :
> >
> > function [3:0] CountLeadingZeros ;
> > input [7:0] source ;
> > begin
> > // synopsys_full_case or something like that
> > casex ( source )
> > 8'b1xxxxxx : CountLeadingZeros = 4'd0 ;
> > 8'b01xxxxx : CountLeadingZeros = 4'd1 ;
> > 8'b001xxxx : CountLeadingZeros = 4'd2 ;
> > ... ( you can fill in the rest here )
> > 8'b0000000 : CountLeadingZeros = 4'd8 ;
> > default : CountLeadingZeros = 4'dx ; // I always put in
> > defaults for simulation sake
> > endcasex
> > endfunction
> >
> > This should do the trick. I have no clue what the other 21 people on
> > this thread are talking about, or why this wasn't the first answer. but
> > Here it is.
>
> I agree about the others, but this wouldn't be my first answer.
> To me the obvious solution is a for-loop over the word
> that returns the loop counter as soon a '1' is found.
>

yep loop is better, I've always been told that casex is evil :)

> The reason why this "obvious" solution apparently isn't that
> obvious to many people may be that this is one more occasion
> in which Verilog doesn't really help. Many languages have
> a 'return' or 'break' statement to break out of a loop early
> and cleanly. But in Verilog, one has to use that awkward
> 'disable' statement to emulate this behavior.
>
> Jan

you could just run the loop backwards i.e. starting from the lsb

-Lasse

Woody Brison

unread,
Nov 30, 2005, 6:58:57 PM11/30/05
to
Jim Thompson wrote:

> On 29 Nov 2005 06:12:56 -0800, "Davy" <zhus...@gmail.com> wrote:
>
> >Hi all,
> >
> >reg[7:0] register;
> >The register contains data like
> >[0 0 0 1 0 1 0 1]
> >And I want to know the number of the zeros before the first 1
> >(in this example is 3 zeros).
> >
> >How to do this in a combinational logic?
> >
> >Best regards,
> >Davy
>
> See...
>
> http://www.analog-innovations.com/SED/HowManyOnes.pdf
>
> You'll need to modify it for "zeroes" and to stop at the first
> occurrence of a "one"

Holy Mole, that seems like a contest winner how to do the job
with the most gates possible (altho a modern compiler will
optimize it down some)

Just draw the K-map and loop the functions.

The problem tells us there are 8 bits, people

One thing, the problem doesn't specify: what is wanted when
the register contains 0 0 0 0 0 0 0 0

Wood

Jim Thompson

unread,
Nov 30, 2005, 7:23:08 PM11/30/05
to
On 30 Nov 2005 15:58:57 -0800, "Woody Brison" <woody_...@yahoo.com>
wrote:

>Jim Thompson wrote:
>> On 29 Nov 2005 06:12:56 -0800, "Davy" <zhus...@gmail.com> wrote:
>>
>> >Hi all,
>> >
>> >reg[7:0] register;
>> >The register contains data like
>> >[0 0 0 1 0 1 0 1]
>> >And I want to know the number of the zeros before the first 1
>> >(in this example is 3 zeros).
>> >
>> >How to do this in a combinational logic?
>> >
>> >Best regards,
>> >Davy
>>
>> See...
>>
>> http://www.analog-innovations.com/SED/HowManyOnes.pdf
>>
>> You'll need to modify it for "zeroes" and to stop at the first
>> occurrence of a "one"
>
>Holy Mole, that seems like a contest winner how to do the job
>with the most gates possible (altho a modern compiler will
>optimize it down some)

Just half-adders.

>
>Just draw the K-map and loop the functions.

If you have that luxury.

>
>The problem tells us there are 8 bits, people
>
>One thing, the problem doesn't specify: what is wanted when
>the register contains 0 0 0 0 0 0 0 0
>
>Wood


...Jim Thompson
--
| James E.Thompson, P.E. | mens |
| Analog Innovations, Inc. | et |
| Analog/Mixed-Signal ASIC's and Discrete Systems | manus |
| Phoenix, Arizona Voice:(480)460-2350 | |
| E-mail Address at Website Fax:(480)460-2142 | Brass Rat |
| http://www.analog-innovations.com | 1962 |

I love to cook with wine. Sometimes I even put it in the food.

Jim Thompson

unread,
Nov 30, 2005, 7:35:47 PM11/30/05
to
On 30 Nov 2005 15:58:57 -0800, "Woody Brison" <woody_...@yahoo.com>
wrote:

>Jim Thompson wrote:


>> On 29 Nov 2005 06:12:56 -0800, "Davy" <zhus...@gmail.com> wrote:
>>
>> >Hi all,
>> >
>> >reg[7:0] register;
>> >The register contains data like
>> >[0 0 0 1 0 1 0 1]
>> >And I want to know the number of the zeros before the first 1
>> >(in this example is 3 zeros).
>> >
>> >How to do this in a combinational logic?
>> >
>> >Best regards,
>> >Davy
>>
>> See...
>>
>> http://www.analog-innovations.com/SED/HowManyOnes.pdf
>>
>> You'll need to modify it for "zeroes" and to stop at the first
>> occurrence of a "one"
>
>Holy Mole, that seems like a contest winner how to do the job
>with the most gates possible (altho a modern compiler will
>optimize it down some)
>

[snip]

The OP (for HowManyOnes) wanted to count ALL 1's, not just leading.

Rich Grise

unread,
Nov 30, 2005, 10:59:04 PM11/30/05
to
On Wed, 30 Nov 2005 17:35:47 -0700, Jim Thompson wrote:

> On 30 Nov 2005 15:58:57 -0800, "Woody Brison" <woody_...@yahoo.com>
> wrote:
>
>>Jim Thompson wrote:
>>> On 29 Nov 2005 06:12:56 -0800, "Davy" <zhus...@gmail.com> wrote:
>>>
>>> >Hi all,
>>> >
>>> >reg[7:0] register;
>>> >The register contains data like
>>> >[0 0 0 1 0 1 0 1]
>>> >And I want to know the number of the zeros before the first 1
>>> >(in this example is 3 zeros).
>>> >
>>> >How to do this in a combinational logic?
>>> >
>>> >Best regards,
>>> >Davy
>>>
>>> See...
>>>
>>> http://www.analog-innovations.com/SED/HowManyOnes.pdf
>>>
>>> You'll need to modify it for "zeroes" and to stop at the first
>>> occurrence of a "one"
>>
>>Holy Mole, that seems like a contest winner how to do the job
>>with the most gates possible (altho a modern compiler will
>>optimize it down some)
>>
> [snip]
>
> The OP (for HowManyOnes) wanted to count ALL 1's, not just leading.
>

I thought "before the first 1" meant "leading". ;-)

Here's the part:
http://pdf.alldatasheet.co.kr/datasheet-pdf/view/53747/FAIRCHILD/74HC148.html

Might have to invert the bits - this chip actually counts '1's.
Or you could do it in Xilinx schematic mode. ;-)

Cheers!
Rich


Weng Tianxiang

unread,
Dec 1, 2005, 3:16:07 PM12/1/05
to
Hi,
This is a search list about how to count leading zero for ASIC.

Using the patent number, you can download full content of a patent from
US Patent Office website:
http://patft.uspto.gov/netahtml/search-bool.html.

Those listed must be the most advanced algorithm. Others may be at
amateur level.

Weng


Results of Search in 1976 to present db for:
TTL/"leading zero": 13 patents.
Hits 1 through 13 out of 13
PAT. NO. Title
1 6,779,008 Method and apparatus for binary leading zero counting with
constant-biased result
2 6,654,776 Method and apparatus for computing parallel leading zero
count with offset
3 6,594,679 Leading-zero anticipator having an independent sign bit
determination module
4 6,477,552 Device and method for performing a leading zero
determination on an operand
5 6,205,461 Floating point arithmetic logic unit leading zero count
using fast approximate rounding
6 5,993,051 Combined leading one and leading zero anticipator
7 5,974,432 On-the-fly one-hot encoding of leading zero count
8 5,875,123 Carry-select adder with pre-counting of leading zero
digits
9 5,844,826 Leading zero count circuit
10 5,241,490 Fully decoded multistage leading zero detector and
normalization apparatus
11 5,204,825 Method and apparatus for exact leading zero prediction
for a floating-point adder
12 5,111,415 Asynchronous leading zero counter employing iterative
cellular array
13 4,247,891 Leading zero count formation

Jasen Betts

unread,
Dec 1, 2005, 5:59:37 AM12/1/05
to
["Followup-To:" header set to sci.electronics.basics.]

On 2005-11-29, Davy <zhus...@gmail.com> wrote:
> Hi all,
>
> reg[7:0] register;
> The register contains data like
> [0 0 0 1 0 1 0 1]
> And I want to know the number of the zeros before the first 1
> (in this example is 3 zeros).
>
> How to do this in a combinational logic?

what output do you want?


--

Bye.
Jasen

Woody Brison

unread,
Dec 1, 2005, 4:48:52 PM12/1/05
to

Jim Thompson wrote:
> On 30 Nov 2005 15:58:57 -0800, "Woody Brison" <woody_...@yahoo.com>
> wrote:

> >Just draw the K-map and loop the functions.
>
> If you have that luxury.

Yes... and I think the original poster has that luxury, I concur
that this looks a lot like homework. So what he's needing to
do is draw a K-map. I just wanted to steer him in the right
direction without doing it for him

By the way, code to draw K-maps is not too hard to write.
Collecting minterms isn't too far beyond that.
Reducing 'em isn't too far beyond that.
Having tools like that cuts the time down, bringing such luxuries
into reach of even the humble compiler user

Wood

Jim Thompson

unread,
Dec 1, 2005, 4:58:45 PM12/1/05
to
On 1 Dec 2005 13:48:52 -0800, "Woody Brison" <woody_...@yahoo.com>
wrote:

I can still do 'em by hand but, now-a-days, I use KarnaughMap v4.4.5,
by Russell Sasamori... http://www.puz.com/sw/karnaugh/index.htm

Ulf Samuelsson

unread,
Dec 5, 2005, 5:59:44 AM12/5/05
to
clz[2] = "1" when (D[3 downto 0] = "0000") else "0";
if(clz[2] == "1") then
D1 <= D[7 downto 4];
else
D1 <= D[3 downto 0];
end if;
clz[1] = "1" when (D1[1 downto 0] = "00" else "0";
if(clz[1] == "1") then
D2 <= D1[3 downto 2];
else
D2 <= D1[1 downto 0];
end if;
clz[0] <= "1" when (D2[0] == "0") else "0";

will return the position of the first set bit or 0b111 if no bit is set.
Idea stolen from a girl...

--
Best Regards,
Ulf Samuelsson
This is intended to be my personal opinion which may,
or may bot be shared by my employer Atmel Nordic AB


0 new messages