VHDL'de If-else ve Case deyimi arasındaki fark


11

VHDL kodundaki farklı yapıların RTL'de nasıl sentezlendiğini anlamak istiyorum.

  • Herkes bana VHDL'de bir işlemin If-Else yapı ve Case deyimi yapıları arasındaki kodun sentez aracıyla RTL devresine nasıl çıkarıldığı açısından farkını söyleyebilir mi?
  • Birden fazla iç içe if-else ve case-deyimlerini bir işlem içinde if-else yapısı ile karıştırmayı düşünün .
  • Ayrıca hangi yapı ne zaman kullanılır?

PS: "vhdl içinde devam eden ifadeler birden çok" ile ilgili bir soru gördüm ama bu yine de soruma cevap vermez.


Fiziksel kapıların nasıl yapılandırılacağı hakkında yorum yapamam, ancak x86 derlemesi yayan çoğu derleyicide bir if-else genellikle koşullu atlama (örneğin jg, jl, jz, jnz, vb.) İle tek bir kontrol olarak bulunur, oysa switch, vakaları sayısal sırada düzenler ve yinelemeli dec/ jztalimatlar uygular , bu da çok daha verimlidir. Belki de benzer bir optimizasyon burada uygulanır.
Polinom

@Polynomial If-else ve case davranışları, tipik doğrusal programlamanıza kıyasla donanım dillerinde önemli ölçüde farklıdır. HDL ifadesi "anında" yürütüldüğünden, op-kodu optimizasyonları çok alakalı değildir.
W5VO

Yanıtlar:


11

Herkes bana VHDL'de bir işlemin If-Else yapı ve Case deyimi yapıları arasındaki kodun sentez aracıyla RTL devresine nasıl çıkarıldığı açısından farkını söyleyebilir mi?

if-elsif-elseYapı, ağ yönlendirme öncelik ulaşır:

şematik

bu devreyi simüle et - CircuitLab kullanılarak oluşturulan şematik

Bu karşılık gelir

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

caseYapı, diğer taraftan büyük bir infers ol' mux:

resim açıklamasını buraya girin

Bu karşılık gelir

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Açıkçası, bunlar sadece bir değer ifadesi ile çok basitleştirilmiş tasarımlardır ve bir çıktı ile sonuçlanır.

Birden fazla iç içe if-else ve case-deyimlerini bir işlem içinde if-else yapısı ile karıştırmayı düşünün.

Yukarıdakilere göre, nasıl iç içe / karışacaklarını görebilirsiniz.

Ayrıca hangi yapı ne zaman kullanılır?

Dan beri if-else infers öncelik, birden fazla giriş koşulu oluşabilir zaman kullanılmalıdır. Kullanılması casegirişler birbirini dışlayan olduğunda, diğeri elini, uygundur.


Vaka ifadesinin sadece tek giriş koşulu için çalıştığını ve eğer birden fazla giriş koşulu için çalışabileceğini anlıyorum. Ancak her iki yapı da esasen muksiler üretir (clk yokluğunda). Mantık sentezinin, eğer varsa, tek girişi büyük bir mukoza zinciri yerine tek bir büyük mukse optimize edebilmesi mümkün değil mi? Ayrıca, öncelikli yönlendirme ağı nedir ... Bu sadece 1 büyük mux yerine muxes zinciri değil mi?
nurabha

Buna ek olarak, bir saate duyarlı bir işlemimiz olduğunda, eğer -hiçbirleri yazmaçlar, mandallar vb.
nurabha

Evet, öncelikli bir yönlendirme ağı tam olarak bu - bir mucize zinciri. if-elseBununla birlikte, yapının doğası, bu zincirin ortaya çıktığı yerdir. İkinci koşulun test edilmesi için ilk koşul başarısız olmalıdır . Bu, yapı için geçerli değildir caseve bu yüzden bir if-elseifade tek bir büyük mux olarak sentezlenemez.
Angelo Stavrow

1
Ve evet, bir caseifade de sıralı mantık üretebilir. Glasgow Üniversitesinden size yardımcı olabilecek bir dizi ders kaydı olan "Gerçek Dünya VHDL" yi buldum .
Angelo Stavrow

Bu iyi bir referans.
nurabha

4

Gelen bu eski blog post , yazar yazmış ve VHDL kodunun iki işlevsel olarak eşdeğer versiyonlarını sentezlenen. Biri if-else kullanarak, diğeri kullanarak case. Sonuç:

Bu kodu sentezledim ve kesin sonuçlar aldım. RTL şeması bile her iki program için de aynıydı.

Ve sonucu:

Bu, 'case' ve 'if ... elsif ... else' ifadelerinin her ikisinin de eşit derecede etkili olduğunu gösterir. çıktı çok sayıda koşula bağlıdır.Ancak şartların sayısı çok küçükse (2 veya 3) 'if..elseif..else' komutunu kullanabilirsiniz.

Ayrıca orada mesajların onlarca akla gelebilecek her dil için Yığın taşması bu konuda. Sonuç genellikle aynıdır, performans açısından fark yoktur. Bazen, çok sayıda vaka varsa, bir derleyici, biraz daha iyi performans sağlayacak bir arama tablosu oluşturacak kadar akıllı olabilir.

Bir VHDL sentezleyici benzer bir şey yapabilir. Ancak yine de çok sayıda vakaya ihtiyacınız olacaktır (bu durumda (pun amaçlı) muhtemelen çok sayıda seçeneğin bulunduğu yerlerde daha iyi okunabilirlik sağladığı için yine de bir vaka ifadesi kullanmak istersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.