Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

N-битный двунаправленный сдвиговый регистр на Verilog: проект и реализация

В цифровой технике сдвиговый регистр — каскад триггеров, где выход q одного соединён с входом d следующего. Все триггеры работают от общего такта, поэтому битовый массив сдвигается на одну позицию за такт. Пример: 5-битный регистр со значением 10110 и входом 0 даст 01011, затем 00101.

Проект

Параметризованный модуль с параметром MSB (разрядность). Пять входов: d (данные), clk (такт), en (разрешение), dir (направление: 0 — вправо, 1 — влево), rstn (активный низкий сброс). Выход out — текущее состояние регистра.

module shift_reg #(parameter MSB=8) (
  input  d, clk, en, dir, rstn,
  output reg [MSB-1:0] out
);
  always @(posedge clk)
    if (!rstn) out <= 0;
    else begin
      if (en) case (dir)
        0: out <= {out[MSB-2:0], d};  // сдвиг вправо, d входит в MSB
        1: out <= {d, out[MSB-1:1]};  // сдвиг влево, d входит в LSB
      endcase
      else out <= out;
    end
endmodule

Аппаратная схема

Тестбенч

Проверка функциональности: инстанцирование 16-битного регистра, генерация такта 50 МГц, последовательность стимулов: сброс, включение, чередование данных при сдвиге вправо, смена направления, чередование данных при сдвиге влево, пассивный сдвиг.

module tb_sr;
  parameter MSB = 16;
  reg data, clk, en, dir, rstn;
  wire [MSB-1:0] out;

  shift_reg #(MSB) sr0 (.d(data), .clk(clk), .en(en), .dir(dir), .rstn(rstn), .out(out));

  always #10 clk = ~clk;

  initial begin
    clk <= 0; en <= 0; dir <= 0; rstn <= 0; data <= 1'b1;
  end

  initial begin
    rstn <= 0; #20 rstn <= 1; en <= 1;
    repeat (7) @(posedge clk) data <= ~data;
    #10 dir <= 1;
    repeat (7) @(posedge clk) data <= ~data;
    repeat (7) @(posedge clk);
    $finish;
  end

  initial $monitor("rstn=%0b data=%b en=%0b dir=%0b out=%b", rstn, data, en, dir, out);
endmodule

Результат симуляции (фрагмент)

rstn=0 data=1 en=0 dir=0 out=xxxxxxxxxxxxxxxx
rstn=1 data=1 en=1 dir=0 out=0000000000000000
rstn=1 data=0 en=1 dir=0 out=0000000000000001
rstn=1 data=1 en=1 dir=0 out=0000000000000010
rstn=1 data=0 en=1 dir=0 out=0000000000000101
...
rstn=1 data=1 en=1 dir=1 out=1111110101010000
Simulation complete via $finish(1) at time 430 NS

Verilog

  1. Освоение Verilog: полное руководство по проектированию цифровых схем
  2. Освоение конкатенации в Verilog: практическое руководство
  3. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  4. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  5. Мастерство функций в Verilog для эффективного RTL дизайна
  6. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  7. Генератор тактового сигнала в Verilog: проектирование и реализация
  8. Мастерство математических функций Verilog для эффективного аппаратного дизайна
  9. Мастерство $timeformat в Verilog: точность и контроль отображения времени
  10. Понимание и печать timescale в Verilog в любой области видимости