одно горячее кодирование в Verilog

Я только начинаю учиться программировать на Verilog. Может ли кто-нибудь помочь мне понять, как реализовать следующий код в Verilog, используя горячую кодировку

module Controller(b, x, clk, rst);
input b, clk, rst;
output x;
reg x;

parameter Off = 2'b00,
          On1 = 2'b01,
          On2 = 2'b10,
          On3 = 2'b11;
reg [1:0] currentstate;
reg [1:0] nextstate;
//state register
always @ (posedge rst or posedge clk)
begin
if(rst==1)
    currentstate <= Off;
else
    currentstate <= nextstate;
end
//combinational 
always @ (*)
begin
    case (currentstate)
        Off: begin
        x <= 0;
        if(b==0)
            nextstate <= Off;
        else
            nextstate <= On1;
        end
        On1 : begin
            x <= 1;
            nextstate <= On2;
        end
        On2 : begin
            x <= 1;
            nextstate <= On3;
        end
        On3 : begin 
            x <= 1;
            nextstate <= Off;
        end
    endcase
end 

Я попытался изменить параметры на:

parameter Off = 4'b0001,
          On1 = 4'b0010,
          On2 = 4'b0100,
          On3 = 4'b1000;

Однако я читал, что это не очень хорошие реализации.


person rhoward    schedule 07.02.2017    source источник
comment
А где ты это читал?   -  person Prakash Darji    schedule 07.02.2017
comment
@prakash Darji asics.chuckbenz.com/detailed_one_hot.htm   -  person rhoward    schedule 19.02.2017


Ответы (1)


Некоторые из преимуществ однократного кодирования в автоматах:

  1. Низкая коммутационная активность. Поскольку за один раз переключается только один бит, потребление энергии меньше и меньше подвержено сбоям.
  2. Упрощенное кодирование. Состояние можно определить, просто взглянув на битовую позицию «1» в переменной текущего состояния.

недостаток этого метода в том, что он требует большего количества флопов. Итак, если у кого-то есть автомат с 10 различными состояниями, ему нужно 10 флопов, тогда как при использовании десятичного кодирования нужно только 4 флопа.

Переходя к вашему вопросу, легко перейти на FSM с однократным кодированием. Необходимо реализовать оператор case на основе позиции 1 в переменной currentstate. Фрагмент кода можно реализовать следующим образом:

parameter Off = 2'b00,
          On1 = 2'b01,
          On2 = 2'b10,
          On3 = 2'b11;
//...
always @ (*)
begin
    nextstate = 4'b0000;
    case (1'b1)
        currentstate[Off] : begin
        x = 0;
        if(b==0)
            nextstate[Off] = 1'b1;
        else
            nextstate[On1] = 1'b1;
        end
        currentstate[On1] : begin
            x = 1;
            nextstate[On2] = 1'b1;
        end
//...

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

РЕДАКТИРОВАТЬ: как заметил @Greg, это была ошибка копирования и вставки. Комбинационный блок должен использовать назначения блокировки.

person sharvil111    schedule 07.02.2017
comment
Очень близко, но фрагмент кода неверен. Посмотрите на приведенные примеры по предоставленным ссылкам. Также следует использовать блокирующие назначения в комбинационных блоках. - person Greg; 07.02.2017
comment
Это была ошибка копирования и вставки. Исправлено. Спасибо, что указали на @Greg. - person sharvil111; 08.02.2017
comment
@ shrvil111, условия оператора case по-прежнему были неправильными, поэтому я взял на себя смелость исправить это. - person Greg; 08.02.2017
comment
@Greg Еще раз спасибо! Я никогда не заглядывал во внутренний код, целью было просто уточнить использование кодировки FSM. Спасибо за помощь. - person sharvil111; 08.02.2017
comment
спасибо и @Greg! Какие хорошие ресурсы / учебники вы порекомендуете, чтобы узнать больше о Verilog? - person rhoward; 19.02.2017