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

Странная ошибка. Взаимовлияние enum, interface и module в Quartus.

interface connect();
	logic flag;
endinterface

  
module main (input CLOCK_50, output [7:0]LED);

	connect main_conn();
	assign main_conn.flag = 1;	

	logic clk_main;
	assign clk_main = CLOCK_50;	

	logic [7:0]my_out;					
	sub_module sub_module(.clk_in(clk_main),
                          .sub_conn(main_conn),
                          .sub_out(my_out));	
	assign LED[ 7: 0]= my_out[7:0];	
endmodule

  
module sub_module(input clk_in,
               connect sub_conn,
               output [7:0]sub_out);						
    enum{IDLE,
         DUMMY_1,
         DUMMY_2,			
         DUMMY_3,
         DYMMU_4,
         STAGE_1//=== Пункт №1 ===
         } FSM;			
    always @(posedge clk_in)
    begin
        case(FSM)
            IDLE: begin
                sub_out[7:0]<='b10101010;	
                if(sub_conn.flag) //=== Пункт №2 ===
                begin
                    FSM <= STAGE_1;
                end
            end			
            STAGE_1: begin
                sub_out[7:0]<='b11000011;
                FSM <= STAGE_1;//=== Пункт №3 ===
            end
            default begin
                sub_out[7:0]<=FSM;
            end
        endcase		
    end	
endmodule

По идее приведенный код должен выдавать на LED последовательность 11000011:
1) ПЛИС стартует с обнуленными регистрами
2) срабатывает IDLE
3) т.к. main_conn.flag = 1, то FSM переключается в состояние STAGE_1
4) на следующем клоке в LED выдается 11000011, а FSM переводится в состояние STAGE_1, хотя он уже и так в нем.

И так действительно работает, если закомментировать "пункт №3" и/или "пункт №2". Или в пункте №2 в качестве условия поставить "1". Или пробрасывать в условие значение из модуля "main", но не через интерфейс, а через logic/wire. Если же всё выполняется, как написано, то результат будет 11111010.  Т.е. у case срабатывает ветка default и выдается текущее значение FSM, а оно оказывается равно инвертированному значению STAGE_1 (т.е. если удалить DUMMY_3 и DUMMY_4, то результатом работы будет 11111100).

Проверял на самодельной плате с 10M02SCE144C8G и на DE0-NANO c EP4CE22F17C6N. Среда - Quartus 17.1 Lite.

Что это такое, господа?

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


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

FSM - это же объявленный тип, почему дальше в коде, вы с ним обращаетесь, как с сигналом?

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


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

38 minutes ago, flammmable said:

1) ПЛИС стартует с обнуленными регистрами

Далеко не факт, особенно для перечисляемого типа, без инициализации с форматом представляения отданным синтезатору. Все остальное следствие

20 minutes ago, Tausinov said:

FSM - это же объявленный тип, почему дальше в коде, вы с ним обращаетесь, как с сигналом?

что бы быть типом должен быть typedef

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


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

Приветствую!

47 minutes ago, flammmable said:

По идее приведенный код должен выдавать на LED последовательность 11000011:
1) ПЛИС стартует с обнуленными регистрами
2) срабатывает IDLE
...
Что это такое, господа?

Скорее всего это некорректный  подход к кодированию. - Очень желательно явный ресет для FSM. Так как нулевое состояние регистров может не соответствовать IDLE - Qu вроде one-hot по умолчанию для fsm  делает :unknw:

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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