Hallo zusammen ich möchte verschiedene Zähler in einer cpld realisieren. Vhdl verstehe ich in den Grundzügen, leider verstehe ich aber nicht wie man den Code optimieren kann. Daher hat ein simpler Zähler nicht Platz bei 72 Microzellen. Frage 1: Ein Zähler welcher 640 Takte zählt realisiere ich mit einem Process, welcher einen Integer raufzählt bis zum Endwert und stets mit IF auf den Endwert vergleicht. Gibt es da einfachere Lösungen, welche weniger FlipFlop benötigt. Frage 2: Wenn ich eine Integervariable definiere wie viele Bits werden da reserviert. Gibt es kleinere Typen. Allgemein, gibt es Bücher, Skripte wo die Optimierung beschrieben ist. Danke für Eure Hilfe
Dein integer wird wahrscheinlich mit 32 Bit gespeichert. Du solltest mit 10 Bit auskommen. Versuch doch mal "integer range 0 to 639" oder einen "std_logic_vector(9 downto 0)". Außerdem sollte ein Vergleich auf Null weniger Hardware brauchen, sprich Du setzt Deinen Zähler auf den Startwert und dekrementierst dann. Rick
Man optimiert nicht code, man optimiert hardware. Heisst du legst fest was du brauchst (Zähler,Register,Multiplexer,...) beschreibst die so in VHDL das das das Synthesetool die als Zähler,Register,Multiplexer,... erkennst. Checkst dann noch im synthesereport (*.syr) das dem so ist und fertig der Zähler. Vergiss C mit sizeof(int) >sizeof(char) und so, entscheident ist wie die synthese deine signal in Hardware umsetzt. Alles weiter wie beim Vorredner. Der code: ---------
1 | USE ieee.std_logic_1164.ALL; |
2 | |
3 | ENTITY counter IS |
4 | PORT ( |
5 | clk_i : IN std_logic; |
6 | tick_o : OUT std_logic); |
7 | END counter; |
8 | |
9 | ARCHITECTURE behave OF counter IS |
10 | |
11 | SUBTYPE T_COUNT_640 IS integer RANGE 639 DOWNTO 0; |
12 | SIGNAL count_q : t_count_640 := T_COUNT_640'high; |
13 | --
|
14 | SIGNAL overflow : std_logic; |
15 | |
16 | BEGIN -- behave |
17 | |
18 | PROCESS(clk_i) |
19 | BEGIN
|
20 | IF rising_edge(clk_i) THEN |
21 | IF overflow = '1' THEN |
22 | count_q <= t_count_640'high; |
23 | ELSE
|
24 | count_q <= count_q - 1; |
25 | END IF; |
26 | END IF; |
27 | END PROCESS; |
28 | overflow <= '1' WHEN count_q = T_COUNT_640'low ELSE '0'; |
29 | |
30 | tick_o <= overflow; |
31 | END behave; |
der Synthesereport:
-------------------
Synthesizing Unit <counter>.
Related source file is "/home/urban/elektro/cpld_count/count.vhd".
Found 10-bit down counter for signal <count_q>.
Summary:
inferred 1 Counter(s).
Unit <counter> synthesized.
WARNING:Xst:2734 - Property "use_dsp48" is not applicable for this
technology.
========================================================================
=
HDL Synthesis Report
Macro Statistics
# Counters : 1
10-bit down counter : 1
========================================================================
=
========================================================================
=
* Advanced HDL Synthesis
*
========================================================================
=
========================================================================
=
Advanced HDL Synthesis Report
Macro Statistics
# Counters : 1
10-bit down counter : 1
========================================================================
=
========================================================================
=
* Low Level Synthesis
*
========================================================================
=
Optimizing unit <counter> ...
implementation constraint: INIT=s : count_q_9
implementation constraint: INIT=r : count_q_8
implementation constraint: INIT=r : count_q_7
implementation constraint: INIT=s : count_q_6
implementation constraint: INIT=s : count_q_5
implementation constraint: INIT=s : count_q_4
implementation constraint: INIT=s : count_q_3
implementation constraint: INIT=s : count_q_2
implementation constraint: INIT=s : count_q_1
implementation constraint: INIT=s : count_q_0
========================================================================
=
* Partition Report
*
========================================================================
=
Partition Implementation Status
-------------------------------
No Partitions were found in this design.
-------------------------------
========================================================================
=
* Final Report
*
========================================================================
=
Final Results
Top Level Output File Name : counter
Output Format : NGC
Optimization Goal : Area
Keep Hierarchy : YES
Target Technology : XC9500 CPLDs
Macro Preserve : YES
XOR Preserve : YES
wysiwyg : NO
Design Statistics
# IOs : 2
Cell Usage :
# BELS : 54
# AND2 : 5
# AND3 : 3
# INV : 22
# OR2 : 15
# XOR2 : 9
# FlipFlops/Latches : 10
# FD : 10
# IO Buffers : 2
# IBUF : 1
# OBUF : 1
========================================================================
=
Der Schlussreport
------------------
Macrocells Product Terms Function Block Registers Pins
Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot
11 /36 ( 31%) 13 /180 ( 7%) 10 /72 ( 14%) 10 /36 ( 28%) 2 /34
( 6%)
** Function Block Resources **
Function Mcells FB Inps Signals Pterms IO
Block Used/Tot Used/Tot Used Used/Tot Used/Tot
FB1 0/18 0/36 0 0/90 0/17
FB2 11/18 10/36 10 13/90 1/17
----- ----- ----- -----
11/36 10/72 13/180 1/34
Hallo Erstmal Danke vielmals für die guten Antworten. Nun hat es Platz in der CPLD. Ich habe noch eine kleine Frage. Muss man den speziellen Clockbuffer selber erstellen oder irgendwie definieren? Das Synthesetool warnt mich dies wäre erforderlich. Danke für eure Bemühungen
@ savo (Gast) >Muss man den speziellen Clockbuffer selber erstellen oder irgendwie >definieren? Das Synthesetool warnt mich dies wäre erforderlich. Nein, es reicht die GCK-Pins als Takteingang zu nutzen. Also einfach die richtige Pinzuweisung im UCF machen. MFg Falk
im Code von Fpga Kuechle steht außerhalb des Prozesses
> overflow <= '1' WHEN count_q = T_COUNT_640'low ELSE '0';
Kann das nicht zu Glitches führen, da nicht synchron zum Takt abgefragt
wird? oder sehe ich jetzt schon "Synchron-Gespenster"
Danke und Grüße
Volker
@ Volker (Gast) >im Code von Fpga Kuechle steht außerhalb des Prozesses >> overflow <= '1' WHEN count_q = T_COUNT_640'low ELSE '0'; >Kann das nicht zu Glitches führen, da nicht synchron zum Takt abgefragt Ja, Glitches können auftreten. Das ist aber bei Steuersignalen egal. Niemand sagt, dass overflow als Takt genutzt werden soll. Synchron ist das schon, aber eben halt kombinatorisch. MfG Falk
@Falk Brunner (falk) danke, aber ich habe das noch nicht ganz verstanden. Wieso sind Glitches bei Steuersignalen egal? Immerhin wird das Signal nach außen gegeben: tick_o <= overflow; Volker
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.