Перейти к содержанию
    

Вопросы по симуляции

23 minutes ago, andrew_b said:

Устроит?

Если нет, введите промежуточный сигнал и проинициализируйте его.

самое начало

sim.thumb.png.9eb6a24721794065d57bd8e86be5cdbc.png

и

OUTPUTS    : out std_logic_vector(55 downto 0) := (others => '0')

и

signal s_outputs  : std_logic_vector(55 downto 0):= (others => '0');

а воз и ныне там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, jenya7 said:

в железе последняя версия работает на ура.

в железе работает потому что ПЛИС при конфигурации инициализирует регистры.  А в коде из первого поста, OUTPUTS это неинициализированный регистр, который в железе инициализировался. 

Код вашей последней версии приведите. Гложат меня сомнения что код в этом посте  синтезатор пропустил. Там конфликт драйверов, синтезатор был обязан ругнуться. Поэтому код нужен) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, des00 said:

в железе работает потому что ПЛИС при конфигурации инициализирует регистры.  А в коде из первого поста, OUTPUTS это неинициализированный регистр, который в железе инициализировался. 

Код вашей последней версии приведите. Гложат меня сомнения что код в этом посте  синтезатор пропустил. Там конфликт драйверов, синтезатор был обязан ругнуться. Поэтому код нужен) 

entity OUT_CONTROL is
port 
(
    CLK : in  std_logic;
    RST : in  std_logic;
		
    OUT_MASK   : in std_logic_vector(55 downto 0);
    OUT_ON_OFF : in std_logic_vector(55 downto 0);
    OUT_TRIG   : in std_logic;
	
    OUTPUTS    : out std_logic_vector(55 downto 0)
);
end entity OUT_CONTROL;

architecture behavior of OUT_CONTROL is

type OutStateType is (ST_IDLE, ST_SET, ST_PREV);
signal OutState : OutStateType := ST_IDLE;

signal outs : std_logic_vector(55 downto 0) := (others => '0');
signal pev_outs : std_logic_vector(55 downto 0) := (others => '0');

begin

OUTPUTS <= outs;

process(CLK) 
begin 

    if (rising_edge(CLK)) then
	 
        case OutState is
		  
            when ST_IDLE =>
                if (OUT_TRIG = '1') then
                    OutState <= ST_SET;
                end if;
					 
            when ST_SET => 
                for i in 0 to 55 loop
                    if (OUT_MASK(i) = '1') then
                        OUTPUTS(i) <= OUT_ON_OFF(i);
                    else
                        outs(i) <= pev_outs(i);
                    end if;
	             end loop;
					 OutState <= ST_PREV;
					 
                 when ST_PREV => 	 
                     pev_outs <= outs;
                     OutState <= ST_IDLE;
					 
                 when others => OutState <= ST_IDLE;
				
        end case;
		  
    end if;
	 
end process;
	 
end behavior;

и вот результат

sim.thumb.png.9825e9221f0621aca18c107ae4ad3960.png

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эммм, либо VHDL сдал позиции по черному, либо одно из трех.  Иначе мне не ясно как может быть синтезирован вот такой вот код 

OUTPUTS <= outs;

process(CLK) 
begin 
    if (rising_edge(CLK)) then
	 ......	 
            when ST_SET => 
                for i in 0 to 55 loop
                    if (OUT_MASK(i) = '1') then
                        OUTPUTS(i) <= OUT_ON_OFF(i);
	             end loop;
 	............
        end case;
    end if;
end process;

К коде возникает конфликт драйверов сигнала OUTPUTS, а синтезатор молчит. В каком ПО это было собрано? Хотя, с учетом того что outs и pev_out у вас висят в воздухе, синтезатор их выкинул и наверное воспользовался функцией разрешения. 

А чтобы моделировалось, вам надо было в исходный код добавить инициализацию по сигналу сброса. Или да, делать через промежуточный предварительно инициализированный регистр. На верилоге это вот так 

always_ff @(posedge clk) begin
  if (rst) begin
    OutState <= ST_IDLE;
    OUTPUTS  <= '0;
  end
  else begin
    case(OutState)
      ST_IDLE : OutState <= OUT_TRIG ? ST_SET : ST_IDLE;
      ST_SET  : begin
        OutState <= ST_IDLE;
        for (int i = 0; i < 55; i++) begin
          if (OUT_MASK(i)) begin
            OUTPUTS(i) <= OUT_ON_OFF(i);
          end
        end
      end
    endcase
  end
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, des00 said:

эммм, либо VHDL сдал позиции по черному, либо одно из трех.  Иначе мне не ясно как может быть синтезирован вот такой вот код 

К коде возникает конфликт драйверов сигнала OUTPUTS, а синтезатор молчит. В каком ПО это было собрано? Хотя, с учетом того что outs и pev_out у вас висят в воздухе, синтезатор их выкинул и наверное воспользовался функцией разрешения. 

А чтобы моделировалось, вам надо было в исходный код добавить инициализацию по сигналу сброса. Или да, делать через промежуточный предварительно инициализированный регистр. На верилоге это вот так 


always_ff @(posedge clk) begin
  if (rst) begin
    OutState <= ST_IDLE;
    OUTPUTS  <= '0;
  end
  else begin
    case(OutState)
      ST_IDLE : OutState <= OUT_TRIG ? ST_SET : ST_IDLE;
      ST_SET  : begin
        OutState <= ST_IDLE;
        for (int i = 0; i < 55; i++) begin
          if (OUT_MASK(i)) begin
            OUTPUTS(i) <= OUT_ON_OFF(i);
          end
        end
      end
    endcase
  end
end

 

не понял. а чем этот код оличается от моего?

у меня вроде всё инициализировано

OUTPUTS  : out std_logic_vector(55 downto 0) := (others => '0')

signal OutState : OutStateType := ST_IDLE;
signal outs : std_logic_vector(55 downto 0) := (others => '0');

это в Quartus 21.1

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

не понял. а чем этот код оличается от моего?

  if (rst) begin
    OutState <= ST_IDLE;
    OUTPUTS  <= '0;
  end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, des00 said:

  if (rst) begin
    OutState <= ST_IDLE;
    OUTPUTS  <= '0;
  end

 

добавил рисет и он конечно же ничего не поменял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

добавил рисет и он конечно же ничего не поменял.

У  вас в одном месте   

OUTPUTS <= outs;

А  в другом  

        OutState <= ST_IDLE;

        for (int i = 0; i < 55; i++) begin
          if (OUT_MASK(i)) begin
            OUTPUTS(i) <= OUT_ON_OFF(i);
          end
        end

Вы как бы определитесь  с какой переменой работаете как  с выходом c outs  или  OUTPUTS ?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, jenya7 said:

добавил рисет и он конечно же ничего не поменял.

т.е. вы взяли код из вашего первого поста (именно первого, а не последующий код, который противоречит здравому смыслу), добавили сброс, добавили активацию сброса в тестбенче и у вас все по прежнему? 

Если вы сделали именно вот так, как описал, прикладывайте файлы. 

11 hours ago, RobFPGA said:

У  вас в одном месте   

А  в другом  

Вы как бы определитесь  с какой переменой работаете как  с выходом c outs  или  OUTPUTS ?  

более того, эта штука синтезировалась в какутсе и правильно работает в железе. И кто-то тут будет убеждать, что VHDL не допускает говногода (с)? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, RobFPGA said:

У  вас в одном месте   


OUTPUTS <= outs;

А  в другом  


        OutState <= ST_IDLE;

        for (int i = 0; i < 55; i++) begin
          if (OUT_MASK(i)) begin
            OUTPUTS(i) <= OUT_ON_OFF(i);
          end
        end

Вы как бы определитесь  с какой переменой работаете как  с выходом c outs  или  OUTPUTS ?  

аааа.  конечно это ошибка моя. как это скомпилировалось непонятно.

теперь всё зелененькое но выход не обновляет состояние (хотя в железе это работает)

sim.thumb.png.dbc00d90460a17465409c8157d8d1a37.png

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В тестбенче задайте

signal reset : std_logic := '1';

У Вас же действующий уровень reset высокий?

А после wait for 20 ns;

снимите reset

reset <= '0';

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, andrew_su said:

В тестбенче задайте

signal reset : std_logic := '1';

У Вас же действующий уровень reset высокий?

А после wait for 20 ns;

снимите reset

reset <= '0';

 

 

у меня рисет при 1. сделал так

reset <= '1'; 
wait for 20 ns;
reset <= '0';

но при втором изменении

s_on_off   <= X"00000000000003";

s_out_trig <= '1';
wait for 20 ns;
s_out_trig <= '0';

выход должен стать 3 а он остался F.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 minutes ago, jenya7 said:

выход должен стать 3 а он остался F.

автомат ваш смотрите, за счет своих двух фаз, он децимирует работу вашего устройства. Это же видно из кода первого вашего поста. Ощущение что вы в слепую разрабатываете и код и тестбенч, не понимая циклограмм описанного вами устройства. Возьмите тетрадку и разрисуйте как оно работает, тогда и будут ответы на все ваши вопросы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, des00 said:

автомат ваш смотрите, за счет своих двух фаз, он децимирует работу вашего устройства. Это же видно из кода первого вашего поста. Ощущение что вы в слепую разрабатываете и код и тестбенч, не понимая циклограмм описанного вами устройства. Возьмите тетрадку и разрисуйте как оно работает, тогда и будут ответы на все ваши вопросы.

вот не понял что не так в автомате. объясните по простому. в Signal Tap всё красиво, всё отрабатывает как надо.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...