Menu

Verilog Saatli Mantık: Flip-Flop'lar, Register'lar ve Pipeline'lar

Saatli always bloklarından register'lar, counter'lar, shift register'lar ve pipeline'lar nasıl kurulur - her senkron dijital tasarımın iş atı kalıbı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Yapı Taşı: D Flip-Flop

Senkron tasarımdaki her şey küçük bir donanım parçasına döner: D flip-flop. Bir saat girişi, bir veri girişi ve bir veri çıkışı vardır. Her yükselen saat kenarında D'nin değerini yakalar ve bir sonraki kenara kadar tutar. Hepsi bu.

Verilog'da:

always @(posedge clk) begin
    q <= d;
end

Üç satır, bir flip-flop. <= non-blocking'dir, bu da gerçek flip-flop'ların tam davranışıdır (Blocking vs Non-blocking bölümünde kapsanır). posedge clk duyarlılığı onu sıralı yapan şeydir.

Bunlardan çoğunu aralarına kombinasyonel mantık koyarak üst üste yığarsan, kurmak isteyeceğin herhangi bir senkron devreye sahip olursun.

Reset'li Bir Register

Gerçek tasarımlar her zaman bir reset gerektirir - güç açıldığında veya isteğe bağlı olarak sistemi bilinen bir duruma getirmenin bir yolu:

Bu bir senkron reset'tir - reset koşulu, herhangi bir giriş gibi bir saat kenarında değerlendirilir. Sentezleyici, veri girişinde 2-to-1 mux olan bir flip-flop üretir: reset yüksek olduğunda mux sıfır besler; aksi halde d besler.

Çoğu tasarım için senkron reset doğru seçimdir. Daha basit timing'dir, FPGA'larla iyi geçinir ve reset sinyali her yerden gelebilir - kendi saat hizalı kaynağına ihtiyacı yoktur.

Enable'lı Bir Register

Çoğu zaman yalnızca bir şey söylediğinde güncellenen bir register istersin. Saatli bloğun içinde bir if kullan ve eksik else'in örtük "önceki değeri koru" davranışına güven:

Bu kanonik "load-enabled register"'dır. Her yerde karşına çıkar - konfigürasyon register'ları, yalnızca downstream hazır olduğunda ilerleyen pipeline aşamaları, duraklatıp devam eden counter'lar. Son else'in atlanması, saatli bir bloğun içinde kasıtlı ve güvenlidir: bir flip-flop zaten önceki değerini hatırlar, yani "hiçbir şey yapma" "tut" demektir.

Kombinasyonel bir blokta aynı kod bir latch çıkarır. Farklı kurallar, aynı sözdizimi.

Bir Counter

Counter, sonraki değeri mevcut değer artı bir olan bir register'dır:

Counter, enable yüksek olduğunda her saat döngüsünde artar. 16 döngü sonra 0'a sarar (çünkü 4 bit tanımladık ve 15 + 1 0'a taşar). Bu sarma N bitlik aritmetiğin doğasında vardır ve gerçek bir donanım counter'ının tam olarak davrandığı gibidir.

Bir Shift Register

Flip-flop'ları üst üste yığmak sana bir shift register verir. Püf nokta, tüm shift'leri tek bir non-blocking ifadede yapmaktır:

Gövde out <= {out[WIDTH-2:0], in}'dir - mevcut out'un alt bitlerini yeni in ile birleştir ve tümünü ata. Non-blocking olduğu için, RHS, LHS güncellemeden önce eski out'u okur. Etki, tek bir saat döngüsünde temiz bir N bit shift'tir.

Bu shift register kalıbının en küçük formudur. LFSR'lara, seri vericilere, deserializer'lara - verinin her saatte flip-flop zincirinden geçtiği herhangi bir tasarıma genelleşir.

Pipeline'lar

Pipeline, kombinasyonel mantık ile ayrılmış bir register zinciridir. Her aşama önceki aşamadan gelen veriyi işler ve bir sonrakini besler:

Üç aşama, üç döngü gecikme, ama pipeline dolduğunda her döngüde yeni bir sonuç. Latency 3 saattir çünkü veri üç flip-flop'tan geçer; throughput saat başına 1 işlemdir çünkü üç aşama da farklı girişler üzerinde aynı anda çalışır.

Yüksek performanslı tasarımların throughput hedeflerine ulaşma yolu budur: aşamaları kısa tut, daha derin pipeline yap ve paralelliğin işi yapmasına izin ver.

Asenkron Reset (Gerektiğinde)

Bazen reset'i onaylamak için bir saat kenarı bekleyemezsin - chip kapanıyor, saat kapatılmış, harici bir watchdog hattı çekiyor. Bu durumlarda:

always @(posedge clk or negedge reset_n) begin
    if (~reset_n) q <= 0;
    else          q <= d;
end

Sensitivity list'in artık hem bir saat kenarı hem de bir reset kenarı vardır. Flip-flop her ikisine de anında yanıt verir. reset_n geleneksel olarak active-low'dur (düşük olduğunda onaylanır), bu yüzden test ~reset_n'dir.

Asenkron reset'in dezavantajları vardır: zaman analizi daha zordur, de-assertion'da dikkatli ele alınmazsa metastability'ye neden olabilir, tüm FPGA mimarileri arasında taşınabilir değildir. Varsayılan olarak senkron reset kullan, asenkron'u yalnızca tasarım gerektirdiğinde.

Sırada Ne Var

Artık herhangi bir senkron veri yolu kurabilirsin. Bir sonraki doc - Finite State Machines - saatli bir register'ı bir case ifadesiyle bir araya getirerek standart FSM deyimini üretir: her kontrolör, protokol motoru ve dijital tasarımdaki karar verme bloğunun iş atı.

Sıkça Sorulan Sorular

Verilog'da saatli mantık nedir?

Güncellemeleri bir saat sinyali tarafından kapılı olan mantık. Standart deyim always @(posedge clk) target <= next_value; - clk'nin her yükselen kenarında target, next_value'yu yakalar. Bu tek satır donanımda bir flip-flop tanımlar. Aralarına kombinasyonel mantık koyarak çoğunu üst üste yığmak counter'lar, shift register'lar, pipeline'lar - senkron her şeyi inşa eder.

Verilog'da senkron ve asenkron reset arasındaki fark nedir?

Senkron reset always @(posedge clk) if (reset) ... kullanır - reset, herhangi bir giriş gibi saat kenarında örneklenir. Asenkron reset always @(posedge clk or negedge reset_n) if (~reset_n) ... kullanır - blok, saat kenarında veya reset onayında tetiklenir, böylece reset hemen etkili olur. Senkron varsayılan seçimdir; asenkron, saat ölü olsa bile reset'in etkili olmasının garanti edilmesi gerektiğinde kullanılır.

Verilog'da pipeline nasıl kurulur?

Birden çok always @(posedge clk) stageN_reg <= stageN_combinational; aşamasını üst üste yığ - her aşamanın kombinasyonel mantığı bir sonraki aşamanın register'ını besler ve her register aynı saat kenarında yakalar. Sonuç, yeni verinin her döngüde girdiği ve N döngü sonra çıktığı bir pipeline'dır, saat başına bir sonuç throughput'u ile.

Verilog'da shift register nedir?

Her birinin çıkışı bir sonrakinin girişini besleyen bir flip-flop zinciri. Her saat kenarı, her bit'i bir pozisyon kaydırır. Kanonik Verilog sürümü non-blocking atamaları kullanır: out <= {out[N-2:0], in}; - bu tek satır, her döngüde in'den bir bit alan N bitlik bir shift register oluşturur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA