|
|
|
Anfang
zurück
weiter
Ende
|
Autor |
Beitrag |
Böserkater
Gast
|
Erstellt: 17.05.10, 14:34 Betreff: Zähler ... Takt ... und Co!
drucken
Thema drucken weiterempfehlen
|
|
|
So,
ich habe bis Ende des Sommers eine Prüfungsaufgabe mittels VHDL und Quartus II zu lösen - es soll eine digitale Weckuhr rauskommen.
Jetzt hänge ich hier da und irgendwie funktioniert garnichts.
Ich hänge mal meinen VHDL-Code ran, in der Hoffnung mir kann jemand helfen (sorry - ist schon ziemlich verbastelt).
Wie man erkennen kann, soll es ein 4bit-Synchron-Zähler sein, der von 0-15,0 zählt.
Problem: Der Zähler zählt garnichts - irgendwie geht mit dem Ding nichts. Nehme ich den "CLK"-Teil (NICHT den clk1s-Teil) raus, dann bekomme ich zwar was an den Ausgängen (a-d) zu sehen - aber das hat rein garnichts mit einem Zähler zu tun, da kommt irgendwas lustig verwurschteltes raus.
Hilfe ?!
-- Generated by Quartus II Version 9.0 (Build Build 132 02/25/2009) -- Created on Sun May 09 21:17:32 2010
LIBRARY ieee; USE ieee.std_logic_1164.all;
-- Entity Declaration
ENTITY dec_sekunden IS -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT ( clk1s : in std_logic; reset : in std_logic; a : out std_logic; b : out std_logic; c : out std_logic; d : out std_logic ); -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END dec_sekunden;
-- Architecture Body
architecture dec_sekunden_architecture of dec_sekunden is -- Build an enumerated type for the state machine type state_type is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15); -- Register to hold the current state signal state: state_type; signal clk: integer range 0 to 100;
begin -- Logic to advance to the next state process (clk1s, reset, state, clk) begin if reset = '1' then state <= s0; clk <= 0; end if; if clk < 100 then clk <= clk+1; end if; if clk > 99 and clk1s = '1' then case state is when s0 => state <= s1; when s1 => state <= s2; when s2 => state <= s3; when s3 => state <= s4; when s4 => state <= s5; when s5 => state <= s6; when s6=> state <= s7; when s7=> state <= s8; when s8=> state <= s9; when s9 => state <= s10; when s10 => state <= s11; when s11 => state <= s12; when s12=> state <= s13; when s13=> state <= s14; when s14=> state <= s15; when s15 => state <= s0; end case; end if; end process;
-- Output depends solely on the current state process (state) begin case state is when s0 => -- dec 0 a <= '0'; b <= '0'; c <= '0'; -- d <= '0'; when s1 => -- dec 1 a <= '0'; b <= '0'; c <= '0'; d <= '1'; when s2 => -- dec 2 a <= '0'; b <= '0'; c <= '1'; d <= '0'; when s3 => -- dec 3 a <= '0'; b <= '0'; c <= '1'; d <= '1'; when s4 => -- dec 4 a <= '0'; b <= '1'; c <= '0'; d <= '0'; when s5 => -- dec 5 a <= '0'; b <= '1'; c <= '0'; d <= '1'; when s6 => -- dec 6 a <= '0'; b <= '1'; c <= '1'; d <= '0'; when s7 => -- dec 7 a <= '0'; b <= '1'; c <= '1'; d <= '1'; when s8 => -- dec 8 a <= '1'; b <= '0'; c <= '0'; d <= '0'; when s9 => -- dec 9 a <= '1'; b <= '0'; c <= '0'; d <= '1'; when s10 => -- dec 10 a <= '1'; b <= '0'; c <= '1'; d <= '0'; when s11 => -- dec 11 a <= '1'; b <= '0'; c <= '1'; d <= '1'; when s12 => -- dec 12 a <= '1'; b <= '1'; c <= '0'; d <= '0'; when s13 => -- dec 13 a <= '1'; b <= '1'; c <= '0'; d <= '1'; when s14 => -- dec 14 a <= '1'; b <= '1'; c <= '1'; d <= '0'; when s15 => -- dec 15 a <= '1'; b <= '1'; c <= '1'; d <= '1'; end case; end process;
end dec_sekunden_architecture;
|
|
nach oben |
|
|
K.
Gast
|
Erstellt: 17.05.10, 17:04 Betreff: Re: Zähler ... Takt ... und Co!
drucken
weiterempfehlen
|
|
|
Hi,
soll der Prozess mit dem State getaktet sein?
Also ich schreib meine Prozesse immer so:
process(clock,reset) begin if reset then state <= s0; elsif clock'event and clock='1' then --hier kommen dann die Zuweisungen für state ... end if; end process;
Schau mal ob dir das weiterhilft.
Gruss,
K.
|
|
nach oben |
|
|
mietzekater
Gast
|
Erstellt: 17.05.10, 17:09 Betreff: Re: Zähler ... Takt ... und Co!
drucken
weiterempfehlen
|
|
|
Der Takt soll eigentlich nur von "clk1s" kommen. state sind die Zustände, welche beim nächsten Takt angenommen werden sollen.
Soll eine Art Uhr werden - die z.Z. jede Sekunde einen Takt bekommen soll und erst dann, wenn sie Takt hat, schalten soll.
Dafür hat sie 2 Eingänge und 4 Ausgänge - der Rest ist dann eben das VHDL-Blöcklein, was die Ausgänge abhängig von den Eingängen und dem inneren Zustand (state) schalten soll.
|
|
nach oben |
|
|
Gast
|
Erstellt: 21.05.10, 15:09 Betreff: Re: Zähler ... Takt ... und Co!
drucken
weiterempfehlen
|
|
|
Das ist vom Prinzip her auch ok, allerdings wie gesagt, Prozesse bedürfen einer bestimmten Form:
> process (clk1s, reset, state, clk) begin > if reset = '1' then > state <= s0; > clk <= 0; > end if; > if clk < 100 then > clk <= clk+1; > end if; > if clk > 99 and clk1s = '1' then > case state is > when s0 => > state <= s1; > when s1 => > state <= s2;
geht aus meiner einfach Sicht nicht!
Sondern:
process begin If reset -- resetwerte ... elsif clock'event --Funktion, Statevector, update der ganzen register end if end process
Kannst das ganze auch mit synchronem reset machen
if clock'event then if reset --sync reset else -- Funktion end if end process
In der Sensitivityliste stehen dann auch nur Clock&Reset bzw nur Clock.
|
|
nach oben |
|
|
|
powered by carookee.com - eigenes profi-forum kostenlos
Design © trevorj
|