4-bit Teller: Efficiënt Binair Tellen van 0 tot 15
De 4-bit teller begint te incrementeren van 4'b0000 naar 4'h1111 en rolt daarna terug naar 4'b0000. Het blijft tellen zolang er een lopende klok wordt geleverd en reset hoog gehouden wordt.
De rollover gebeurt wanneer de meest significante bit van de uiteindelijke optelling wordt verworven. Wanneer de teller op de maximumwaarde 4'b1111 staat en nog een telverzoek krijgt, probeert de teller 5'b10000 te bereiken, maar aangezien het alleen 4-bits ondersteunt, wordt de MSB verworven wat resulteert in 0.
0000 0001 0010 ... 1110 1111 rollover 0000 0001 ...
Het ontwerp bevat twee inputs: één voor de klok en één voor een actieve-lage reset. Een actieve-lage reset is een reset waarbij het ontwerp gereset wordt wanneer de waarde van de reset pin 0 is. Er is een 4-bit output genaamd out wat de tellerwaarden levert.
Blokdiagram van de 4-bit teller
Elektronische Teller Ontwerp
module counter (
input clk, // Klok input om teller te laten optellen
input rstn, // Actieve-lage reset input
output reg[3:0] out // 4-bit output voor tellerwaarden
);
// Always blok getriggerd op stijgende flank van clk (0->1)
always @ (posedge clk) begin
if (!rstn) out <= 0; // Reset laag -> output naar 0
else out <= out + 1; // Reset hoog -> increment
end
endmodule
De module counter heeft een klok en actieve-lage reset (aangeduid met n) als inputs en de tellerwaarde als 4-bit output. Het always blok wordt altijd uitgevoerd wanneer de klok overgaat van 0 naar 1 (stijgende flank). De output wordt alleen geïncrementeerd als reset hoog (1) is, bereikt door het if-else blok. Wordt reset laag gevonden op de stijgende flank, dan wordt output gereset naar 4'b0000.
Testbench
We kunnen het ontwerp instantiëren in onze testbench module om te verifiëren dat de teller correct telt.
Testbench schema
De testbench module heet tb_counter en heeft geen poorten nodig omdat dit de top-module is in simulatie. We hebben wel interne variabelen nodig om klok en reset te genereren, opslaan en sturen. Daarvoor declareren we twee reg variabelen voor klok en reset. We hebben ook een wire type net nodig om verbinding te maken met de output van het ontwerp, anders zou het defaulten naar een 1-bit scalaire net.
De klok wordt gegenereerd via een always blok met een periode van 10 tijdseenheden. Het initial blok stelt initiële waarden in en stuurt de reset naar het ontwerp. Het ontwerp wordt geïnstantieerd in de testbench en verbonden met onze interne variabelen. Er zijn geen $display statements, dus er verschijnt geen bericht in de console.
module tb_counter;
reg clk; // Interne TB variabele voor klok
reg rstn; // Interne TB variabele voor actieve-lage reset
wire [3:0] out; // Wire voor verbinding met ontwerp output
// Instantieer counter ontwerp en verbind met TB variabelen
counter c0 (
.clk (clk),
.rstn (rstn),
.out (out)
);
// Klok genereren: flitst elke 5ns -> periode 10ns -> 100 MHz
always #5 clk = ~clk;
// Stimulus blok
initial begin
// 1. Initialiseer variabelen op 0
clk <= 0; rstn <= 0;
// 2. Stimulus, reset wordt in tussen asserted
#20 rstn <= 1;
#80 rstn <= 0;
#50 rstn <= 1;
// 3. Einde na 200ns
#20 $finish;
end
endmodule
Simulatie Log:
ncsim> run [0ns] clk=0 rstn=0 out=0xx [5ns] clk=1 rstn=0 out=0x0 [10ns] clk=0 rstn=0 out=0x0 [15ns] clk=1 rstn=0 out=0x0 [20ns] clk=0 rstn=1 out=0x0 [25ns] clk=1 rstn=1 out=0x1 [30ns] clk=0 rstn=1 out=0x1 [35ns] clk=1 rstn=1 out=0x2 [40ns] clk=0 rstn=1 out=0x2 [45ns] clk=1 rstn=1 out=0x3 [50ns] clk=0 rstn=1 out=0x3 [55ns] clk=1 rstn=1 out=0x4 [60ns] clk=0 rstn=1 out=0x4 [65ns] clk=1 rstn=1 out=0x5 [70ns] clk=0 rstn=1 out=0x5 [75ns] clk=1 rstn=1 out=0x6 [80ns] clk=0 rstn=1 out=0x6 [85ns] clk=1 rstn=1 out=0x7 [90ns] clk=0 rstn=1 out=0x7 [95ns] clk=1 rstn=1 out=0x8 [100ns] clk=0 rstn=0 out=0x8 [105ns] clk=1 rstn=0 out=0x0 [110ns] clk=0 rstn=0 out=0x0 [115ns] clk=1 rstn=0 out=0x0 [120ns] clk=0 rstn=0 out=0x0 [125ns] clk=1 rstn=0 out=0x0 [130ns] clk=0 rstn=0 out=0x0 [135ns] clk=1 rstn=0 out=0x0 [140ns] clk=0 rstn=0 out=0x0 [145ns] clk=1 rstn=0 out=0x0 [150ns] clk=0 rstn=1 out=0x0 [155ns] clk=1 rstn=1 out=0x1 [160ns] clk=0 rstn=1 out=0x1 [165ns] clk=1 rstn=1 out=0x2 Simulation complete via $finish(1) at time 170 NS + 0
Let op dat de teller reset naar 0 wanneer de actieve-lage reset 0 wordt, en wanneer reset de-geassert wordt rond 150ns, begint de teller te tellen vanaf de volgende stijgende flank van de klok.
Hardware Schema
Gesynthetiseerd schema van de 4-bit teller
Verilog
- PID Reset Windup voorkomen: strategieën voor betrouwbare procesregeling
- 3-Bit Binaire Teller met 555 Timer en 4027 Flip-Flops
- Synchrone Binaire Tellers: Ontwerp, Up/Down Operatie en Encoder Toepassingen
- Counter Modulus: Geoptimaliseerde Algoritmen voor Moderne Systemen
- Ring tellers en Johnson tellers: ontwerp, werking en praktische toepassingen
- Digitale ramp (teller) ADC: werking, voordelen en beperkingen
- Opladen, Resetten En Herconfigureren Van Uw IT-strategie Voor Zomersucces
- IT/OT-convergentie: een culturele reset voor duurzame digitale transformatie
- Verilog Mod-N Teller Ontwerp: Geparametriseerde Module & Testbench
- Verilog Gray-code Teller Module – 4-bit Gray Code Generator
- Python Counter in collections – Efficiënt tellen, updaten en rekenkundige operaties