Как сделать сброс счетчика, когда он достигнет определенного значения? - PullRequest
0 голосов
/ 23 января 2019

У меня есть этот код, который считает тактовые циклы между двумя асинхронными (и случайными) триггерными событиями.Я хочу остановить счетчик, если он достигнет значения 1200d и обнулится.Код предоставляется без моих попыток сброса счетчика.

Я пытался добавить (если счетчик достигает 1200, то счетчик должен быть обнулен) в процессе синхронизации, но безрезультатно.

Я моделирую с двумя случаями.Первый: у меня есть пара триггерных событий с 85 тактами между ними и вторая пара триггерных событий с 1500 тактами между ними.Во втором случае я хочу, чтобы счетчик остановился, когда он достигнет 1200, и вернулся к 0.

Я извиняюсь, но пока не могу опубликовать изображение своего моделирования. Заранее благодарен за любую помощь.

Модуль

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

entity main is
  Port ( clk : in  STD_LOGIC;
  trigger : in  STD_LOGIC;
  output : out  STD_LOGIC_VECTOR(11 DOWNTO 0)  );
end main;
architecture Behavioral of main is
signal counter : STD_LOGIC_VECTOR(11 DOWNTO 0) := "000000000000";
signal enable : STD_LOGIC:='0'; 
begin
  trigger_proc : process(trigger)  
    variable state : std_logic := '0';
    begin   
      if(falling_edge(trigger))then
        if(state = '0')then
          enable <= '1'; 
          state := '1';
        elsif(state = '1')then
          enable <= '0';
          state := '0';
        end if;
      end if;
    end process;
  counter_proc : process(clk)
    begin
      if(rising_edge(clk))then
        if(enable =  '1')then
          counter <= counter + "1"; 
        elsif(enable = '0'  )then
          counter <= "000000000000";
        end if; 
      end if;  
    end process;
  output <= counter;
end Behavioral;

и TEST BENCH

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY test IS
END test;
ARCHITECTURE behavior OF test IS 
  COMPONENT main
    PORT(
      clk : IN  std_logic;
      trigger : IN  std_logic;
      output : OUT  std_logic_vector(11 downto 0)
    );
  END COMPONENT;
  signal clk : std_logic := '0';
  signal trigger : std_logic := '1';
  signal output : std_logic_vector(11 downto 0);
  constant clk_period : time := 25 ns;
  BEGIN
    kyklwma: main PORT MAP (
      clk => clk,
      trigger => trigger,
      output => output 
    );
    clk_process :process
      begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
    end process;
    trigger_stim: process 
      begin      
        wait for 100 ns;    
        trigger <= '0';-- first trigger event with  counter <1200
        wait for clk_period;
        trigger <= '1';
        wait for clk_period*85;
        trigger <= '0';--second trigger event with  counter <1200
        wait for clk_period;
        trigger <= '1';
        wait for 10000 ns;
        trigger <= '0';-- first trigger event with counter > 1200
        wait for clk_period;
        trigger <= '1';
        wait for clk_period*1500;
        trigger <= '0';--second   trigger event with counter > 1200
        wait for clk_period;
        trigger <= '1';
        wait;
    end process;
END;
...