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

创建模16计数器时出现VHDL时钟问题,vhdl,vivado,Vhdl,Vivado,我用basys3板创建了这个简单的mod16计数器,但我的时钟有点不对劲。代码本身确实有效,但是一次计数(从“1”变为“2”等)持续40秒,而不是1秒!我曾尝试将“clk_向量”if条件降低到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);

我用basys3板创建了这个简单的mod16计数器,但我的时钟有点不对劲。代码本身确实有效,但是一次计数(从“1”变为“2”等)持续40秒,而不是1秒!我曾尝试将“clk_向量”if条件降低到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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体mod_16_k为
端口(交换机:标准逻辑向量(3到0);
CLK1:标准逻辑中;
复位:在标准逻辑中;
led:输出标准逻辑向量(15到0);
完模16(k);
mod_16_k is的架构行为
信号clk_向量:整数;
信号时钟向量2:标准逻辑向量(15到0);
开始
zegar_wew:过程(CLK1)
开始
如果(CLK1'事件和CLK1='1'),则

clk_vector这是因为当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;
If(CLK1'事件和CLK1='1'),则
如果(clk_向量=100000000-1),则

clk_矢量检查本部分“开始zegar_wew:过程(CLK1)开始”。哪个管脚是您的内部时钟?W5就像在第二个光电检查示例中一样,您需要分配管脚输入和输出,您的变量“zegar_wew”被分配,但什么也不做。我的意思是。。“zegar_wew”是一个进程的名称,其主要参数是CLK1,它是std_逻辑类型中的变量。我正在检查进程参数的上升沿,如果它是真的,那么我正在处理架构中创建的信号。我真的不明白你所说的“分配但不做任何事情”是什么意思2^^32=4294967296值除以每秒100000000个时钟,在识别单个值时,每42.9秒给你一个事件。使用1秒钟的计数器。我在这里错了吗?vivado应该剪切所有超出提供范围的数据。是的,但代码中没有任何内容说明不使用32位,您正在对特定值进行比较。您应该使用
信号clk_向量约束整数:整数范围0到100000000-1。即使这样,它的计数也不会达到100000000-1,而是下一个二次方,因为其他位将被Vivado丢弃。