最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

fpga - VHDL counter abnormal start - Stack Overflow

programmeradmin3浏览0评论

I would like to get an explanation or be directed to a specific literature to understand the behavior below. I am using Digilent NEXSYS-A7-100t with AMD Vivado. And running post-implementation timing simulation.

My vhdl code is here:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

entity sbs_counter is
    Port ( 
        CLK100MHZ : in std_logic;
        start : in std_logic;
        load : in std_logic;
        upper_limit : out std_logic;
        counter_out : out std_logic_vector(7 downto 0)
    );
end sbs_counter;

architecture Behavioral of sbs_counter is
    signal counter_in_int : std_logic_vector(7 downto 0);
    signal counter_out_int : std_logic_vector(7 downto 0) := x"00";
    signal upper_limit_int : std_logic;
begin
    counter_in_int <= x"04";
    counter_out <= counter_out_int;
    upper_limit <= upper_limit_int;
    process (CLK100MHZ) begin
        if rising_edge(CLK100MHZ) then
            if (load = '1') then
                 counter_out_int <= counter_in_int;
            elsif (start = '1') then
                counter_out_int <= counter_out_int + '1';
            end if;
        end if;
    end process;
    upper_limit_int <= counter_out_int(4);
end Behavioral;

my test-bench code is here:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sbs_counter_tb is
end sbs_counter_tb;

architecture Behavioral of sbs_counter_tb is
    component sbs_counter is
        Port ( 
            CLK100MHZ : in std_logic;
            start : in std_logic;
            load : in std_logic;
            upper_limit : out std_logic;
            counter_out : out std_logic_vector(7 downto 0)
        );
    end component;
    signal clk_int : std_logic;
    signal start_int : std_logic;
    signal load_int : std_logic;
    signal upper_limit_int : std_logic := '0';
    signal counter_out_int : std_logic_vector(7 downto 0);
begin
    DTU: sbs_counter port map (
        CLK100MHZ => clk_int,
        start => start_int,
        load => load_int,
        upper_limit => upper_limit_int,
        counter_out => counter_out_int
    );

    process
    begin
        clk_int <= '0';
        start_int <= '0';
        load_int <= '0';
        wait for 50 ns;
        
        clk_int <= '0';
        start_int <= '0';
        load_int <= '1';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '0';
        load_int <= '1';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '0';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;

        clk_int <= '1';
        start_int <= '1';
        load_int <= '0';
        wait for 50 ns;
        wait;
    end process;
end Behavioral;

This test-bench produces a normal behavior:

While when I reduce the clock cycle from 100ns to 10ns, the counter does not respond to clock signal for the first nine cycles and starts counting with the tenth cycle. You can see the counter didn't load the starting number and start counting at the tenth cycle. Why is that?

If I generate ten cycles before loading and start counting, the counter works directly Why the 10 cycles at the start of the test-bench is needed to get the counter loads and counts normally?

发布评论

评论列表(0)

  1. 暂无评论