Мне нужна твоя помощь для подсчета и внешнего сигнала. По сути, мне нужно посчитать внешний сигнал (в моем 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;
Я вижу код, но я не видел, где неправильный шаг на этом автомате. Любая помощь будет очень признателен!