web-gelistirme-sc.com

Verilogda bölünme

Kendime verilog öğretiyorum. Takip ettiğim kitap, giriş yapmak için '/' operatörünü veya '%' operatörünü kullandığımız bölümlerde belirtildi. Daha sonraki bölümlerde, bölünmenin verilog için çok karmaşık olduğunu ve sentezlenemediğini söylüyor, böylelikle bölünmeyi gerçekleştirmek için uzun bir algoritma ortaya çıkıyor.

O yüzden kafam karıştı, basit bölünmeyi idare edemiyor muyum?/operatörü işe yaramaz mı?

10
StuckInPhD

Her şey ne tür bir kod yazdığınıza bağlı.

Sentezlenmeyi düşündüğünüz, bir FPGA veya ASIC'e girmeyi düşündüğünüz bir kod yazıyorsanız, muhtemelen bölme veya modulo operatörlerini kullanmak istemezsiniz. Herhangi bir aritmetik işleci RTL'ye koyduğunuzda, sentezleyici işi yapmak için bir devre başlatır; + & - için bir toplayıcı; * için bir çarpan. / yazarken bölücü bir devre istiyorsunuz, ancak bölücü devre çok karmaşık bir şey. Genellikle birden fazla saat döngüsü alır ve arama tablolarını kullanabilir. a / b yazarken istediğinizi ortaya çıkarmak için bir sürü sentez aracı soruyor.

(Açıkçası 2'nin güçleriyle bölmek basittir, ancak normalde vardiya operatörlerini kullanırsınız)

Sentezlenmesini istemediğiniz kodlar yazıyorsanız, örneğin bu bir test tezgahının bir parçasıdır, o zaman istediğiniz tüm bölümü kullanabilirsiniz.

Bu nedenle sorunuzu yanıtlamak için / operatörü işe yaramaz değil, ancak onu nerede ve neden kullandığınızın farkındasınız. Aynısı * için de geçerlidir, fakat daha az derecede. Çarpanlar oldukça pahalıdır, ancak çoğu sentezleyici bunları çıkartabilir.

25
Paul S

Donanımı düşünmelisin.

Bir <= b/c yazdığınızda, "Her saat döngüsünde sonuç verebilecek ve hiçbir ara boru hattı kaydına sahip olmayan bir bölücü istiyorum" sentez aracına diyorsunuz.

Özellikle yüksek bit sayıları için çok karmaşık bir yapı oluşturmak için gereken mantık devresini hesaplarsanız. Genel olarak FPGA'lar, bölümlendirme için özel donanım bloklarına sahip olmayacağından, genel mantık kaynaklarından uygulanması gerekecektir. Hem büyük (çok fazla lut) hem de yavaş (düşük fmax) olması muhtemeldir.

Bazı sentezleyiciler yine de uygulayabilir (quartus'un yapacağı gibi hızlı bir aramadan sonra), diğerleri rahatsız etmeyeceklerdir çünkü pratikte çok faydalı olduğunu düşünmüyorlar.

Eğer bir sabitle bölüştüyorsanız ve yaklaşık bir sonuçla yaşayabilirseniz, çarpanlarla püf noktaları yapabilirsiniz. Bölmek istediklerinizin karşıtlığını alın, iki güç ile çarpın ve en yakın tam sayıya yuvarlayın.

Sonra verilogunuzda, yaklaşık bölmeyi çarparak (ki bu modern FPGAS'ta çok pahalı değildir) ve ardından kaydırmayı (sabit sayıda bit ile kaydırmak temelde donanımda serbesttir) uygulayabilirsiniz. Ara sonuç için yeterli bit sağladığınızdan emin olun.

Kesin bir cevaba ihtiyacınız varsa veya önceden tanımlanmış bir sabit olmayan bir şeye bölmeniz gerekirse, ne tür bir bölücü istediğinize karar vermeniz gerekir. Veriminiz düşükse, her n saat döngüsünde bir bölünme yapan durum makinesi tabanlı bir yaklaşım kullanabilirsiniz. Veriminiz yüksekse ve cihaz alanını karşılayabiliyorsanız, saat döngüsü başına bölünme yapan (ancak sonucun akması için birden fazla döngü gerektiren) bir boru hattı yaklaşımı daha uygun olabilir.

Genellikle takım satıcıları bu tür şeyler için önceden yapılmış bloklar (altera onları megafonlar olarak adlandırır) sağlayacaktır. Bunların avantajı, takım satıcısının muhtemelen onları cihaz için dikkatli bir şekilde optimize etmiş olmasıdır. Dezavantajı, satıcı kilitlemesi getirebilmeleridir, farklı bir cihaz satıcısına geçmek istiyorsanız, büyük olasılıkla bloğu yerinden oynatmanız gerekir ve takas ettiğiniz bloğun farklı özellikleri olabilir.

5
Peter green

Bu yüzden kafam karıştı. verilog idare edemiyor musunuz basit bölümü?/operator faydasız mı?

Verilog sentezi spec (IEEE 1364.1) aslında tamsayı operandlı tüm aritmetik operatörlerin desteklenmesi gerektiğini belirtir, ancak kimse bu spesifikasyonu izlemez. Bazı sentez araçları tamsayılı bölme yapabilir ancak diğerleri bunu reddeder (bence XST hala yapar) çünkü birleşik bölme tipik olarak çok alan verimsizdir. Çok çevrimli uygulamalar normdur, ancak bunlar '/' den sentezlenemez.

5
user597225

Bölünme ve modulo asla "basit" değildir. Bunu yapabiliyorsanız, bunlardan kaçının, örn. bit maskeleri veya vardiya işlemleri yoluyla. Özellikle değişken bir bölen donanımda uygulamak gerçekten çok karmaşık.

5
Wormbo

"Dilbilgisi" bölümü çok iyi bir şekilde kullanılır ve kodlamayı simüle etmek için bir bilgisayar kullanırken tüm yeteneklerine tam erişime sahip olursunuz. 

Kodunuzu belirli bir çipte sentezlerken, sınırlamalar vardır. Sınırlamalar, araç satıcının ne düşündüğünden ziyade "mantıklı" olduğunu düşündüğü üzerine kurulma eğilimindedir. 

Eski günlerde, ikisinin gücünden başka bir şeyin bölünmesi, çok fazla yer kapladığından ve çok yavaşça çalıştığı için silikon için mantıklı değildi. Şu anda, bazı sentezleyiciler sizin için "sürekli bölünerek" devreler yaratmaktadır. 

Gelecekte, sentezleyicinin size bir bölücü oluşturmaması (veya gelecekteki potansiyel bir mimarinin DSP bloklarındaki birinden faydalanmaması) için hiçbir neden göremiyorum. Görülüp kalmayacağının görülüp görülmeyeceği, ancak çarpanların ilerlemesine tanık olun (sadece iki yılda "sadece" bir "giriş sabiti" den "tam uygulamaya", birkaç yıl içinde)

3
Martin Thompson
  1. sadece 2'ye bölünmeyi içeren devreler: sadece ucu kaydırın :)
  2. 2 dışında .... Bakın, her zaman devre seviyesinde verilenogun C veya C++ DEĞİL olduğunu düşünmelisiniz.
  3. / ve% sentezlenebilir değil ya da (yeni sürümlerde) olursa, kendi bölme devrenizi korumanız gerektiğine inanıyorum, çünkü sağladıkları ip genel olacak (büyük olasılıkla sabit değil yüzmeyi sağlayacaklar)
  4. eminim sen morris mano bilgisayar mimarlık kitabından geçmişsindir, orada son bölümlerde tüm akış algo ile birlikte verilir, takip eder ve takip eder
  5. şimdi bakın, işleriniz yalnızca mantıksal doğrulama için geçerliyse ve gerçek bir devre gerekmiyorsa, kesinlikle/ve% için gidin. sorun değil simülasyon için işe yarayacak
1
Rahul Jain

'/' Kullanarak bölme verilog mümkündür. Ancak bu sentezlenebilir bir operatör değildir. Aynı şekilde '*' kullanarak çarpma için de geçerlidir. Bu işlemleri verliog'da gerçekleştirmek için bazı algoritmalar vardır ve eğer kodun sentezlenmesi gerekiyorsa kullanılırlar. yani. Bunun için eşdeğer bir donanım gerekiyorsa.

Bölünme için herhangi bir algoritma bilmiyorum ama çarpma işlemi için Booth'un algoritmasını kullandım. 

0
badari259