www.mikrocontroller.net

Forum: FPGA, VHDL & Co. cpld zähler optimieren


Autor: savo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
---------
USE ieee.std_logic_1164.ALL;

ENTITY counter IS
  PORT (
    clk_i  : IN  std_logic;
    tick_o : OUT std_logic);
END counter;

ARCHITECTURE behave OF counter IS

 SUBTYPE T_COUNT_640 IS integer RANGE 639 DOWNTO 0;
 SIGNAL count_q : t_count_640 := T_COUNT_640'high;
 --
 SIGNAL overflow : std_logic;

BEGIN  -- behave

  PROCESS(clk_i)
  BEGIN
    IF rising_edge(clk_i) THEN
      IF overflow = '1' THEN
        count_q <= t_count_640'high;
      ELSE
        count_q <= count_q - 1;
      END IF;
    END IF;
  END PROCESS;
    overflow <= '1' WHEN count_q = T_COUNT_640'low ELSE '0';

  tick_o <= overflow;
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

Autor: savo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So lange overflow wieder synchron abgefragt wird, ist alles i.O.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, habs verstanden, danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.