andy_vhdl
Registrierter Benutzer
Beiträge: 1
|
Erstellt: 25.10.10, 18:47 Betreff: Count down -zähler
drucken
weiterempfehlen
|
|
|
Nabend meine VHDL Freunde,
ich stehe am vor einen Problem welches ich einfach nicht gelöst bekomme. Das Program soll folgendes machen. Wir haben einen kaskadierbaren Zähler mit 2 Dezimalstellen. (99 -0) Er soll im sekunden Takt runterzählen. Sobald er die 0 erreicht hat sollen alle 8 Led's den eingestellten wert blinkend darstellen. Ansonsten soll der momentane Wert ausgegeben werden. Könnt ihr mir vielleicht sagen wo mein Denkfehler ist, oder habt ihr eine bessere Idee für die Umsetzung. Folgendes Bord nutze ich: Spartan 3a FPGA Starter Kit (Interner Takt 50MHZ)
Hier mein Program:
entity counter1 is Port ( CLOCK : in STD_LOGIC; BTN_SOUTH : in STD_LOGIC; -- Taste Start/Stop LED_LOW : out STD_LOGIC_VECTOR (3 downto 0); -- LEDs Einerstelle LED_HIGH : out STD_LOGIC_VECTOR (3 downto 0)); -- LEDs Zehnerstelle end counter1;
architecture Behavioral of counter1 is signal bcd_low : std_logic_vector (3 downto 0):="1001"; --Anfangswert Einerstelle signal bcd_high : std_logic_vector (3 downto 0):="0001"; --Anfangswert Zehnerstelle signal start : std_logic; signal co1 : std_logic; -- carry out Einerstelle signal divider_bcd : integer range 0 to 50000000; signal takt_1hz : std_logic; signal stop : std_logic;
type zuC is (G,H,I,J); -- Flankenerkennung SOUTH signal zu3, fzu3: zuC;
type zuD is (K,L,M); -- Start/Stop signal zu4, fzu4: zuD;
begin
------------------------------------------------------------------------------------ --Flankenerkennung_south ------------------------------------------------------------------------------------ Zustandsaktualisierung_2: process (CLOCK, stop) begin if stop = '0' then zu3 <= G; elsif CLOCK = '1' and CLOCK'event then zu3 <= fzu3; end if; end process Zustandsaktualisierung_2;
Flankenerkennung_start: process (BTN_SOUTH, zu3) begin case zu3 is when G => if BTN_SOUTH = '1' then fzu3 <= G; else fzu3 <= H; end if; start <= '0'; when H => if BTN_SOUTH = '1' then fzu3 <= I; else fzu3 <= H; end if; start <= '0'; when I => if BTN_SOUTH = '1' then fzu3 <= J; else fzu3 <= J; end if; start <= '1'; when J => if BTN_SOUTH = '0' then fzu3 <= J; else fzu3 <= G; end if; start <= '1'; end case; end process Flankenerkennung_start; -------------------------------------------------------------------------------------------- --Start-Stop -------------------------------------------------------------------------------------------- Zustandsaktualisierung_3: process (CLOCK, start) begin if start = '0' then zu4 <= K; elsif CLOCK = '1' and CLOCK'event then zu4 <= fzu4; end if; end process Zustandsaktualisierung_3;
start_stop: process (start, zu4) begin case zu4 is
when K => if start = '0' then fzu4 <= K; -- anfang else fzu4 <= L; end if; stop <= '0'; when L => if start = '0' then fzu4 <= L; -- start else fzu4 <= M; end if; stop <= '0'; when M => if start = '0' then fzu4 <= M; -- stop else fzu4 <= L; end if; stop <= '1'; end case; end process start_stop;
--------------------------------------------------------------------------------------------- -- 1 Hz Takt ---------------------------------------------------------------------------------------------
process(CLOCK) begin if (CLOCK'event and CLOCK = '1') then if divider_bcd = 0 then divider_bcd <= 50000000; takt_1hz <= not takt_1hz; else divider_bcd <= divider_bcd -1; end if; end if; end process; --------------------------------------------------------------------------------------------- -- Count-Down-Zaehler_Low ---------------------------------------------------------------------------------------------
counter_bcd_low: process (CLOCK, takt_1hz, start, bcd_low, stop)
begin if stop = '1' then bcd_low <= "0000"; elsif (CLOCK = '1' and CLOCK'event and takt_1hz='1') then if start ='0' then bcd_low <= bcd_low; else bcd_low <= bcd_low - 1; end if; end if; end process counter_bcd_low; --------------------------------------------------------------------------------------------- -- Count-Down-Zaehler_High --------------------------------------------------------------------------------------------- counter_bcd_high: process (CLOCK, co1, bcd_high, stop)
begin if stop = '1' then bcd_high <= "0000"; elsif(CLOCK'event and CLOCK = '1') then if co1 = '0' then bcd_high <= bcd_high; else bcd_high <= bcd_high - 1; end if; end if; end process counter_bcd_high; co1 <= '1' when bcd_low = 0 else '0'; --------------------------------------------------------------------------------------------- -- LED_blinken_low ---------------------------------------------------------------------------------------------
LED_LOW<=bcd_low ; LED_HIGH<=bcd_high;
end Behavioral;
Ich hoffe sehr das ihr mir da helfen könnt. Vielen Dank im vor raus
Gruß
Andy
|
|