Gast
#458156
library ieee;
use ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
entity UHR_3 is
port (
clk : in std_logic;
reset : in std_logic;
AN0,AN1,AN2,AN3: inout std_logic; -- 4 schalter
I1,I2,I3,I4:in std_logic;
d1a,d1b,d1c,d1d,d1e,d1f,d1g:out std_logic
);
end;
architecture UHR_3_behav of UHR_3 is
signal CTR : STD_LOGIC_VECTOR(12 downto 0);
SIGNAL seconds: integer range 9 downto 0 :=0;
SIGNAL ten_sec: integer range 9 downto 0 :=0;
SIGNAL minutes: integer range 9 downto 0 :=0;
SIGNAL ten_min: integer range 9 downto 0 :=0;
SIGNAL hours: integer range 9 downto 0 :=0;
SIGNAL ten_hrs: integer range 9 downto 0 :=0;
SIGNAL disp1 : std_logic_vector (6 downto 0); -- displ. D1
SIGNAL disp2 : std_logic_vector (6 downto 0); -- displ. D2
SIGNAL disp3 : std_logic_vector (6 downto 0); -- displ. D3
SIGNAL disp4 : std_logic_vector (6 downto 0); -- displ. D4
begin
display1: process (reset,clk,I1,I2,I3,I4)
begin
IF (reset = '1') THEN
seconds <= 0;
ten_sec <= 0;
minutes <= 0;
ten_min <= 0;
hours <= 0;
ten_hrs <= 0;
elsIF (clk'event AND clk = '1') THEN
IF (I1 = '1') THEN
IF (ten_hrs = 2) THEN ten_hrs <= 0;
ELSE ten_hrs <= ten_hrs + 1;
END IF;
ELSIF (I2 = '1') THEN
IF (hours = 9) THEN hours <= 0;
ELSE hours <= hours + 1;
END IF;
ELSIF (I3 = '1') THEN
IF (ten_min = 5) THEN ten_min <= 0;
ELSE ten_min <= ten_min + 1;
END IF;
ELSIF (I4 = '1') THEN
IF (minutes = 9) THEN minutes <= 0;
ELSE minutes <= minutes + 1;
END IF;
-- IF 23:59:59
ELSIF ((ten_hrs = 2) AND (hours = 3) AND (ten_min = 5) AND (minutes = 9)
AND (ten_sec = 5) AND (seconds = 9)) THEN
seconds <= 0;
ten_sec <= 0;
minutes <= 0;
ten_min <= 0;
hours <= 0;
ten_hrs <= 0;
-- IF x9:59:59
ELSIF ((hours = 9) AND (ten_min = 5) AND (minutes = 9) AND (ten_sec = 5)
AND (seconds = 9)) THEN
seconds <= 0;
ten_sec <= 0;
minutes <= 0;
ten_min <= 0;
hours <= 0;
ten_hrs <= ten_hrs + 1;
-- IF xx:59:59
ELSIF ((ten_min = 5) AND (minutes = 9) AND (ten_sec = 5) AND (seconds =
9)) THEN
seconds <= 0;
ten_sec <= 0;
minutes <= 0;
ten_min <= 0;
hours <= hours + 1;
-- IF xx:x9:59
ELSIF ((minutes = 9) AND (ten_sec = 5) AND (seconds = 9)) THEN
seconds <= 0;
ten_sec <= 0;
minutes <= 0;
ten_min <= ten_min + 1;
-- IF xx:xx:59
ELSIF ((ten_sec = 5) AND (seconds = 9)) THEN
seconds <= 0;
ten_sec <= 0;
minutes <= minutes + 1;
-- IF xx:xx:x9
ELSIF (seconds = 9) THEN
seconds <= 0;
ten_sec <= ten_sec + 1;
ELSE seconds <= seconds + 1;
END IF;
END IF;
end process display1;
--desplay
led: process (clk)
begin
IF (clk'event and clk = '0') THEN
IF (ten_hrs = 0) THEN disp1 <= "1000000";
ELSIF (ten_hrs = 1) THEN disp1 <= "1111001";
ELSIF (ten_hrs = 2) THEN disp1 <= "0100100";
END IF;
IF (hours = 0) THEN disp2 <= "1000000";
ELSIF (hours = 1) THEN disp2 <= "1111001";
ELSIF (hours = 2) THEN disp2 <= "0100100";
ELSIF (hours = 3) THEN disp2 <= "0110000" ;
ELSIF (hours = 4) THEN disp2 <= "0011001";
ELSIF (hours = 5) THEN disp2 <= "0010010";
ELSIF (hours = 6) THEN disp2 <= "0000010";
ELSIF (hours = 7) THEN disp2 <= "1111000";
ELSIF (hours = 8) THEN disp2 <= "0000000" ;
ELSIF (hours = 9) THEN disp2 <= "0010000";
END IF;
IF (ten_min = 0) THEN disp3 <= "1000000";
ELSIF (ten_min = 1) THEN disp3 <= "1111001";
ELSIF (ten_min = 2) THEN disp3 <= "0100100";
ELSIF (ten_min = 3) THEN disp3 <= "0110000" ;
ELSIF (ten_min = 4) THEN disp3 <= "0011001";
ELSIF (ten_min = 5) THEN disp3 <= "0010010";
ELSIF (ten_min = 6) THEN disp3 <= "0000010";
ELSIF (ten_min = 7) THEN disp3 <= "1111000" ;
ELSIF (ten_min = 8) THEN disp3 <= "0000000" ;
ELSIF (ten_min = 9) THEN disp3 <= "0010000";
END IF;
IF (minutes = 0) THEN disp4 <= "1000000";
ELSIF (minutes = 1) THEN disp4 <= "1111001";
ELSIF (minutes = 2) THEN disp4 <= "0100100";
ELSIF (minutes = 3) THEN disp4 <= "0110000" ;
ELSIF (minutes = 4) THEN disp4 <= "0011001";
ELSIF (minutes = 5) THEN disp4 <= "0010010";
ELSIF (minutes = 6) THEN disp4 <= "0000010";
ELSIF (minutes = 7) THEN disp4 <= "1111000";
ELSIF (minutes = 8) THEN disp4 <= "0000000";
ELSIF (minutes = 9) THEN disp4 <= "0010000";
END IF;
END IF;
end process led;
q:Process (CLK,AN0,AN1,AN2,AN3)
begin
if (CLK'event and CLK = '1') then
if (CTR="0000000000000") then
if (AN0='0') then
AN0 <= '1';
d1a <= disp3(0);
d1b <= disp3(1);
d1c <= disp3(2);
d1d <= disp3(3);
d1e <= disp3(4);
d1f <= disp3(5);
d1g <= disp3(6);
AN1 <= '0';
elsif (AN1='0') then
AN1 <= '1';
d1a <= disp2(0);
d1b <= disp2(1);
d1c <= disp2(2);
d1d <= disp2(3);
d1e <= disp2(4);
d1f <= disp2(5);
d1g <= disp2(6);
AN2 <= '0';
elsif (AN2='0') then
AN2 <= '1';
d1a <= disp1(0);
d1b <= disp1(1);
d1c <= disp1(2);
d1d <= disp1(3);
d1e <= disp1(4);
d1f <= disp1(5);
d1g <= disp1(6);
AN3 <= '0';
elsif (AN3='0') then
AN3 <= '1';
d1a <= disp4(0);
d1b <= disp4(1);
d1c <= disp4(2);
d1d <= disp4(3);
d1e <= disp4(4);
d1f <= disp4(5);
d1g <= disp4(6);
AN0 <= '0';
end if;
end if;
CTR<=CTR+"0000000000001";
if (CTR > "1000000000000") then -- counter reaches 2^13
CTR<="0000000000000";
end if;
end if; -- CLK'event and CLK = '1'
End Process q;
end UHR_3_behav;
Ich bin Anfänger in VHDL und ich möchte eine Uhr in Spartan 3 testen (7
Segment) aber leider hat es nicht funktioniert weil ich bis jetzt nicht
die Steuerung von 7 Segment(spartan3) verstanden habe.
zu dem Programm oben gehört noch ein Frequenzteiler.
kann mir jemanden Bitte helfen das Programm zu korrigieren, damit ich
auf Sparten 3 teste und dabei natürlich auch lernen.
ich bin noch offen für fragen oder noch kommentare.