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
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; |
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
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
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.:)
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
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.