Как бы вы реализовали эту цифровую логику в Verilog или VHDL?

Я опубликовал ответ на еще один вопрос о переполнении стека, который требует некоторой цифровой логики для быть реализованным на Verilog или VHDL, чтобы его можно было запрограммировать в FPGA.

Как бы вы реализовали следующую логическую схему на Verilog, VHDL или любом другом языке описания оборудования?

Пронумерованные поля представляют биты в поле. Каждое поле имеет K битов, а биты для current и mask будут предоставлены компьютерной системой (с использованием фиксированного регистра или эквивалента). Биты в next будут считаны обратно в ту же компьютерную систему.

альтернативный текст http://img145.imageshack.us/img145/5125/bitshifterlogicdiagramkn7.jpg < / а>

См. Также: этот вопрос о переполнении стека


person e.James    schedule 28.01.2009    source источник
comment
К вашему сведению, ссылка на изображение (сейчас) не работает.   -  person luis.espinal    schedule 03.02.2011
comment
@ luis.espinal это нормально для меня, но я точно знаю, что многие корпоративные веб-фильтры (например, WebSense) будут отфильтровывать сторонние изображения.   -  person e.James    schedule 03.02.2011
comment
DOH! Вот что это такое, я смотрю на это из своей корпоративной сети. Ничего страшного и спасибо :)   -  person luis.espinal    schedule 03.02.2011
comment
Не беспокойся. Я тоже ненавижу эти фильтры.   -  person e.James    schedule 03.02.2011


Ответы (1)


Что-то вроде этого?

module scheduler
 #( parameter K = 10 )
  (
   input wire [K:1] current,
   input wire [K:1] mask,
   output reg [K:1] next
   );

   reg [K:1] a;
   reg [K:1] b;

   //'[i+1]' busses that wrap.
   // eg, for a 4-bit bus...
   // a[i]:        a[4],a[3],a[2],a[1] (obviously...)
   // a_wrap[i]:   a[1],a[4],a[3],a[2] 
   wire [K:1] mask_wrap    = { mask[1],mask[K:2] };
   wire [K:1] a_wrap       = { a[1], a[K:2] };
   wire [K:1] current_wrap = { current[1], current[K:2] };

   integer i;
   always @( * ) begin
      for( i=1; i<=K; i=i+1 ) begin
         a[i] = ~current_wrap[i] && b[i];
         b[i] = a_wrap[i] || mask_wrap[i];
         next[i] = ~a[i] && mask_wrap[i];
      end
   end


endmodule

(Отказ от ответственности: с линзой, но не имитация)

person Marty    schedule 28.01.2009
comment
Наверное, стоит упомянуть, что это Verilog-2001. И что я предпочитаю, чтобы мои автобусы ехали из [K-1: 0] ... - person Marty; 29.01.2009
comment
Справедливо. Индексирование шины, вероятно, должно начинаться с нуля. Спасибо за отличный ответ. - person e.James; 29.01.2009