mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem mit counter


Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem.
Ich möchte mit einem CPLD (XC9572) eine Frequenz (1MHz) mit einem 3 bit
Zähler Teilen, um auf 125 kHz zu kommen. Die Frequenz muss natürlich
symetrisch sein. Leider ist die An-Zeit etwas länger, so dass etwas
mehr als 125 kHz rauskommen. Wie kann ich das umgehen ?

Den Ausgang vom Zähler (count) habe ich an mein Ausgansgsmodul
(rechteck_3bit) angebaut.
Das Ausgangssignal sieht etwa so aus:

___------____------____-----

Hier mein Code:

entity rechteck_3bit is
    Port ( inputs : in  std_logic_vector (2 downto 0);
           rechteck : out bit);
end rechteck_3bit;

architecture Behavioral of rechteck_3bit is
 begin
 process(inputs)
  begin
    case inputs is
    when "000" =>  rechteck <= '1';
    when "001" =>  rechteck <= '1';
    when "010" =>  rechteck <= '1';
    when "011" =>  rechteck <= '1';
    when "100" =>  rechteck <= '0';
    when "101" =>  rechteck <= '0';
    when "110" =>  rechteck <= '0';
    when "111" =>  rechteck <= '0';
    when others =>
    end case;
 end process;

ENTITY count IS
  PORT
  (
    clock:     IN STD_LOGIC;
    result:    OUT std_logic_vector (2 downto 0));
END count;


ARCHITECTURE Behavioral OF count IS
  SIGNAL result_reg : std_logic_vector (2 downto 0);
BEGIN
  PROCESS (clock)
  BEGIN
    IF (clock'event AND clock = '1') THEN
      result_reg <= result_reg + 1;
    END IF;
  END PROCESS;
  result <= result_reg;
END Behavioral;


Danke.

Mattias

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann keinen Fehler entdecken, aber einfacher ist es, wenn du einfach
das MSB des Countersignals als Ausganbg nimst, das toggelt so, wie du
das haben willst.

Ungefähr so:
ENTITY count IS
  PORT
  (
    clock:     IN STD_LOGIC;
    rechteck:  OUT std_logic; 
END count;


ARCHITECTURE Behavioral OF count IS
  SIGNAL result_reg : std_logic_vector (2 downto 0);
BEGIN
  PROCESS (clock)
  BEGIN
    IF (clock'event AND clock = '1') THEN
      result_reg <= result_reg + 1;
    END IF;
  END PROCESS;
  rechteck <= result_reg(2);
END Behavioral;

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Statemaschine hat 9 Zustände.

keine Ahnung, ich vermute mal, dass Du statt#

 when "111" =>  rechteck <= '0';
 when others =>
 end case;

einfach

  when others  =>  rechteck <= '0';
 end case;

schreiben solltest

Gruß

Kest

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das mit den 9 Zuständen ist wohl das Problem.
Ich habe jetzt geschrieben:

if(inputs = "000") then rechteck <= '1'; end if;
.
.
.

jetzt geht es.
Ich brauche das, weil ich ein 2. Signal um 90° verschoben auch haben
will.

Jetzt geht es. Vielen Dank.

Mattias

Autor: segundo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine andere Möglichkeit wäre auch zum Beispiel, einen Endwert zu wählen,
der deinen Pulsbreite entpricht. Mit einem Zähler wird dann der
Zählerstand zurückgesetzt wenn der Endwert erreicht ist.
So kann man ein Signal mit bielibige Frq erzeugen.:)

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 9. Zustand kann eigentlich nicht das Problem gewesen sein, weil Du
mit 3 Bits nur bis acht zählen kannst.

Ein paar Tipps :
- Verwende lieber den "unsigned" Typ zum Zählen, nicht
std_logic_vector.
  Du findest ihn im Package numeric_std.

- Dein ursprüngliches Programm ist eine potentielle Quelle von
Störimpulse an Ausgang rechteck. Du hast nämlich synchrone Ausgänge
deines Zähler, aber dann folgt eine kombinatorische Logik zur
"Berechnung" von rechteck. Beim Umschalten des Zählers ist der
Ausgang für einen gewisse Zeit nicht gültig, bis sich alle Gatter
eingeschwungen haben und der Ausgang wieder stabil ist. In dieser Zeit
kann das Signal alles mögliche machen, aber es hat sicher keine saubere
Flanke. Ein solches Signal darf man niemals direkt als Takt-Signal für
weitere Stufen verwenden.

Grüße
Klaus

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus,
das kann gut sein. Ich habe nämlich ab und zu einen komischen Effekt
beobachtet. Ich bin auch der Meinung, dass es manchmal funktionierte.
Jetzt, wo ich es mit if gelöst habe, treten keine Fehler auf. Ich werde
es aber mal mit den anderen Typ lösen. Ich hätte nicht gedacht, dass man
mit so etwas rechnen muss. Ich dachte, der Compiler wird schon dafür
sorgen, dass es nur gültige Werte innerhalb des Chips gibt. Das wirft
mich jetzt irgendwie aus der Bahn.

Gruß
Mattias

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler hat genau das gemacht, das Du gesagt hast.

Du musst vielleicht nur ein bischen lernen, daß Du nicht einen
Prozessor programmierst, sondern daß Du Hardware (= elektrische
Signale) entwirfst, auch wenn es mit VHDL ähnlich ausschaut.
Falls Du Xilinx WebPack verwendest, schau die die generierte Schaltung
an (RTL Viewer), dann kannst Du dir besser vorstellen was passiert.

Grüße
Klaus

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.