VHDL-не можете добавить номера? - PullRequest
0 голосов
/ 17 марта 2019

Здравствуйте! Я хочу построить часы на моем ALTERA DE2, для которых я могу настроить длину, нажимая клавиши. Теперь проблема в том, что когда я конвертирую из STD_LOGIC_VECTOR в UNSIGNED, код не работает:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--use ieee.std_logic_unsigned.all; Do not use with numeric_std

entity Adjust_Clock_4_buttens is

port(
    clk,clk1 : in STD_LOGIC;
    minutes_plus, minutes_minus,houres_plus,houres_minus : in STD_LOGIC;

    minutes : IN STD_LOGIC_VECTOR(5 downto 0);
    houres   : IN  STD_LOGIC_VECTOR(4 downto 0);

    output_minutes : out STD_LOGIC_VECTOR(5 downto 0);
    output_houres : out STD_LOGIC_VECTOR(4 downto 0);

    LED_0 : OUT STD_LOGIC;
    LED_1 : OUT STD_LOGIC;
    LED_2 : OUT STD_LOGIC;
    LED_3 : OUT STD_LOGIC

);
end entity Adjust_Clock_4_buttens ;

architecture behavioral of Adjust_Clock_4_buttens  is

    signal button1_r : std_logic_vector(2 downto 0);
    signal button2_r : std_logic_vector(2 downto 0);
     signal button3_r : std_logic_vector(2 downto 0);
     signal button4_r : std_logic_vector(2 downto 0);

--    signal minutes_total  : unsigned(5 downto 0) := (others => '0');
--   signal houres_total  : unsigned(4 downto 0) := (others => '0');

     signal minutes_total  : unsigned(5 downto 0);
     signal houres_total  : unsigned(4 downto 0);

begin

    process(clk)
    begin

        if (rising_edge(clk) )then

                minutes_total<=unsigned(minutes);
                houres_total<=unsigned(houres);   

                 -- Shift the value of button in button_r
            -- The LSB is unused and is there solely for metastability
            button1_r <= button1_r(button1_r'left-1 downto 0) & minutes_plus;
            button2_r <= button2_r(button2_r'left-1 downto 0) & minutes_minus;
                button3_r <= button3_r(button3_r'left-1 downto 0) & houres_plus;                
                button4_r <= button4_r(button4_r'left-1 downto 0) & houres_minus;   


            if button1_r(button1_r'left downto button1_r'left-1) = "01" then -- Button1 rising --button1_r[2:1]
                minutes_total <= (minutes_total + 1);
                     LED_0<='1';LED_1<='0';LED_2<='0';LED_3<='0';

            elsif button2_r(button2_r'left downto button2_r'left-1) = "01" then -- Button2 rising --button1_r[2:1]
               minutes_total <= (minutes_total-1 );
                    LED_0<='0';LED_1<='1';LED_2<='0';LED_3<='0';
            end if;


            if button3_r(button3_r'left downto button3_r'left-1) = "01" then -- Button1 rising --button1_r[2:1]
                houres_total <= (houres_total + 1);
                     LED_0<='0';LED_1<='0';LED_2<='1';LED_3<='0';

            elsif button4_r(button4_r'left downto button4_r'left-1) = "01" then -- Button2 rising --button1_r[2:1]
                houres_total<= (houres_total-1 );
                     LED_0<='0';LED_1<='0';LED_2<='0';LED_3<='1';
            end if;

        end if;

    end process;

     output_minutes <= std_logic_vector(minutes_total);
     output_houres <= std_logic_vector(houres_total);

end architecture behavioral ;

Таким образом, в этом коде я получаю время из другого блока, проблема запускается, когда я пытаюсь добавить минуты и часы и по какой-то причине не реагирует на нажатие клавиш. Может кто-нибудь объяснить, может быть, почему это?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Проблема может заключаться в том, что у вас есть только часы в списке чувствительности вашего процесса.Попробуйте добавить кнопки в список чувствительности, так как они влияют на ваши условия if.(Не уверен, что это проблема, но я думаю, стоит попробовать)

0 голосов
/ 17 марта 2019

minutes_total <= без знака (минуты); * * 1 001 находится на двух линиях, внутри и снаружи процесса, который генерирует драйверы с несколькими строками и не будет работать никогда! <br> (не читал остальную часть кода, могут быть другие проблемы, например, часы, не требующие е)

Теперь, когда он находится внутри процесса, вам нужно переименовать minutes_total в minute_source, иначе вы увеличиваете значение только для одного такта, когда у вас есть край кнопки!

...