Неразрешенный сигнал имеет несколько источников VHDL

Я реализую простой FSM с использованием VHDL. Я вышел с этим кодом в VHDL и получил эту ошибку: «неразрешенный сигнал NS имеет несколько источников». Я глубоко посмотрел код, но не смог понять ошибку. Может ли кто-нибудь помочь мне решить эту проблему?

                     library ieee ;
                     use ieee.std_logic_1164.all ;
                     entity MeallyMachine is
                     port( 
                     x,res,clk:in std_logic;
                     z1,z2:out std_logic       
                     );

                    end MooreMachine;


                    architecture M1 of MooreMachine is
                    type state_type is(s0,s1,s2,s3);
                    signal PS,NS:state_type;

                     begin
                     ETAT:process(PS,x)
                     begin
                     case PS is
                      when  s0=>  if (x='0') then
                      NS<=s0;
                                 elsif (x='1') then
                                 NS<=s1;
                                 end if;
                     when s1=>  if (x='0') then
                      NS<=s1;
                                elsif (x='1') then
                      NS<=s2;
                                end if;  
                     when s2=>  if (x='0') then
                     NS<=s2;
                                elsif (x='1') then
                     NS<=s3;
                                 end if;
                     when s3=>  if (x='0') then
                     NS<=s3;
                                 elsif (x='1') then
                     NS<=s0;
                                 end if;
                     end case;
                   end process ETAT;
                Sortie:process(PS,x)
                  begin
                   case PS is
                      when s0=>  
                            z1<='1';
                        if (x='0') then
                            z2<='0';
                         elsif (x='1') then
                            z2<='1';
                          end if;
                      when s1=>   
                            z1<='1';
                       if (x='0') then
                            z2<='0';
                       elsif (x='1') then
                        z2<='1';
                       end if;  
                     when s2=>  z1<='0';
                      if (x='0') then
                        z2<='0';
                      elsif (x='1') then
                        z2<='1';
                      end if;
                   when s3=>   z1<='1';
                        if (x='0') then
                         z2<='0';
                        elsif (x='1') then
                         z2<='1';
                        end if;
                   end case;
                end process Sortie;
           Horloge:process(clk,res,NS)
                begin
                 if (res='0') then
                      NS<=s0;
                 elsif (rising_edge(clk)) then 
                      PS<=NS;
                 end if;
                 end process Horloge;




         end M1;

person ChiPlusPlus    schedule 29.12.2014    source источник
comment
Я думаю, вы забыли изменить MooreMachine на MealyMachine в конце объекта и в архитектуре. Может и не проблема, но не очень приятно ;-)   -  person hbaderts    schedule 29.12.2014
comment
вот и все. Спасибо, что заметили :)   -  person ChiPlusPlus    schedule 29.12.2014


Ответы (1)


Ваше сообщение об ошибке: non resolved signal NS has multiple sources содержит также исходные строки, что вызывает проблему с несколькими драйверами. См. полный отчет о синтезе Xilinx XST.

Более того, в вашем коде есть несколько ошибок копирования-вставки:

  1. entity MeallyMachine is должно быть entity MooreMachine is, потому что ваша архитектура ссылается на MoorMachine.
  2. NS<=s0; должно быть PS<=s0;, чтобы решить проблему с несколькими драйверами
  3. Ваш FSM не является FSM Мура, потому что выходы зависят от текущего состояния и входов process(PS,x)
person Paebbels    schedule 29.12.2014
comment
Не могли бы вы подробнее объяснить, почему NS‹=s0; должно быть PS‹=s0;? - person ChiPlusPlus; 29.12.2014
comment
Обычно NS означает NextState, а PS (я не знаю, что такое P по-французски) означает CurrentState. Таким образом, если активен сброс res (вы используете малоактивный сброс, который не так распространен во встроенных схемах), то PS следует установить в начальное состояние s0, в противном случае при появлении нарастающего фронта NS следует сохранить в PS. Это всего лишь шаблон FSM с n процессами. -- Проблема с несколькими драйверами вызвана тем, что 2 процесса записывают на NS. Только один процесс может управлять одним и тем же сигналом, иначе вам понадобится функция разрешения или вентили/логика для разрешения этого конфликта. - person Paebbels; 29.12.2014
comment
Ясно, как вода! Спасибо. Кстати, P означает «подарок» (актуально на английском языке). - person ChiPlusPlus; 29.12.2014
comment
Ой, извините, я увидел "Sortie" и "Horloge" и предположил, что это французские идентификаторы :) - person Paebbels; 29.12.2014