Счетчик вверх / вниз с кнопкой pu sh - PullRequest
0 голосов
/ 19 марта 2020

Я пишу таймер, используя FPGA .

. Я буду использовать семисегментный дисплей для отображения чисел, но я также должен иметь возможность установить определенное время c увеличивая / уменьшая, а затем, после установки, с помощью другой кнопки часы начнут опускаться на go.

signal lock - для предотвращения увеличения счета со скоростью

manual - это кнопка,

Я считаю, что с подсчетом все в порядке, но проблема в том, когда я хочу, чтобы go снизился. В симуляции, когда я ставлю sentido HIGH, тогда я ничего не получаю и не работает.

library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
port(   clck, reset : in std_logic;
        limit   : in integer range 0 to 10;
        manual: inout std_logic;
        sentido: in std_logic;
        bitcount : out std_logic_vector(3 downto 0);
        clckout : out std_logic);
end counter;

architecture behavior of counter is
signal Cs : std_logic_vector(3 downto 0):="0000";
signal lock: std_logic;
begin   
Count : process(clck,reset,manual,lock,sentido)
    begin

            if(rising_edge(clck))then
             if (manual='0' and lock ='0') then
                      Cs<=Cs+1;
                       lock<='1';
             elsif(manual='1' and lock='1' ) then        
                     lock<='1';
             else
                     lock<='0';

                    end if; 
                    end if;

    if sentido = '1' then
                 Cs<=Cs-1;
                    end if;

            if (reset = '1') then
                    Cs <="0000";
                end if;
                if (Cs = "1010") then
                      Cs <= "0000";
                end if;
end process Count;
bitcount <=Cs;

end behavior;

1 Ответ

0 голосов
/ 23 марта 2020

Ваше предложение

if sentido = '1'

является асинхронным, оно работает полностью независимо от часов. Это не может быть синхронизировано в большинстве инструментов, но может проходить через проверки симулятора.

То же самое относится ко всем приведенным ниже условиям.

Чтобы исправить это, вы должны объединить их все в if(rising_edge(clck)) пункт вроде этого:

if(rising_edge(clck))then
        if (reset = '1') then
            Cs <="0000";
        elsif (manual='0' and lock ='0') then
            if sentido = '1' then
                Cs<=Cs-1;
                if (Cs = "0000") then --using previous state
                    Cs <= "1010";
                end if;
            else
                Cs<=Cs+1;
                if (Cs = "1001") then --using previous state
                    Cs <= "0000";
                end if;
            end if;
            lock<='1';
        elsif(manual='1' and lock='1' ) then        
            lock<='1';
        else
            lock<='0';
        end if; 
    end if;

О, и еще одна вещь. Вы не должны включать ничего, кроме часов, в syn c список чувствительности процесса, он все равно изменит только часы.

...