2017-02-07 27 views
0

Я только начинаю изучать код в 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; 

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

+0

И где вы это читаете? –

+0

@prakash Darji http://asics.chuckbenz.com/detailed_one_hot.htm – rhoward

ответ

2

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

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

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

На ваш вопрос легко перейти к кодировке FOT, закодированной в один кадр. Необходимо выполнить инструкцию 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 
//... 

Простой пример доступен в this link и объяснение over here. Cummings paper также является хорошим источником для получения дополнительной информации.

EDIT: Как отметил @Greg, это была ошибка копирования-вставки. Комбинационный блок должен использовать блокирующие назначения.

+0

Так что очень близко, но фрагмент кода неверен. Посмотрите приведенные примеры. Кроме того, блокирующие назначения должны использоваться в комбинационных блоках. – Greg

+0

Это была ошибка копирования-вставки. Исправленный. Спасибо, что указали @Greg. – sharvil111

+0

@ shrvil111, условия дела были по-прежнему неправильными, поэтому я взял на себя смелость исправить это. – Greg

 Смежные вопросы

  • Нет связанных вопросов^_^