VHDL-Forum - Anfänger

Zähler ... Takt ... und Co!

Zähler ... Takt ... und Co!

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;

Re: Zähler ... Takt ... und Co!

Hi,

soll der Prozess mit dem State getaktet sein?

Also ich schreib meine Prozesse immer so:

process(clock,reset)
begin
if reset then
state

Re: Zähler ... Takt ... und Co!

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.

Re: Zähler ... Takt ... und Co!

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 clk end if;
> if clk < 100 then
> clk end if;
> if clk > 99 and clk1s = '1' then
> case state is
> when s0 =>
> state when s1 =>
> state