2016-09-08 2 views
0

В настоящее время я немного смущен про свой простой счетчик. Это реализуется следующим образом:Простой VHDL счетчик времени счётчика путаницы

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

entity simple_counter is 
    port( 
     DOUT : out std_logic_vector(3 downto 0); 
     CE : in std_logic; 
     CLK : in std_logic; 
     RSTN : in std_logic 
    ); 
end simple_counter; 

architecture behavioral of simple_counter is 
    signal temp : unsigned(3 downto 0); 

begin 

    process(CLK) 
    begin 
     if RSTN = '0' then 
      temp <= (others => '0'); 
     elsif(rising_edge(CLK)) then 
      if CE = '1' then 
       if std_logic_vector(temp) = (temp'range => '1') then 
        temp <= (others => '0'); 
       else 
        temp <= temp + 1; 
       end if; 
      end if; 
     end if; 
    end process; 

    DOUT <= std_logic_vector(temp); 

end behavioral; 

Я использую следующий испытательный стенд для моделирования:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
library std; 
use std.textio.all; 

use work.tools_pkg.all; 

library work; 

--! @class tools_tb 
--! @brief Test bench for the tools_tb design 
entity counter_tb is 
    generic (
    VOID : integer := 0); 
    port (
    void_i : in std_logic); 
end entity counter_tb; 

--! @brief 
--! @details 
architecture sim of counter_tb is 

    -- Clock period definitions 
    -- Clock, reset and baud rate definitions 
    constant CLK_FREQ : integer := 100_000_000; 
    constant clk_period : time  := (1.0/real(CLK_FREQ)) * (1 sec); 
    signal end_sim   : boolean := false; 

    signal rstn    : std_logic; 
    signal clk    : std_logic; 
    signal s_en    : std_logic := '0'; 

    ------------------------------------------------------------------------------ 
    -- DUT signals 
    ------------------------------------------------------------------------------ 

    signal s_dout  : std_logic_vector(3 downto 0) := (others => '0'); 
    signal s_ce   : std_logic := '0'; 

begin -- architecture 


    fifo : entity work.simple_counter 
    port map (
     DOUT => s_dout, 
     CE => s_ce, 
     RSTN => rstn, 
     CLK => clk 
    ); 


    -- Clock process definitions (clock with 50% duty cycle is generated here). 
    clk_process : process 
    begin 
     if end_sim = false then 
      clk <= '1'; 
      wait for clk_period/2; 
      clk <= '0'; 
      wait for clk_period/2; 
     else 
      wait; 
     end if; 
    end process; 

    -- Stimulus process 
    stim_proc: process 
    begin 
     -- startup and wait for some time 
     rstn <= '0'; 
     wait for clk_period; 
     rstn <= '1'; 
     wait for clk_period; 
     wait for clk_period; 
     wait for clk_period; 

     s_ce <= '1'; 

     wait; 
    end process; 

end architecture sim; 

Я смущен, почему счетчик увеличивается мгновенно, когда я установил CE <= '1 (см прилагаемого моделирования). enter image description here Поскольку счетчик реализован в синхронном процессе, не должен ли он принимать один такт, пока он не будет увеличен с '0' до '1'?

Большое спасибо!

ответ

0

У вас, скорее всего, есть состояние гонки между s_ce и clk. Если вы создадите s_ce на переднем фронте clk, вы должны увидеть, что счетчик работает правильно.

Я не знаю, что это симулятор, но проверить гонки вы можете расширить дельт когда счетчик изменяет 0-> 1

+0

спасибо много! Если я изменю 'wait clk_period;' в tesbench, '' wait until rising_edge (CLK); 'счетчик работает так, как ожидалось! – Apoptose

+0

Если вы не использовали свой ответ, вы могли бы дать свой собственный ответ, вместо того чтобы принять его. – user1155120