1 Отредактировано LeoN (19-04-2020 19:31)

Тема: Нужен совет/подсказка по верилогу

Есть код:

module Turbo_3_575 (
  (* chip_pin = "43" *) input   Clock_14M,
  (* chip_pin = "39" *) input   TurboSwitch,
  (* chip_pin = "24" *) output  reg Clock_2M,
  (* chip_pin = "6" *) output  reg Clock_7M,  
  (* chip_pin = "31" *) output  reg nPhi0,
  (* chip_pin = "29" *) output  reg nPhi1
);

reg [4:0] CS = 5'd13;            // Current State
reg TurboMode = 1'd0;
reg [4:0] CSALT = 5'd13;            // Current State for 2MHz and 7MHz

always @(posedge Clock_14M)
begin
  CSALT <= (CSALT == 5'd13) ? 0 : (CSALT+1);
  case (CSALT)
    5'd0  : Clock_7M <= 1'b1;
    5'd1  : Clock_7M <= 1'b0;
    5'd2  : Clock_7M <= 1'b1;
    5'd3  : begin
              Clock_2M <= 1'b0;
              Clock_7M <= 1'b0;
            end
    5'd4  : Clock_7M <= 1'b1;
    5'd5  : Clock_7M <= 1'b0;
    5'd6  : begin
              Clock_2M <= 1'b1;
              Clock_7M <= 1'b1;
            end
    5'd7 : Clock_7M <= 1'b0;
    5'd8 : Clock_7M <= 1'b1;
    5'd9 : Clock_7M <= 1'b0;
    5'd10 : begin
              Clock_2M <= 1'b0;
              Clock_7M <= 1'b1;
            end
    5'd11 : Clock_7M <= 1'b0;
    5'd12 : Clock_7M <= 1'b1;
    5'd13 : begin
              Clock_2M <= 1'b1;
              Clock_7M <= 1'b0;
            end
  endcase
  case (TurboMode)
    1'd0 : begin
             CS <= (CS == 5'd13) ? 0 : (CS+1);
             case (CS)
               5'd0  : TurboMode <= TurboSwitch;
               5'd6  : begin
                         nPhi0 <= 1'b1;
                         nPhi1 <= 1'b0;
                       end
               5'd13 : begin
                         nPhi0 <= 1'b0;
                         nPhi1 <= 1'b1;
                       end
             endcase
           end
    1'd1 : begin
             CS <= (CS == 5'd3) ? 0 : (CS+1);
             case (CS)
               5'd0  : TurboMode <= TurboSwitch;
               5'd1  : begin
                         nPhi0 <= 1'b1;
                         nPhi1 <= 1'b0;
                       end
               5'd3  : begin
                         nPhi0 <= 1'b0;
                         nPhi1 <= 1'b1;
                       end
             endcase
           end
  endcase
end
endmodule

Включаю яблочный режим ($C050), при TurboSwitch=0 все хорошо (кнопка-переключатель с фиксацией отжата, пин замкнут на землю), как только нажимаю кнопку, то становится TurboSwitch=1 (пин подсвечен резюком на 5В, а кнопка при нажатии размыкает от земли), то на мониторе синхра яблочка улетает... Нажимаю - опять кажет нормально.
Как так? Clock_7M никак в коде не связан ни с TurboSwitch, ни с TurboMode.
Споткнулся на ровном месте... Может Вы в коде косяк видите?

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

2

Re: Нужен совет/подсказка по верилогу

Может поставить defaultы и посмотреть, не вылетает ли туда?

3 Отредактировано LeoN (19-04-2020 19:37)

Re: Нужен совет/подсказка по верилогу

Сергей, спасибо за идею.
Поставил default в case(CSALT). При TurboSwitch=0 (кнопка с фиксацией отжата) default не срабатывает (и развёртка в яблочном режиме в норме). При TurboSwitch=1 default срабатывает (и развёртка в яблочном режиме срывается)... В коде CSALT никак не меняется от TurboSwitch... Почему default срабатывает? Откуда в CSALT появляются значения 14 и 15 (т.е. default)?
"Ничего не понимаю"... Монтаж проверил, ничего не напутал. Начинается взрыв мозга... :(

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

4

Re: Нужен совет/подсказка по верилогу

А если CSALT сократить до 4-х бит?

5 Отредактировано LeoN (19-04-2020 23:09)

Re: Нужен совет/подсказка по верилогу

Да, уже давно сократил до 4-х бит, поэтому и упомянул только 14-15, а не 14-31.
Разглядываю RTL-схему - там тако-о-о-о-о-о-ой пипец!!! Значения всех счётчиков польностью дешифруются - портянки еще те... Неиспользуемые такты по каждому сигналу (т.е. такт, в котором данный сигнал не изменяется) юзаются в мультиплексорах для хранения текущего состояния.
В RTL-е CSALT и TurboSwitch никак не связаны. А такты 14-15 и хранят текущее состояние, и включают отдельный триггер (светодиод на нем) для сигнализации default... Значит сравнение на 13 в турбе не проходит... А в нетурбе проходит. Мля!!! Хотя в RTL-е компаратор есть, и при 13 такте всегда сбрасывает счётчик CSALT. Но в реале почему-то не проходит...
Муйня какая-то... Дас ист фантастиш...

Симулятор рисует красивенькие осциллограммы, всё чики-пуки. А железка капризничает...

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

6

Re: Нужен совет/подсказка по верилогу

Вот я шотландское чудище!
Ослика сейчас у меня нет, вот и не могу удостовериться - пропадает 7МГц (почему и срыв синхры) или нет.
Тут до меня дошло, что при переключении в яблочный режим, мультик D81 переключает 4 пары сигналов, в одной - PixelClock с 10.5МГц на 7МГц (которые я честно генерю), третья и четвёртая - не важны, а во второй юзает Ф0 - а этот-то сигнал в турбе уже быстрее, вот и срывает башню у дисплейного контроллера.

Зато в RTL-е узнал, какую жуть-муть синтезатор высирает на достаточно простых устройствах... Это просто пипец!

Владимир или Игорь, почикайте эту ветку, пожалуйста.

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).