www.mikrocontroller.net

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


Autor: Mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity counter is
    Port ( CLOCK  : in std_logic;
           Teiler : in std_logic_vector(3 downto 0);
           Takt   : out std_logic);
end counter;

architecture Behavioral of counter is

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

begin

  process (Teiler)
  begin
    case Teiler is
      when "0001" => teiler_faktor <= "0110001111"; --50kHz
      when "0010" => teiler_faktor <= "0011000111"; --100kHz
      when "0011" => teiler_faktor <= "0001100011"; --200kHz
      when "0100" => teiler_faktor <= "0000100111"; --500kHz
      when "0101" => teiler_faktor <= "0000010011"; --1MHz
      when "0110" => teiler_faktor <= "0000001001"; --2MHz
      when "0111" => teiler_faktor <= "0000000011"; --5MHz
      when "1000" => teiler_faktor <= "0000000001"; --10MHz
      when others => teiler_faktor <= "0000000000"; --50kHz und default
    end case;
  end process;
  
  process (CLOCK)
  begin
    if CLOCK='1' and CLOCK'event then    
   
      if Teiler > "0000000000" then
      
        if count_val > "0000000000" then
          count_val<= count_val-1;
        else
          count_val <= teiler_faktor;
          s_takt<= not s_takt;    
        end if;
      end if;
  end if;
   
  end process;
  
  Takt <= s_takt;

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

Autor: D. I. (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Mani (Gast)
Datum:

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

Autor: Mani (Gast)
Datum:

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

Autor: Der Besucher (Gast)
Datum:

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

Autor: bko (Gast)
Datum:

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

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@bko

Danke. Und wieder etwas gelernt :)

Der Besucher

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.