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
enpin - Kan links of rechts schuiven via
dir - Actieve-lage reset via
rstnzet output op 0 - Input data controleerbaar via
dpin
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
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
- Verilog $timeformat beheersen: Precisie en Weergave-controle
- Verilog Timescales begrijpen en printen in elke Scope
- Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten