Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog N-bit Bidirectionele Schuifregister – Ontwerp en Implementatie

In digitale elektronica is een schuifregister een ketting van flip-flops waarbij de output q van één flip-flop verbonden is met de data input d van de volgende. Omdat alle flip-flops op dezelfde klok werken, verschuift de bit-array in het schuifregister met één positie. Bijvoorbeeld, als een 5-bit rechts schuifregister een initiële waarde van 10110 heeft en de input vastligt op 0, dan is het volgende patroon 01011 en daarna 00101.

5-bit schuifregister diagram

Ontwerp

Dit schuifregister ontwerp heeft vijf inputs en één n-bit output en is geparameteriseerd met parameter MSB voor de breedte. Als n=4 wordt het een 4-bit schuifregister, bij n=8 een 8-bit register.

Belangrijke kenmerken:

  • In-/uitschakelbaar via en pin
  • Kan links of rechts schuiven via dir
  • Actieve-lage reset via rstn zet output op 0
  • Input data controleerbaar via d pin
module shift_reg #(parameter MSB=8) (
  input d,      // Data input eerste flip-flop
  input clk,    // Klok voor alle flip-flops
  input en,     // Enable om register aan/uit te zetten
  input dir,    // Richting: 0=rechts, 1=links
  input rstn,   // Actieve-lage reset
  output reg [MSB-1:0] out // Huidige waarde van alle flip-flops
);
  always @ (posedge clk)
    if (!rstn) out <= 0;
    else begin
      if (en) case (dir)
        0: out <= {out[MSB-2:0], d};  // Rechts schuiven
        1: out <= {d, out[MSB-1:1]};  // Links schuiven
      endcase
      else out <= out;                // Behoud waarde
    end
endmodule

Hardware Schema

Gesynthetiseerd schema van het bidirectionele schuifregister

Testbench

De testbench verifieert de functionaliteit. Het ontwerp wordt geïnstantieerd en inputs worden met verschillende waarden aangestuurd.

Testbench schema

module tb_sr;
  parameter MSB = 16;
  reg data;      // d-input
  reg clk;       // Klok
  reg en;        // Enable
  reg dir;       // Richting
  reg rstn;      // Reset
  wire [MSB-1:0] out;

  // Instantieer 16-bit schuifregister
  shift_reg #(MSB) sr0 (
    .d (data), .clk (clk), .en (en), .dir (dir), .rstn (rstn), .out (out)
  );

  // Klok: periode 20ns, 50MHz
  always #10 clk = ~clk;

  // Initialisatie op tijd 0
  initial begin
    clk <= 0; en <= 0; dir <= 0; rstn <= 0; data <= 'h1;
  end

  // Hoofd stimulus
  initial begin
    // 1. Reset asserteren en de-asserteren
    rstn <= 0; #20 rstn <= 1; en <= 1;
    // 2. 7 klokken: alternerende data waarden
    repeat (7) @ (posedge clk) data <= ~data;
    // 4. Richting wijzigen en 7 klokken alternerende data
    #10 dir <= 1;
    repeat (7) @ (posedge clk) data <= ~data;
    // 5. 7 klokken zonder data wijziging, alleen schuiven
    repeat (7) @ (posedge clk);
    // 6. Simulatie beëindigen
    $finish;
  end

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

De tijd dat het schuifregister ingeschakeld is, is in het log groen gemarkeerd. De richtingwijziging is geel. De constante data input is blauw.

Simulatie Log:

ncsim> run
rstn=0 data=1, en=0, dir=0, out=xxxxxxxxxxxxxxxx
rstn=0 data=1, en=0, dir=0, out=0000000000000000
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=0, out=0000000000001010
rstn=1 data=0, en=1, dir=0, out=0000000000010101
rstn=1 data=1, en=1, dir=0, out=0000000000101010
rstn=1 data=0, en=1, dir=0, out=0000000001010101
rstn=1 data=0, en=1, dir=1, out=0000000001010101
rstn=1 data=1, en=1, dir=1, out=0000000000101010
rstn=1 data=0, en=1, dir=1, out=1000000000010101
rstn=1 data=1, en=1, dir=1, out=0100000000001010
rstn=1 data=0, en=1, dir=1, out=1010000000000101
rstn=1 data=1, en=1, dir=1, out=0101000000000010
rstn=1 data=0, en=1, dir=1, out=1010100000000001
rstn=1 data=1, en=1, dir=1, out=0101010000000000
rstn=1 data=1, en=1, dir=1, out=1010101000000000
rstn=1 data=1, en=1, dir=1, out=1101010100000000
rstn=1 data=1, en=1, dir=1, out=1110101010000000
rstn=1 data=1, en=1, dir=1, out=1111010101000000
rstn=1 data=1, en=1, dir=1, out=1111101010100000
rstn=1 data=1, en=1, dir=1, out=1111110101010000
rstn=1 data=1, en=1, dir=1, out=1111111010101000
Simulation complete via $finish(1) at time 430 NS + 0

Golfformaat van het schuifregister

Verilog

  1. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  2. Verilog concatenatie beheersen: Een praktische gids
  3. Verilog-toewijzingen begrijpen: types, syntax en best practices
  4. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  5. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  6. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
  7. Verilog Clock Generator: Ontwerp & Implementatie Gids
  8. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  9. Verilog $timeformat beheersen: Precisie en Weergave-controle
  10. Verilog Timescales begrijpen en printen in elke Scope
  11. Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten