创建模16计数器时VHDL时钟问题

don*_*sko 1 vhdl vivado

我使用basys3板创建了这个简单的mod16计数器,而且我的时钟不对.代码本身确实有效,但是一个计数(从"1"变为"2"等)持续40秒,而不是1秒!如果条件为1,我试图降低"clk_vector",但它也没有帮助.

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;
Run Code Online (Sandbox Code Playgroud)

时钟的.XDC行是: 在此输入图像描述

如果我们检查basys3数据表,时钟连接到"W5"端口. 在此输入图像描述

你知道吗,这里可能有什么问题?它可能与检测clk的上升沿有关,但是所有的变化(从1到2等)持续约40秒.

Jon*_*let 5

这是因为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;
Run Code Online (Sandbox Code Playgroud)

另外,请注意,要计算1秒,您需要计算100000000-1,我们从零开始计数!