Forum: FPGA, VHDL & Co. Problem mit counter


von Mattias (Gast)


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

von T.M. (Gast)


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:
1
ENTITY count IS
2
  PORT
3
  (
4
    clock:     IN STD_LOGIC;
5
    rechteck:  OUT std_logic; 
6
END count;
7
8
9
ARCHITECTURE Behavioral OF count IS
10
  SIGNAL result_reg : std_logic_vector (2 downto 0);
11
BEGIN
12
  PROCESS (clock)
13
  BEGIN
14
    IF (clock'event AND clock = '1') THEN
15
      result_reg <= result_reg + 1;
16
    END IF;
17
  END PROCESS;
18
  rechteck <= result_reg(2);
19
END Behavioral;

von Kest (Gast)


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

von Mattias (Gast)


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

von segundo (Gast)


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.:)

von Klaus F. (kfalser)


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

von Mattias (Gast)


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

von Klaus F. (kfalser)


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

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.