Посчитайте внешний сигнал в VHDL FSM - PullRequest
0 голосов
/ 15 апреля 2020

Мне нужна твоя помощь для подсчета и внешнего сигнала. По сути, мне нужно посчитать внешний сигнал (в моем vhdl я называю его sync100k) и посчитать его, чтобы сгенерировать активный высокий сигнал (pulse_v) для программируемого количества отсчетов. sync100k будет высоким для 50 нс и 0 для 450 нс, для периода 500 нс, поэтому, если я установлю счетчик в 1, я ожидал, что pulse_v будет высоким для 500 нс, поэтому, если я установлю счетчик в 3, я определил, что pulse_v равен высокая за 1500нс. Я написал простой код VHDL, но он не работает должным образом. Если я установлю для индекса реестра значение 1, сгенерированный сигнал не останется высоким в течение 500 нс, как ожидалось, а только за 50 нс. Если установить индекс на счет 2, он сгенерирует сигнал 500 нс, если установить индекс 3, он сгенерирует сигнал 550 нс и так далее. Может быть, я что-то упустил в моем fsm, но я все еще не понимаю, где находится ошибка.

Здесь мой код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity millipulse is
generic(N : integer := 8);
Port (
        start : in STD_LOGIC := '0'; --start
        pps : in STD_LOGIC :='0'; --pps 
        clk : in  STD_LOGIC; --clock 
        reset  : in  STD_LOGIC; -- reset
        sync100k : in STD_LOGIC; --100kHz sync signal 
        pulse: out STD_LOGIC; --pulse out
        t_on: in std_logic_vector (N-1 downto 0) --count vector

    );
end millipulse;

architecture behavioral of millipulse is
    --type state_type is (idle, gate_up, final);
    type state_type is (idle, wakeup, lighton);
    signal state : state_type;


begin


    process (reset, clk, start, pps, sync100k, t_on)
    variable index : integer :=0;
    variable pulse_v: std_logic;
    variable t_onlen : integer;

    begin
    t_onlen := to_integer(unsigned(t_on));

    if reset = '1' then 
      index := 0;
      pulse_v := '0';  
    else
        if rising_edge(clk) then
        case state is
          when idle =>
            index := 0;
            pulse_v :='0';
            if(start = '1') then
              state <= wakeup;
              index := 0;
              pulse_v :='0';
            else
              state <= idle;
            end if;

            when wakeup =>
            if (pps='1') then
            state <= lighton;
            else
            state <= wakeup;
            end if;

            when lighton =>
            if (sync100k = '1') then
              if index = t_onlen then
               pulse_v := '0';
               state <=wakeup;
               else
               pulse_v := '1';
               index := index + 1;
               state <= lighton;
               end if;
            end if;


          when others => null;
        end case;

   end if;
    end if;     
    pulse <= pulse_v;
  end process; 


end Behavioral;

здесь мой тестовый стенд

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY millipulse_tb IS
END millipulse_tb;

ARCHITECTURE behavior OF millipulse_tb IS 

        signal clk : std_logic := '0';
        signal reset : std_logic := '0'; 
        signal start : std_logic := '0';
        signal pps : std_logic := '0';
        signal sync100k : std_logic := '0';
        signal pulse : std_logic := '0'; --this is the light pulse 
        signal t_on : std_logic_vector(7 downto 0);   --time light on
        constant clk_period : time := 25 ns;


        component millipulse is 
        port( 
            clk : in std_logic;  
            reset : in std_logic;
            start : in std_logic;           
            pps: in std_logic;
            sync100k : in std_logic;
            pulse: out std_logic;
            t_on: in std_logic_vector (7 downto 0)
            ---start : in STD_LOGIC := '0'
        );
    end component millipulse;





BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: millipulse PORT MAP (
          clk => clk,
          reset => reset,
          start => start,
          pps=> pps,
          sync100k=> sync100k,
          pulse => pulse,
          t_on => t_on

        );

   -- Clock process definitions
   millipulse_process :process
   begin
        clk <= '1';
        wait for clk_period/2;
        clk <= '0';
        wait for clk_period/2;
   end process;

stim : process 
    begin
    t_on <= "00000011";
    wait for 100 ns;
    reset <='1';
    wait for 100 ns;
    reset <='0';
    wait for 100 ns;
    start <= '1';
    wait for 100 ns;
    start <='0';
    wait for 1 ns;
    wait for 100 ns;
    pps <='1';
    wait for 100 ns;
    pps <='0';
    wait for 200 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;
    sync100k <= '1';
    wait for 50 ns;
    sync100k <= '0';
    wait for 450 ns;


    wait for 1000 ns;



    end process;


END behavior;

Я вижу код, но я не видел, где неправильный шаг на этом автомате. Любая помощь будет очень признателен!

...