FPGA: saymak mı yoksa geri saymak mı?


11

Bir FPGA (vhdl kullanarak bir xilinx spartan3e olan Papilio geliştirme kartı) kullanmayı öğreniyorum.

Gelen nabzı (sabit kodlu) bir numaraya bölmem gerekiyor.

Ben yaklaşık 3 seçenek görebilirsiniz - kabaca, sözde kod olarak (örnek olarak 10 sayım kullanarak):

  1. 0'a sıfırlayın, giriş yükselen kenarda 1 artarak 10 ile karşılaştırın; eşitse, 0'a sıfırlayın ve çıkış darbesini tetikleyin
  2. 10'a sıfırlayın, giriş yükselen kenarda 1 azalır, 0 ile karşılaştırın; eşitse, 10'a sıfırlayın ve çıkış darbesini tetikleyin
  3. 9 olarak başlat, ancak çıkış bitim olan en az 1 önde gelen "0" bit olduğundan emin ol. Giriş yükselen kenarında 1 azalır. Çıkış bitinin yükselen kenarında sıfırlayın.

Görev döngüsü önemsizdir.

Bunlardan biri diğerlerinden daha mı iyi? Aklıma gelmediğim daha iyi bir yöntem var mı?

Derleyiciye en iyi optimizasyon şansını verecek "standart" bir yol var mı?


3
Bu sadece üç seçenek :-) ... Ama cidden, bir FPGA'da gerçekten o kadar önemli değil. Bireysel mantık öğeleri, aynı sayıda kaynağı alması ve hangi yöntemi uygularsanız uygulamanızı aynı performansı gösterecek kadar geneldir. Karar, sayıların yukarı veya aşağı sayılmasının veya başka bir kalıbın tasarımın başka bir yerinde faydalı olup olmadığına karar verir.
Dave Tweed

2
4. seçenek: "1000000000" yüklü ve yükselen bir kenara kaydırılmış 10 bit dairesel kaydırma yazmacı. Yaptığınız işi etkinleştirmek için kaydırma yazmacının bir bitini kullanın.
Lincoln

1
Bir yan not olarak - derleyici / tesisatçı GUI aracınızın, işi bitirdikten sonra, çeşitli soyutlama seviyelerinde oluşturduğu gerçek devreyi kapılara kadar gösteren bir seçeneğe sahip olması gerekir, böylece aletin devrenizi nasıl monte ettiğini ve kaynakta uygun değişiklikleri yapabilirsiniz.
İsimsiz

Yanıtlar:


12

Bu seviyeye optimize etmek kalbinizi kıracak. Sonuç, kullandığınız FPGA teknolojisi, FPGA'daki diğer faktörler nedeniyle değil, aynı zamanda tesisatçının rastgele sayı tohumu da dahil olmak üzere kontrolünüz dışındaki faktörler nedeniyle de değişebilir.

Bunu söyledikten sonra, seçenek 3'ün en iyi olacağına inanıyorum. Seçenek 1 ve 2'de, sayaçlar arasında gidecek bir karşılaştırıcı / VEYA geçidi bulunur, böylece hedef sayıya ulaşıldığını bildirebilir. Seçenek 2, 1'den biraz daha hızlı olabilir, çünkü her şey herhangi bir invertör olmadan düz olabilir veya yine de VE veya XOR'dan daha hızlı olabileceği küçük teknoloji farklarıyla karşılaşırsınız.

Seçenek 3, sayaçtaki bir ekstra bitin düşük maliyeti için karşılaştırmayı atlar. Parmak arası terliklerde ciddi şekilde kısıtlanmadığınız sürece buna değer olmalıdır.

Sayaçlarla ilgili eğlenceli bir gerçek, bir mantık bloğu içinde cihaza özel bir boyuta gruplanma eğilimindedir ve bu ekstra bit sizi bu gruptan çıkarırsa zamanlama değişikliğini beklenenden daha fazla göreceksiniz.


+1, teknolojinin sınırlamalarını zorlayan saat hızlarını kısıtlamak, zamanlama raporunun zamanlama optimizasyonlarını yönlendirmesine izin vermelidir. Bir Spartan 3e'de veya bu konudaki herhangi bir FPGA'da yüzlerce pikosaniyeyi sebepsiz olarak kovalamak genellikle zaman kaybıdır.
jalalipop

4

Diğer bir seçenek, sayacı 6'ya (= 2 4 - 10) başlatmak , saymak ve sonra taşıma çıkışı etkinleştirildiğinde (yani, FF'lerin hepsi) sıfırlamaktır.

Bunun avantajı, fazladan bir FF gerektirmemesidir ve birçok FGPA, bir sayaç veya toplayıcı devresinde bu tür taşıma işlemini hızlandırmak için yardımcı mantığa sahiptir.


3

Bağlı olmak. Örneğin: 0 → 1 ve 1 → 0 için flip-flop yayılma gecikmesi farklı olabilir ve bu nedenle 000 → 001 ve 001 → 000 için bir sayacın geçiş gecikmeleri biraz farklı olabilir. FPGA'da kullanılan CMOS teknolojisine bağlı olarak daha yüksek veya daha düşük olabilir. Yani hangisinin daha iyi zamanlama performansına sahip olduğunu sentezlemeli ve bulmalısınız.


3

Derleyici yazarının bakış açısından: kullanırsanız integer, iç gösterim tanımsızdır ve derleyici en verimli uygulamayı seçmekte serbesttir.

Belirli bir dahili temsili zorlarsanız, optimize edici yine de onu geliştirmeye çalışır, ancak biraz daha kötü bir noktadan başlar.

N--1

İç yapıyı bilmediğiniz sürece, diğer mantığa tahsis edilen kaynaklar (birçok FPGA'da kalan üniteleriniz varsa sayaç uygulamak için de kullanabileceğiniz özel kayan nokta çarpma mantığı vardır) ve tamamen geçiş yapmayacağınızdan emin olabilirsiniz. farklı bir modele göre, cevap "bunu düşünme".

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.