Quantcast
Channel: Altera Forums
Viewing all articles
Browse latest Browse all 19390

New to VHDL. . . and this error is adding years to my life!

$
0
0
Hello all. New to this forum, and will probably be more active since this stuff is not innate to me. Anyways, I am trying to make a stopwatch that has the following properties:

1. When you press KEY3, it will start
2. When you press KEY3 a second time, it will pause
3. When you press KEY3 a third time, it will reset and go back to step 1.
4. Any time pressing KEY0 will reset and stop the counter.

I keep getting an error that I do not know how to resolve:

Error (10028): Can't resolve multiple constant drivers for net "clock_1k" at lab2_4_new2.vhd(58)

I'm almost positive that it is something simple, but im getting frustrated with all this, so here I am!

Thanks in advance!

-Ron


Code:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.all;
 
ENTITY lab2_4_new2 IS
    PORT( CLOCK_50: IN std_logic;
            SW : IN std_logic_vector(3 DOWNTO 0);
            KEY: IN std_logic_vector(3 downto 0);
            HEX0, HEX1, HEX2, HEX3: OUT std_logic_vector(6 DOWNTO 0)
        );
END lab2_4_new2;
 
ARCHITECTURE  Counter of lab2_4_new2 IS 
    signal enable : std_logic; --filtered key(3) pushbutton signal
    signal clock_1k : std_logic; --internally generated 10KHz clock
    signal n0, n1, n2, n3: unsigned(3 downto 0); --five decimal digits
    signal buttonpress : std_logic;
    signal reset: std_logic;
   
        type state_type is (wait_for_press, wait_for_release1, Run, wait_for_release2, pause, wait_for_release3);
        signal state: state_type;
BEGIN
    ---------------------------------------------------------
    --The four decimal digits are declared as "unsigned" type
    --so the arithmetic operations can be easily described.
    --However, they must be converted to std_logic_vector
    --type before sending to "sevenseg" for further
    --conversion to 7-segment display patterns.
    ---------------------------------------------------------
    display0: entity work.sevenseg port map (std_logic_vector(n0), HEX0);
    display1: entity work.sevenseg port map (std_logic_vector(n1), HEX1);
    display2: entity work.sevenseg port map (std_logic_vector(n2), HEX2);
    display3: entity work.sevenseg port map (std_logic_vector(n3), HEX3);
   
    --------------------------------------------------------
    --The debounced circuit is used to "filtered" out
    --the bounces in the pushbutton signal
    --------------------------------------------------------
    pushbutton_debounce : entity work.debounce generic map(
      CYCLES => 16 )
    port map(
                pin => key(3),
                output => buttonpress,
                clock => clock_50
                );
 
    --------------------------------------------------------
    --Following circuit generates a 10KHz clock from the
    --input 50MHz. The signal clock_10k is initialized to
    --'0' and is flipped each time loopcount reaches 2500.
    --Thus, the cycle time of clock_10k is decided by
    --2*2500=5000; and thus clock_10k frequency is
    --50MHz/5000=10KHz.
    -------------------------------------------------------- 
    Clock_Gen_100Hz: PROCESS (clock_50, KEY(0))
        variable loopcount : integer range 0 to 2500000;
    BEGIN
        IF(KEY(0) = '0') THEN --KEY0 is the asynchronous reset button
            clock_1k <= '0';
            loopcount := 0;
        ELSIF(clock_50'event AND clock_50 = '1') THEN
            if(loopcount = 2499999) then
                loopcount := 0;
                clock_1k <= not clock_1k; --flip clock_10K
               
            else
                loopcount := loopcount + 1;
            end if;
        END IF;
    END PROCESS;
 
    --------------------------------------------------------
    --Following circuit runs on the 1KHz clock and thus
    --the fourth digit (n3) is updated once every second
    --The filtered key(3), "pause", is used to "enable"
    --this running counter. Note that key(3) is negative
    --logic meaning that when push key(3)='0' and when
    --release key(3)='1'. Thus the following design will
    --allow the counter to run only when key(3) is pressed.
    -------------------------------------------------------- 
    Running_counter: PROCESS(clock_1k, key(0))
    BEGIN
        IF(key(0) = '0') THEN --KEY0 is the asynchronous reset button
            n0 <= "0000";  -- reset the decimal number to "00000"
            n1 <= "0000";
            n2 <= "0000";
            n3 <= "0000";
        ELSIF(clock_1k'event AND clock_1k = '1') THEN
            if( enable = '1') then
            if(n0="1001") then --when n0=9, instead of inc n0 reset it to 0
                n0 <= "0000";
                if(n1="1001") then --when n1=9, instead of inc n1 reset it to 0
                    n1 <= "0000";
                    if(n2="1001") then
                        n2 <= "0000";
                        if(n3="1001") then
                            n3 <= "0000";
                        else
                            n3 <= n3 + 1;
                        end if;   
                    else
                        n2 <= n2 + 1;
                    end if;   
                else
                    n1 <= n1 + 1;  --when n1 /= 9, inc n1
                end if;
            else
                n0 <= n0 + 1; --when n0 /= 9, inc n0
            end if;
        end if;
        END IF;
       
    END PROCESS;
   
 
 
   
 
        FSM: Process(clock_1k, buttonpress, reset)
            BEGIN
                If (reset='1') then
                    clock_1k <= '0';
                    state <= wait_for_press;
               
--                IF(key(0) = '0') THEN
--                    reset <= '1';
--                    enable <= '0';
--                    state <= wait_for_press;
                elsif (clock_1k'event and clock_1k='1') then
                    case state is
                        when wait_for_press =>
                            if (buttonpress='0') then
                                reset <= '0';
                                enable <='1';
                                state <= wait_for_release1;
                            end if;
                        when wait_for_release1 =>
                            if (buttonpress='1') then
                                state <= Run;
                            end if;
                        when Run =>
                            if (buttonpress='0') then
                                enable <='0';
                                state <= wait_for_release2;
                            end if;
                        when wait_for_release2 =>
                            if (buttonpress='1') then
                                state <= pause;
                            end if;
                        when pause =>
                            if (buttonpress='0') then
                                reset <='1';
                                state <= wait_for_release3;
                            end if;
                        when wait_for_release3 =>
                            if (buttonpress='1') then
                                state <= wait_for_press;
                            end if;
                        when others =>
                            state <= wait_for_press;
                    end case;
                end if;
            end process;
end architecture;


Viewing all articles
Browse latest Browse all 19390

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>