Генерация сигнала с тремя импульсами с использованием FSM? - PullRequest
0 голосов
/ 25 сентября 2019

Привет. Все, что я хочу генерировать два сигнала или сигнала (скажем, сигнал 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 спасибо


Mode 2 repetition

Mode 2 @start

Mode 1 at @start

Mode-1 After 1 ms repetition

Я также внес некоторые изменения в кодеКак показано в изображениях для режима 1, я получаю правильный сигнал при запуске, а также через 1 мс повторения.но для режима 2, когда запускается режим 2, я не получаю правильный импульс, но после 1 мс повторения я получаю правильные импульсы сигнала режима 2.

1 Ответ

0 голосов
/ 25 сентября 2019

Я сделал несколько модификаций в вашем HDL, изменил двухпроцессный FSM как единый процесс, Состояния и выходные данные сейчас действительно меняются,
Хотя в книгах и литературе используется два процесса, сейчас многие профессионалы и неофициальный стандарт рекомендуют егоиспользовать один процесс, хотя были большие дискуссии и аргументы для определения того, что лучше, я чувствую, что нет большой разницы, хотя вы должны позаботиться о списке чувствительности комбинационного процесса, если вы используете два или три процесса, незавершенный процессможет вызвать проблемы в комбинационном процессе, как вы столкнулись, для начинающих я рекомендую Single Process, если вы абсолютно не уверены в том, что вы делаете.

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;

                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 if;
    end Process;                
end Behavioral;
...