1 |
2 |
robotron |
--
|
2 |
|
|
-- * pipelined synchronous pulse counter *
|
3 |
|
|
--
|
4 |
|
|
-- fast counter for slow-carry architectures
|
5 |
|
|
-- non-monotonic counting, value calculable by HDL/CPU
|
6 |
|
|
--
|
7 |
|
|
-- idea&code by Marek Peca 08/2012
|
8 |
|
|
-- Vyzkumny a zkusebni letecky ustav, a.s. http://vzlu.cz/
|
9 |
|
|
-- thanks to Michael Vacek for testing
|
10 |
|
|
--
|
11 |
|
|
|
12 |
|
|
Pipelined Synchronous Pulse Counter
|
13 |
|
|
===================================
|
14 |
|
|
|
15 |
|
|
is a proposal of binary counter, designed to minimize logic path
|
16 |
|
|
length in between flip-flops to one gate (MUX/AND) only, at the
|
17 |
|
|
expense of not so straightforward binary counting. The reason for this
|
18 |
|
|
design has emerged while using Actel (MicroSemi) ProASIC/IGLOO
|
19 |
|
|
architecture, lacking any hardwired support for fast carry.
|
20 |
|
|
|
21 |
|
|
During our work on Actel FPGAs (basically, 3-LUT & DFF only), we were
|
22 |
|
|
aware of following types of faster counters:
|
23 |
|
|
- LFSR counter
|
24 |
|
|
- Johnson counter
|
25 |
|
|
- "RLA counter" (as tailored using Actel's SmartGen core generator)
|
26 |
|
|
|
27 |
|
|
Johnson due to its O(2^n) (n as number of bits) can not be used for
|
28 |
|
|
longer counts; LFSR's are hard to invert (table lookup seems to be
|
29 |
|
|
only known method), therefore also impractical for wider counters. RLA
|
30 |
|
|
counter is still too slow and complex for wider counters and moderate
|
31 |
|
|
speeds (e.g. > 24bits @ >100MHz).
|
32 |
|
|
|
33 |
|
|
As a consequence, the proposed counter uses synchronous divide-by-two
|
34 |
|
|
blocks, each using 1-bit pipeline and carry by single-clock
|
35 |
|
|
pulse. Design is simple and fast, preliminary results from Synplify
|
36 |
|
|
and Actel Designer shows 32bits @200MHz feasible.
|
37 |
|
|
|
38 |
|
|
However, output bit lines are non-proportionaly delayed by discrete
|
39 |
|
|
number of clock periods. Therefore, to obtain linear bit word, an
|
40 |
|
|
inversion formula needs to be applied. Fortunately, the inversion is
|
41 |
|
|
simple (unlike LFSR's), in C (pcount.c):
|
42 |
|
|
|
43 |
|
|
for (k = 1; k < n; k++)
|
44 |
|
|
if ((y & ((1<
|
45 |
|
|
y = y ^ (1<
|
46 |
|
|
|
47 |
|
|
-- it may be implemented in VHDL core, or within CPU as shown, depending on
|
48 |
|
|
application requirements.
|
49 |
|
|
|
50 |
|
|
Files
|
51 |
|
|
=====
|
52 |
|
|
|
53 |
|
|
pdivtwo.vhdl basic building block -- 1-stage pipelined
|
54 |
|
|
flip-flop
|
55 |
|
|
pdchain.vhdl counter top-level entity
|
56 |
|
|
pcount_tb.vhdl GHDL testbench
|
57 |
|
|
pcount.c C language encoder/decoder of counter bitword
|
58 |
|
|
doc/pcounter_4bit_trace.pdf simulated signals of 4-bit counter
|
59 |
|
|
doc/pcounter_sch.pdf schematic diagram of the counter
|
60 |
|
|
|
61 |
|
|
Results
|
62 |
|
|
=======
|
63 |
|
|
|
64 |
|
|
Synthesized within larger circuit for Actel ProASIC3E A3PE1500-Std
|
65 |
|
|
as 32bit wide counter, typical frequency: 234MHz
|
66 |
|
|
|
67 |
|
|
Comments?
|
68 |
|
|
=========
|
69 |
|
|
|
70 |
|
|
***
|
71 |
|
|
* First, if you find this pretty simple idea to be non-original work
|
72 |
|
|
* *please* send me an e-mail with respective pointers; I will then freeze
|
73 |
|
|
* the repository, including link to the reference.
|
74 |
|
|
***
|
75 |
|
|
|
76 |
|
|
If you find this idea useful, apply it whenever you want, however,
|
77 |
|
|
share your improvements. E.g.:
|
78 |
|
|
- (fast) HDL implementation of bitword encode/decode
|
79 |
|
|
- preset/reset/match/enable logic
|
80 |
|
|
|
81 |
|
|
Testimonials (usage/frequency/bits/architecture) are indeed welcome.
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
--
|
85 |
|
|
Greetings by Marek
|