我已经使用basys3板创建了这个简单的mod16计数器,但我的时钟不正确。代码本身确实有效,但是一个计数(从“ 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时钟行是:
如果我们查看basys3数据表,则时钟连接到“ W5”端口。
您有什么想法,这可能是什么问题?它可能与检测clk的上升沿有关,但是所有更改(从1到2等)持续约40秒。
答案 0 :(得分: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;
另外,请注意,要计数1秒,您需要计数到100000000-1
,我们将从零开始计数!