Forum: FPGA, VHDL & Co. Optimierung möglich?


von Mani (Gast)


Lesenswert?

Hallo,

habe für ein Projekt einen einstellbaren Frequenzteiler geschrieben.
Am Anfang hatte ich etwas Platzprobleme.
Nach einigen GUTEN TIPPS von anderen Beiträgen hier im Forum bin ich mir 
am überlegen was man noch machen könnte um weniger Ressourcen und damit 
Strom zu verbraten (es handelt sich um ein Batteriegerät).

Hier der Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity counter is
8
    Port ( CLOCK  : in std_logic;
9
           Teiler : in std_logic_vector(3 downto 0);
10
           Takt   : out std_logic);
11
end counter;
12
13
architecture Behavioral of counter is
14
15
            
16
  signal count_val : std_logic_vector(9 downto 0)   := (others=>'0');
17
  signal teiler_faktor : std_logic_vector(9 downto 0) := (others=>'0');
18
  signal s_takt    : std_logic                    := '0';
19
20
begin
21
22
  process (Teiler)
23
  begin
24
    case Teiler is
25
      when "0001" => teiler_faktor <= "0110001111"; --50kHz
26
      when "0010" => teiler_faktor <= "0011000111"; --100kHz
27
      when "0011" => teiler_faktor <= "0001100011"; --200kHz
28
      when "0100" => teiler_faktor <= "0000100111"; --500kHz
29
      when "0101" => teiler_faktor <= "0000010011"; --1MHz
30
      when "0110" => teiler_faktor <= "0000001001"; --2MHz
31
      when "0111" => teiler_faktor <= "0000000011"; --5MHz
32
      when "1000" => teiler_faktor <= "0000000001"; --10MHz
33
      when others => teiler_faktor <= "0000000000"; --50kHz und default
34
    end case;
35
  end process;
36
  
37
  process (CLOCK)
38
  begin
39
    if CLOCK='1' and CLOCK'event then    
40
   
41
      if Teiler > "0000000000" then
42
      
43
        if count_val > "0000000000" then
44
          count_val<= count_val-1;
45
        else
46
          count_val <= teiler_faktor;
47
          s_takt<= not s_takt;    
48
        end if;
49
      end if;
50
  end if;
51
   
52
  end process;
53
  
54
  Takt <= s_takt;
55
56
End Behavioral;

Für ein paar Vorschläge wäre ich euch dankbar.

Gruß Mani

PS: Ich habe mich seit langem mal wieder mit VDHL beschäftigt...nehmt 
mich deshalb nicht gleich auseinander :-D

von D. I. (Gast)


Lesenswert?

ich würde das über ein generic lösen wo man den Faktor angibt und darauf 
entsprechend den Counter aufbauen

von Jan M. (mueschel)


Lesenswert?

An deinem Code laesst sich nicht viel optimieren, der ist so vollkommen 
in Ordnung.

Denke aber daran, den hiermit erzeugten Takt nur mit sehr viel Vorsicht 
(lies: besser nicht) zum Takten von Logik im FPGA zu benutzen.
Wenn du das tun moechtest, benutze entweder eine PLL/DCM/DLL oder 
arbeite mit einem Clock-Enable Signal.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das passt irgendwie nicht ganz zusammen:
1
    :
2
           Teiler : in std_logic_vector(3 downto 0);
3
    :
4
      if Teiler > "0000000000" then
5
    :
Zudem ist dadurch der Zustand deines Taktausgangs undefiniert, wenn 
irgendwann auf Teiler="0000" umgeschaltet wird.

Schmeiß doch die ganze Ecke mit dem
1
  
2
   if Teiler > "0000000000" then
raus, und mach das kombinatorisch:
1
Takt <= s_takt when Teiler > "0000" else '0';

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ... besser nicht zum Takten von Logik im FPGA zu benutzen.
Ich glaube nicht, dass das in ein FPGA kommt ...
>> Am Anfang hatte ich etwas Platzprobleme.
... denn dort ist Platz genug für so einen Zähler.   ;-)

von Mani (Gast)


Lesenswert?

Hallo,

danke erst mal für die vielen Antworten.

@Christopher D:
Muss mir dass erst nochmal durchlesen. Wie gesagt, ist schon eine Weile 
her.
Weis gerade nichts mehr damit anzufangen.

@ Jan M:
Der erzeugte Takt soll nicht als Takt für einen FPGA oder ähnliches 
dienen.
Ist nur als Frequenzerzeugung für einen Kammgenerator gedacht.

@Lothar Miller:
Stimmt die eine Zeile mit den 10Bit ist wirklich Mist.
Kommt wahrscheinlich durch Copy/Paste :-D
Zu deinem Vorschlag die IF Anweisung rauszuwerden und es kombinatorisch 
zu machen habe ich noch eine Frage. Durch die Änderung benötige ich zwar 
um einiges weniger Pterms, dafür aber eine Makrozelle mehr.
Nun die Frage: Der Stromverbrauch richtet sich doch nach den 
Makrozellen, oder spielen die Verwendeten Gatter auch ne Rolle?

Gruß Mani

von Mani (Gast)


Lesenswert?

@Lothar Miller:
Ok...habs mir aber gerade nochmal durch den Kopf gehen lassen.
Die eine Makrozelle braucht weniger Strom als wenn der Ausgang 
fälschlicher Weise ständig auf High liegt.

von Der Besucher (Gast)


Lesenswert?

Hallo,

kleine Anmerkung:

  signal count_val : std_logic_vector(9 downto 0)   := (others=>'0');
  signal s_takt    : std_logic                    := '0';

Dir ist sicherlich klar, das die zugewiesenen Default-Werte nur in einer 
Simulation verwendet werden.
Besonders s_takt und count_val werden nach dem Power-On in einem 
zufälligen Zustand sein. Aber sicherlich hab so wild bei deinem 
Vorhaben.


Anstatt Teiler > "0000" probiere mal Teiler /= "0000", wenn man mit 
std_logic_vectors arbeitet. Kannst ja mal ausprobieren, ob das bei 
deinem Synthesetool was bringt.
Auch mal count_val > "0000000000" mit count_val /= "0000000000" 
ersetzen.


Warum hat count_val 10 Bit? 9 reichen doch auch...


when others => teiler_faktor <= "0000000000"; --50kHz und default
Meinst bestimmt 50MHz?


Wenns du noch etwas Strom sparen willst, könntest du auch darüber 
nachdenken den Frequenzteiler asynchron aufzubauen.

Der Besucher

von bko (Gast)


Lesenswert?

@Der Besucher
>Dir ist sicherlich klar, das die zugewiesenen Default-Werte nur in einer
>Simulation verwendet werden.

Wenn Mani einen festprogrammierten Baustein (z.B. CPLD oder ProAsic)
verwendet stimmt das.

Aber nicht wenn es sich um RAM-Basierte FPGAs handelt, siehe:

>Xilinx und die Resets<
Beitrag "Xilinx und die Resets"

von Der Besucher (Gast)


Lesenswert?

@bko

Danke. Und wieder etwas gelernt :)

Der Besucher

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
Noch kein Account? Hier anmelden.