Привет. Все, что я хочу генерировать два сигнала или сигнала (скажем, сигнал mode-1 и mode-2) через FSM, каждый из которых имеет три импульса, скажем, P1, P2 и P3.эти импульсы имеют ширину 0,8 с каждый.для режима 1 P1 и p2 находятся на расстоянии 2 мкс друг от друга, а p1 и p3 на расстоянии 8 мкс (от начала импульса) для режима 2 P1 и P2 такие же, как указано выше, в то время как P3 на расстоянии 21 мкс друг от друга.
и через 1 мс эти импульсы повторяются самостоятельно.Я использовал частоту 50 МГц в качестве входной тактовой частоты.
в следующем коде, который я написал с использованием FSM
-----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Signal_pulse is
Port ( clk : in STD_LOGIC;
rst : in STD_LOGIC;
modes : in STD_LOGIC_VECTOR (2 downto 0);
P_out : out STD_LOGIC);
end signal_pulse;
architecture Behavioral of signal_pulse is
type state_type is (P0, P1, P2, P3);
signal Next_state, Present_state : state_type;
signal count : integer range 0 to 100000000;
signal temp : integer range 0 to 100000000;
begin
Process(rst, clk)
begin
if(rst = '1') then
Present_state <= P0;
elsif(rising_edge(clk)) then
temp <= temp +1;
Present_state <= Next_state;
if (temp = 50000) then
temp <= 1;
end if;
--count <= count+1;
end if;
end process;
state_Process: Process(Present_state)
begin
case present_state is
when P0 =>
if (rst ='1') then
P_out <= '0';
count <= 0;
next_state <= P0;
else
count <= 0;
next_state <= P1;
end if;
when P1 =>
if(modes = "001") then
if (count<40) then
P_out <= '1';
count <= count+1;
next_state <= p1;
elsif(count < 100) then
P_out <= '0';
count <= count+1;
next_state <= p1;
elsif(count = 100) then
next_state <= p2;
end if;
elsif (modes = "010") then
if (count<40) then
P_out <= '1';
count <= count+1;
next_state <= p1;
elsif(count < 100) then
P_out <= '0';
count <= count+1;
next_state <= p1;
elsif(count = 100) then
next_state <= p2;
end if;
else
P_out <= '0';
end if;
when P2 =>
if(modes = "001") then
if (count < 140) then
P_out <= '1';
count <= count+1;
next_state <= p2;
elsif(count < 400) then
P_out <= '0';
count <= count+1;
next_state <= p2;
elsif(count = 400) then
next_state <= P3;
end if;
elsif (modes = "010") then
if (count < 140) then
P_out <= '1';
count <= count+1;
next_state <= p2;
elsif(count < 1050) then
P_out <= '0';
count <= count+1;
next_state <= p2;
elsif(count = 1050) then
next_state <= P3;
end if;
else
P_out <= '0';
end if;
when P3 =>
if(modes = "001") then
if (count < 440) then
count <= count +1;
P_out <= '1';
next_state <= p3;
elsif (temp = 50000) then
count <= 0;
--temp <= 1;
next_state <= P1;
else
P_out <= '0';
next_state <= P3;
end if;
elsif(Modes = "010") then
if (count < 1090) then
count <= count +1;
P_out <= '1';
next_state <= P3;
elsif (temp = 50000) then
count <= 0;
--temp <= 1;
next_state <= P1;
else
P_out <= '0';
next_state <= P3;
end if;
else
P_out <= '0';
end if;
end case;
end Process;
end Behavioral;
, но мой выходной сигнал постоянно установлен на высоком уровне.Пожалуйста, предложите, что я делаю не так.любая помощь будет высоко ценится и извините меня, если есть глупые ошибки. Я новичок, только через 2 недели в VHDL спасибо
Я также внес некоторые изменения в кодеКак показано в изображениях для режима 1, я получаю правильный сигнал при запуске, а также через 1 мс повторения.но для режима 2, когда запускается режим 2, я не получаю правильный импульс, но после 1 мс повторения я получаю правильные импульсы сигнала режима 2.