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.