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

Цифровой автомат не успевает за такт выполнить операцию

Интересует пример описание такого автомата.

И проблема такая, хотя может я неправильно все понял...

 

СЕ формируется по счетчику вынесенному за автомат. т.е. при некоторой доработке автомата необходимо менять формирование этого СЕ, правильно?

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

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


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

- формируем глобальный FSM.CE но... не меандро-подобный а с розрывами где надо умножать.
А так же и там, где умножать не надо :smile3046:

 

Так устроит?
Если ТС устроит эффективное понижение частоты FSM, то да. Но скорее всего нет

 

 

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


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

СЕ формируется по счетчику вынесенному за автомат. т.е. при некоторой доработке автомата необходимо менять формирование этого СЕ, правильно?

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

 

1) "при некоторой доработке автомата необходимо менять формирование этого СЕ, правильно?" - правильно.

 

2) "Да и достаточно точно знать все времянки функционала автомата." - правильно

 

3) "Так выглядит достаточно сложно." - всё относительно....

У Вас есть выбор:

а) напихать Wait States в FSM,

б) ускорить умножитель,

с) шагать равномерно но медленнее (соотв. самому медленному комбинаторному пути)

д) шагать неравномерно.

 

2) Пример FSM с СЕ (fsm_ce):

 

reg [1:0] FSM_seq, FSM_next;
wire fsm_ce;

always @ (FSM_seq)
begin 
    case (FSM_seq)
    
        state0 :
            FSM_next <= state1;
        
        state1 :
            FSM_next <= BIG_state2;
        
        BIG_state2 :
            FSM_next <= state3;

        state3 :
            FSM_next <= state0;

                                        
    endcase
end

always @ (posedge clk)
begin
    if (fsm_ce)
        FSM_seq <= FSM_next; 
    else   
        FSM_seq <= FSM_seq; 
end

 

... Пример как шагать медленнее CLK но равномерно:

 

reg [2:0] ce_counter;

always @ (posedge clk)
    ce_counter <= ce_counter + 1; 

// 1/4 максимальной скорости
assign fsm_ce = ce_counter[2] & ce_counter[1] & ce_counter[0];

 

... Шагаем со скоростью CLK, при этом BIG_state2=7*CLK:

 

reg [3:0] ce_counter;

always @ (posedge clk)
begin
    if (ce_counter == 8)
        ce_counter <= 0; 
    else   
        ce_counter <= ce_counter + 1; 
end

// BIG_state2 = 7xCLK 
assign fsm_ce = (ce_counter == 0 ||
                 ce_counter == 1 ||
                 ce_counter == 8
                ) ? 1 : 0;

 

P.S. Не симулил...

Ресеты викинул для наглядности....

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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