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

verilog оптимизация FSM

Написал простую фсм, отсинтезил, посмотрел на схему и немного офигел :)

вот ее код

module transmitter(input clk16,tx,reset,input [3:0] pn31,output reg txo);
    reg [3:0] sr;
    reg st;
    reg [5:0] ct;
    reg txreg;
    wire ct61,ct14;
    
    assign ct61=(ct==6'd61);
    assign ct14=(ct==6'd14);
    
    always @(posedge clk16 or negedge reset)begin
        if(!reset)begin
            txo<=0;
            sr<=pn31;
            txreg<=0;
            ct<=0;
            st<=0;
        end else begin
            sr[3:1]<=sr[2:0];sr[0]<=sr[3];
            txo<=sr[3]^txreg;
            
            ct<=ct+1'b1;
            case(st)
            1'b0:if(ct61)begin
                ct<=0;
                txreg<=tx;
                st<=1'b1;
            end
            1'b1:if(ct14)begin
                ct<=0;
                txreg<=tx;
                st<=1'b1;
            end
            endcase
        end
    end
    
endmodule

и вот что насинтезировало(в плисине заняло 26 элементов)

 

 

потом сделал то же самое, только через if и жесткую логику. привожу только фрагмент,которым заменил весь case, остальное осталось таким же

if(~st&ct61|st&ct14)begin
    ct<=0;
    txreg<=tx;
    st<=1;
end

И заняло 25 элементов.

И схема гораздо проще,правильнее и понятнее, а главное заняла меньше элементов:

 

 

Это я что-то туплю или через case так и будет получатся. этот код то и так нормальный, но если FSM по больше,то жесткую логику явно напряжнее будет прописывать...

Или мож в квартусе где-то оптимизация не довключена?

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


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

Это я что-то туплю или через case так и будет получатся. этот код то и так нормальный, но если FSM по больше,то жесткую логику явно напряжнее будет прописывать...

Или мож в квартусе где-то оптимизация не довключена?

Для вашего случая if предпочтительнее. От описания многое зависит. У меня студенты один и тот же пример написанный по-разному на квартусе синтезят и разброс зачастую существенный. Не старайтесь запихнуть все в один always-блок:

module transmitter(
    input clk16,tx,reset,
    input [3:0] pn31,
    output reg txo
);

    reg [3:0] sr;
    reg st;
    reg [5:0] ct;
    reg txreg;

    always @(posedge clk16 or negedge reset)
        if(!reset) begin
            txo<=0;
            sr<=pn31;
        end else begin
            txo<=sr[3]^txreg;        
            sr[3:1]<=sr[2:0]; sr[0]<=sr[3];                
        end

    always @(posedge clk16 or negedge reset)
        if(!reset)        
            ct<=0;
        else if (!st && (ct==6'd61) || st && (ct==6'd14))
            ct<=0;
        else
            ct<=ct+1'b1;
                
    always @(posedge clk16 or negedge reset)
        if(!reset) begin      
            txreg<=0;
            st<=0;
        end else if (!st && (ct==6'd61) || st && (ct==6'd14)) begin
            txreg<=tx;
            st<=1'b1;                
        end    
        
endmodule

Если будет время, то просинтезите этот код и скажите результаты.

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


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

если с case но для проверки "убрать" if получается

Total combinational functions    13
Dedicated logic registers    6
Total logic elements    14
Total registers    6

 

изначально было

Total combinational functions    25
Dedicated logic registers    13
Total logic elements    25
Total registers    13

 

Quartus II 64-Bit Version 10.0 Build 262 08/18/2010 SP 1 SJ Web Edition

 

IMHO надо над if думать, с case - не все так печально и накладно

 

был бы testbench для проверки оптимизации if :)

 

PS: разные always дают:

Total combinational functions    22
Dedicated logic registers    13
Total logic elements    24
Total registers    13

 

 

PS2: интересный случай...

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

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


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

Приведённые отчёты ("Total combinational functions ... " и т. д.) под сомнение не ставлю, а вот на RTL-схемы порекомендовал бы не особо ориентироваться - всё равно в ПЛИС попадает то, что отображается в TechMap. Не видел, как корректно работающие и синтезировавшиеся в довольно аккуратные небольшие фрагменты TechMap модули отображались в RTL довольно запутано и ненаглядно.

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


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

спасибо, в РТЛ смотреть привычка заставляет :)

попробую поигратся....

а весь проект тоже обвесился кучей муксов, хотя они там не нужны

techmap na 10.1web ne работает, поставлю 9.2, попробую

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


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

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

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

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

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

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

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

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

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

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