VHDL Проблема с часами при создании счетчика по модулю 16 - PullRequest
0 голосов
/ 23 сентября 2018

Я создал этот простой счетчик mod16, используя плату basys3, и что-то не так с моими часами.Сам код работает, однако один отсчет (с «1» на «2» и т. Д.) Длится 40 секунд вместо 1 секунды!Я попытался понизить "clk_vector", если условие до 1, но это тоже не помогло.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mod_16_k is
    Port ( switch : in STD_LOGIC_VECTOR (3 downto 0);
           CLK1 : in STD_LOGIC;
           reset : in STD_LOGIC;
           led : out STD_LOGIC_VECTOR (15 downto 0));
end mod_16_k;
architecture Behavioral of mod_16_k is

signal      clk_vector   :integer;
signal      clk_vec2      :std_logic_vector(15 downto 0); 

begin
zegar_wew : process(CLK1)
begin

if(CLK1'event and CLK1 = '1')  then
    clk_vector <= clk_vector + 1;
        if(clk_vector = 100000000) then
            clk_vec2 <= std_logic_vector(unsigned(clk_vec2)  + 1);
        end if;
end if;
end process;
led <= clk_vec2;
end Behavioral;

.XDC строки для часов: enter image description here

Если мыпроверьте таблицу basys3, часы подключены к порту "W5".enter image description here

У вас есть идеи, в чем здесь проблема?Это может быть связано с обнаружением нарастающего фронта clk, однако все изменения (от 1 до 2 и т. Д.) Длятся ~ 40 секунд.

1 Ответ

0 голосов
/ 23 сентября 2018

Это потому, что вы забыли сбросить clk_vector, как только он достигнет 1 секунды.Поскольку это целое число, оно составляет 32 бита, поэтому будет считать 2 ^ 32 вместо 100000000.

Это должно работать:

If(CLK1'event and CLK1 = '1')  then
        if(clk_vector = 100000000-1) then
            clk_vector <= 0;
            clk_vec2 <= std_logic_vector(unsigned(clk_vec2)  + 1);
        else
                clk_vector <= clk_vector + 1;
        end if;
end if;

Кроме того, обратите внимание, что для подсчета 1 секунды вынужно считать до 100000000-1, начинаем считать с нуля!

...