Een Verilog T Flip-Flop Ontwerpen: RTL Implementatie & Testbench
De T flip-flop is een fundamenteel bouwsteen in digitale ontwerpen, die zijn uitgang omkeert wanneer de T-ingang hoog is en de huidige staat behoudt wanneer T laag is. Dit artikel presenteert een schone, synthetiseerbare RTL-implementatie en een uitgebreide testbench voor verificatie.
Ontwerp
module tff (
input wire clk,
input wire rstn,
input wire t,
output reg q
);
always @(posedge clk) begin
if (!rstn)
q <= 1'b0;
else if (t)
q <= ~q;
else
q <= q;
end
endmodule
Belangrijke ontwerpkeuzes:
- Actief-lage asynchrone reset (rstn): Zorgt voor deterministische initialisatie.
- Enkel positieve klokflank: Standaard voor synthetiseerbare sequentiële logica.
- Non-blocking toewijzingen (<=): Voorkomt race conditions in simulatie.
- Impliciete staatbehoud: De
else q <= q;regel is optioneel maar verbetert leesbaarheid.
Testbench
module tb;
reg clk;
reg rstn;
reg t;
wire q;
tff u0 (
.clk (clk),
.rstn (rstn),
.t (t),
.q (q)
);
always #5 clk = ~clk;
initial begin
{rstn, clk, t} = 3'b000;
$monitor("T=%0t rstn=%0b t=%0d q=%0d", $time, rstn, t, q);
repeat(2) @(posedge clk);
rstn = 1'b1;
for (integer i = 0; i < 20; i = i + 1) begin
reg [4:0] dly;
dly = $random;
#(dly) t = $random;
end
#20 $finish;
end
endmodule
Simulatie Resultaten
ncsim> run T=0 rstn=0 t=0 q=x T=5 rstn=0 t=0 q=0 T=15 rstn=1 t=0 q=0 T=19 rstn=1 t=1 q=0 T=25 rstn=1 t=1 q=1 T=35 rstn=1 t=1 q=0 T=43 rstn=1 t=0 q=0 T=47 rstn=1 t=1 q=0 T=55 rstn=1 t=0 q=1 T=59 rstn=1 t=1 q=1 T=65 rstn=1 t=1 q=0 T=67 rstn=1 t=0 q=0 T=71 rstn=1 t=1 q=0 T=75 rstn=1 t=0 q=1 T=79 rstn=1 t=1 q=1 T=83 rstn=1 t=0 q=1 T=87 rstn=1 t=1 q=1 T=95 rstn=1 t=0 q=0 Simulation complete via $finish(1) at time 115 NS + 0
Analyse
De simulatie bevestigt correct gedrag:
- Reset fase (0-15ns): Uitgang
qinitialiseert op 0 tijdens actieve lage reset. - T=0 (15-19ns): Uitgang blijft 0 – staat behouden.
- T=1 (19ns+): Elke positieve klokflank met T=1 keert de uitgang om, zoals verwacht voor een T flip-flop.
- Willekeurige stimulus: De testbench oefent zowel toggle- als hold-modus uit met variabele timing, wat robuustheid verifieert.
Uitbreidingstips
- Voeg een
enablesignaal toe voor klok-gating scenario's. - Implementeer synchrone reset voor FPGA-doelarchitecturen die asynchrone reset niet native ondersteunen.
- Parameteriseer voor multi-bit toggle registers.
Deze implementatie fungeert als betrouwbare referentie voor ASIC/FPGA ontwerpen waar state-toggling functionaliteit vereist is.
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