C üzerinde Verilog veya VHDL kullanma motivasyonu nedir?


12

Programlama geçmişinden geliyorum ve donanım veya bellenimle çok fazla uğraşmadım (en azından biraz elektronik ve Arduino).

Verilog ve VHDL gibi donanım tanımlama dillerini (HDL) C veya bazı Assembly gibi programlama dillerinde kullanmadaki motivasyon nedir?

Bu mesele hiç bir seçim midir?

Ürün yazılımının bir HDL'de yazıldığı donanımın, talimatların paralel olarak çalıştırılmasında açık bir avantajı olduğunu okudum. Ancak, C veya Assembly'de bellenim yazma konusunda şüpheleri ifade eden tartışmaları gördüğüme şaşırdım (mutlaka bir CPU'nuz yoksa Meclis nasıl uygundur?) Ama aynı zamanda bir seçenek olduğu sonucuna vardım.

Bu nedenle, birkaç sorum var (hiçbir şeyi açıklamaktan çekinmeyin):

  1. Bir bellenim gerçekten HDL veya bir yazılım programlama dilinde yazılabilir mi, yoksa aynı görevi gerçekleştirmenin başka bir yolu mu? Gerçek dünyadaki örneklere bayılırım. Her bir seçenek ne gibi kısıtlamalar doğurur?

  2. Yazılım üzerinde ortak bir yazılım kullanımının donanım hızlandırıcılarında (GPU'lar, ağ bağdaştırıcıları, SSL hızlandırıcıları, vb.) Olduğunu biliyorum. Anladığım kadarıyla, bu hızlanma her zaman gerekli değildir, ancak sadece önerilir (örneğin, SSL ve karmaşık algoritmaların hızlandırılması durumunda). Her durumda yazılım ve yazılım arasında seçim yapılabilir mi? Değilse, bellenimin açıkça ve kesin olarak uygun olduğu durumlardan memnun olurum.

  3. Ürün yazılımının çoğunlukla ROM veya flash üzerinde yandığını okudum. Orada nasıl temsil edilir? Bit gibi, yazılım gibi mi? Eğer öyleyse, derin fark nedir? Aygıt yazılımı durumunda uyarlanmış devrelerin kullanılabilirliği var mı?

Sanırım burada ve bazı varsayımlarda bir hata yaptım, lütfen beni affet. Teşekkür ederim!


14
Programlama dilleri yazılımı tanımlamak içindir, donanım açıklama dilleri donanımı tanımlamak içindir.
Ignacio Vazquez-Abrams

1
Verilog veya VHDL ile ürün yazılımı yazmazsınız - yonga tasarlamak, FPGA programlamak ve anakart tasarlamak için Verilog veya VHDL kullanırsınız. Ürün yazılımı yazmak için C veya montaj kullanırsınız. Anakartı tasarlamak için C / C ++ da kullanabilirsiniz - tasarımınızı simüle eden bir program oluşturmak için bir C derleyicisi tarafından derlenebilen ancak aynı zamanda bir SystemC derleyicisi tarafından devrelere derlenebilen SystemC adlı bir kütüphane vardır.
slebetman

FWIW, Arduino deneyimine sahip olduğunuz için, bir Arduino için yazılım yazmaya, ürün yazılımı yazmaya denir. Bellenim tam işletim sistemleri olabilir - linux örneğin çoğu yönlendiricinin belleniminde kullanılır ve Windows çoğu ATM'nin belleniminde kullanılır
slebetman

Yanıtlar:


28

Verilog ve VHDL gibi donanım tanımlama dillerini (HDL) C veya bazı Assembly gibi programlama dillerinde kullanmadaki motivasyon nedir?

C ve montaj, bir CPU'ya ne yapılacağını söylemek için iyi dillerdir. Tek durumlu bir makine tarafından sırayla yapılacak eylemleri tanımlarlar.

HDL'ler, dijital devrelerin keyfi bir koleksiyonunu tanımlamak veya tanımlamak için iyi dillerdir. Programlama dillerinin yapamayacağı şekilde paralel olarak yapılan işlemleri ifade edebilirler. Ayrıca, bloklar arasındaki arabirimler için programlama dillerinin zamanlama sınırlamalarını programlama dillerinin yapamayacağı şekilde tanımlayabilirler.

C veya Assembly'de bellenim yazma konusunda şüpheleri ifade eden tartışmaları gördüğüme şaşırdım (mutlaka bir CPU'nuz yoksa Meclis nasıl uygundur?)

Bu soruda, "Mikrodenetleyici için kod yazıyorsanız, derleme veya C veya başka bir üst düzey dilde yazarsanız gerçek bir fark var mı?" Sorusu sorulur.

Özellikle mikrodenetleyicili (çevre birimleri olan bir CPU) sistemler hakkında sorular sorduğundan, C veya montaj hem firwmare gelişimi için makul seçimlerdir hem de HDL'ler değildir.

Bir bellenim gerçekten HDL veya bir yazılım programlama dilinde yazılabilir mi, yoksa aynı görevi gerçekleştirmenin başka bir yolu mu?

Ne tür bir donanıma sahip olduğunuza bağlıdır. CPU'nuz varsa, bir programlama dili kullanın. Bir FPGA'nız varsa veya bir ASIC tasarlıyorsanız, bir HDL kullanın. Çok büyük miktarda dijital mantık tasarlıyorsanız, SystemVerilog gibi ara dillerden birine bakabilirsiniz.

Ürün yazılımının çoğunlukla ROM veya flash üzerinde yandığını okudum. Orada nasıl temsil edilir? Bit gibi, yazılım gibi mi? Eğer öyleyse, derin fark nedir? Aygıt yazılımı durumunda uyarlanmış devrelerin kullanılabilirliği var mı?

Bence "firmware" terimine asılıyorsunuz. Bu kelime aslında kodun gömülü bir sistemde çalıştırılması anlamına geliyordu ve bu son kullanıcının değiştirmesi mümkün değildi. Birini bir PC sattıysanız, kullanıcının üzerinde çalıştığı yazılımı değiştirme olasılığı çok yüksektir. Onlara bir osiloskop sattıysanız, dahili mikroişlemcide çalışan kodu değiştirmelerini istemezsiniz, bu yüzden ona firmware adını verdiniz.

FPGA kullanıcıları, donanımlarının (birlikte lehimlenen şeyler) daha değiştirilebilir olduğu için tasarımlarının çıktısı için "bellenim" kelimesini kullandılar. Ama gerçekten bir FPGA konfigüre eden "bellenim" bir uC üzerinde çalışan "bellenim" den farklıdır. uC ürün yazılımı, işlevini gerçekleştirmek için uC'yi bir dizi durum boyunca yönlendirir. FPGA sabit yazılımı, mantık elemanları ile arama tablolarında saklanacak değerler arasında bir dizi ara bağlantı tanımlar.

Her iki durumda da, bellenim genellikle bir eepromda (veya yerleşik sistem her başlatıldığında yüklenen bir ana bilgisayardaki diskte) bit olarak depolanır. Ama bu onları birbirine benzetmiyor.


VHDL / Verilog'da yazdığınızda, uygulanacak mantığı görselleştirmek ve böylece optimize etmek çok daha kolaydır. Aynı şey C için de söylenemez. SystemC bile hala beklenmedik sentez sonuçlarının ortaya çıkabileceği gerçek fiziksel uygulamadan yeterince boşandı
JonRB

@JonRB, Bir uC veya uP kodluyorsanız, aslında bunu bir HDL ile yapmanın hiçbir yolunun farkında değilim. Kodlama mantığı, SystemVerilog veya SystemC'nin o kadar büyük sistemler için olduğunu ve her şeyi ayrı kapı düzeyinde tasarlamayı denemek pratik olmadığını kabul ediyorum.
Foton

2
VHDL ve Verilog'un hiçbir donanımınız olmadığında da kullanıldığını unutmayın. FPGA bit akımı yerine doğrudan devrelere derlenebilirler. Apple örneğin GUI şematik yakalama yerine Verilog kullanarak anakartlarını tasarlamak için kullanılır, çünkü tasarımınız tescilli ikili çizimler yerine düz metin olduğunda, komut dosyası kullanarak komutları kullanarak daha iyi bir destek vardır.
slebetman

10

Sorunuzun ilk kısmı için, birini veya diğerini kullanma motivasyonları hakkında: C ve HDL'ler (VHDL / Verilog) arasında temel bir fark vardır . C bir yazılım programlama dilidir (montaj olduğu gibi), VHDL / Verilog donanım tanımlama dilleridir. Aynı amaç için değiller.

C derlendiğinde montaj koduna (ikili biçiminde, yani makine dilinde) çevrilir . Bu kod, CPU'ya bir dizi temel işlem yapmasını (bir kayıt değerini değiştirme, bir ekleme yapma vb.) Söyleyen bir dizi talimattır.

Öte yandan, bir HDL donanıma sentezlenir . VHDL'de örneğin şöyle bir şey yazabilirsiniz:

output <= input1 + input2;

(ayrıca burada daha eksiksiz bir örneğe bakın ). Bu bir (donanım) toplayıcısına sentezlenir. Kod bir FPGA için sentezlenirse , bu, belirli FPGA'yı bir toplayıcı ( kombinasyonel mantık olarak ) uygulamak üzere yapılandırabilen bir bit akışı anlamına gelir .

Aslında, VHDL'de bir CPU tasarlayabilir (bkz. Soft core Processors VS Hard core Processors ) ve bunun için yazılımı C ...

Ürün yazılımı hakkında: aslında her şey kelimeyi nasıl tanımladığınıza bağlıdır. Bir bellenim , bir mikro denetleyicide çalışan bir program (yazılım) olabilir (bu nedenle örneğin C veya montajcıda yazılır) veya programlanabilir (donanım) bir mantık aygıtını (CPLD veya FPGA) yapılandırmak için bir bit akımı olabilir. Bazen her ikisini de içeren bir paket olabilir: bazı FritzBox modelleri (bir ADSL modem) için ürün yazılımını alırsanız, aslında bütün bir Linux sistemi (montajcı, C ve diğer birçok programlama dilinde yazılmış) ve bir bit akışı içerirler. bir FPGA yapılandırın (muhtemelen VHDL veya Verilog'dan sentezlenir).


3
  1. Bu, mimarinize bağlıdır. Bir CPU'nuz (veya tipik olarak bir Mikrodenetleyici) varsa, ürün yazılımını normal bir programlama dilinde (montaj dahil) yazmanız gerekir. FPGA gibi bir şeyiniz varsa, ürün yazılımınızın bir HDL'de yazılması gerekir. HDL'ler (bildiklerime göre) geleneksel bir CPU tarafından verimli bir şekilde yürütülebilen programlar üretemez ve bir FPGA geleneksel programları kutudan çıkarmaz. Bununla birlikte, FPGA'nızı bir CPU olarak yapılandırabilir ve daha sonra bununla geleneksel bir program yürütebilirsiniz. Bu, iki katman ürün yazılımı gerektirir: alt katman CPU'yu oluşturmak için bir HDL'de yazılır ve daha yüksek katman bu CPU'da yürütmek için geleneksel bir programlama dilinde yazılır.
  2. Ürün yazılımı ile yazılım arasında zor bir ayrım yoktur. Birçok cihazda, ürün yazılımı örneğin flash bellekte depolanır, ancak modern bir telefonda, hemen hemen her şey flash bellekte depolanır ve ürün yazılımı ile yazılım arasındaki fark belirsizdir (çoğu insan büyük bant işlemcisi ürün yazılımını programlamak için kodu düşünür) ve çoğu insan uygulama programları yazılımını düşünür, ancak kesin sınır nerede?).
  3. 2'de söylediğim gibi, bellenimin biraz daha kalıcı olduğu fikri dışında net bir ayrım yoktur.

3

Donanım eşzamanlılığı büyük bir motivasyon.

Elektronlar aynı anda paralel kablolarda akabilir, bu nedenle donanım tasarlarken bunu dikkate almak istiyoruz.

VHDL'de, şöyle bir şey yazarsanız:

x <= a or b;
y <= a and b;
z <= x xor y;

( açıkça processveya functionardışık olarak işaretleyen bir veya dışında ), o zaman şu gerçeği kodladınız:

  • x, y, z, aVe bkablolardır
  • ave bgiriş sinyalleri
  • xgiriş olarak ve giriş olarak bir ordevrenin çıkışına bağlanırab
  • ve diğer hatlar için

O gerçek donanım içine sentezlenmiş ve bu nasıl görmek kolaydır xve yaynı zamanda değerlendirilir.

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

Daha sonra, zaman devresi simüle ettiğinde, simülatör (genellikle sıralı bir programdır) devrenin fiziğini şöyle bir simüle eder:

  • vardır aya bdeğişti? Evet? Hey, xbağlıdır a. Güncelleyelim x.
  • yayrıca bağlıdır a. Bunu da güncelleyin.
  • zbağlıdır x. Güncellendiği için xgüncelleyin.
  • şey vardır x(bağlıdır aya b) güncellendi? Hayır? Aynı için yve z. Tamam, bu adımla işimiz bitti.

Bu, ardışık analogu olmayan, ancak olası fiziksel durumları temsil eden "ilginç" olası sonuçlara yol açar:

  • x <= not xsimülasyonun sonsuz bir şekilde tekrarlanmasına yol açacaktır. Simülatörler sadece belirli bir derinlikten sonra kesebilirler.
  • x <= 0; x <= 1hataya neden olur (kısa devre). Bu nedenlerden biri neden std_logicyoktur.

Yine de, VHDL donanımı C'den daha yakından modellese de, bunun ayrıntılı bir açıklaması değildir:

Sonunda VHDL, üst düzey insan tarafından anlaşılabilir devre işlevselliği ile daha düşük düzey sentezlenebilirliği arasında güzel bir denge sağlar.

C ise CPU ile sırayla konuşmaya daha fazla odaklanmıştır.

Elbette bir devreyi C yapıları, sıralamalar ve dizilerle kodlayabilir ve daha sonra tıpkı VHDL'nin yaptığı gibi simüle edebilirsiniz (bu , Sistem C'nin yaptığı gibi aşağı yukarı görünüyor , ancak hiç denemedim).

Ama aslında bir VHDL simülatörünü ve daha ayrıntılı bir dille yeniden uygularsınız. Doğru iş için doğru araç sanırım.

Orada dönüştürme C VHDL için araçları da vardır /programming/8988629/can-you-program-fpgas-in-c-like-languages ancak bu sert üst düzey dönüşümler beri alt performans bekliyoruz.


0

HDL'ler, programlama dili olarak zaten sentezlenmiş donanımı yani cpu'yu programlamak için kullanılan donanımı tanımlamak (sentezlemek) için kullanılır.

Bir cpu'yu bir FPGA üzerinde sentezlemek için cpus'un yumuşak çekirdek sürümlerini VHDL veya bit akışı olarak alabilirsiniz.


-1

Bir işlemci, bileşenlerin çoğunun farklı zamanlarda farklı işlemler gerçekleştirmek için kullanılmasına izin vererek, çok sayıda işlemi sırasıyla gerçekleştirmek için mütevazı miktarda devre kullanır.

Bir FPGA - en azından bireysel olarak - özellikle sofistike operasyonlar gerçekleştiremeyen, ancak hepsi aynı anda ve bağımsız olarak hareket edebilen bir dizi devre içerir.

Birinin, 15 girişi izlemek ve bir dizi görevi yerine getirmek için bir çip olmasını istediğini varsayalım:

  • Tüm girişler en az 21 ms boyunca sabit kaldığında ve yüksek girişlerin sayısının üçün katı olduğu her zaman yüksek bir çıkış ayarlamak
  • Tüm girişler en az 21 ms boyunca sabit kaldığında ve düşük giriş sayısı üçten fazla olmadığında, çıkış düşük olarak ayarlanır
  • Herhangi bir girişin değiştiği zaman ile tüm girişlerin en az 20 ms boyunca sabit kaldığı zaman arasında çıkışın keyfi bir şekilde değiştirilmesi.

Birinin başka şeyler yapan bir mikro denetleyicisi varsa, ancak bu girişleri incelemek ve çıkışı ayarlamak için her 20 ms'de bir kaç mikrosaniye ayırabiliyorsa, mikro denetleyicinin diğer görevleri yerine getirmek için kullandığı devrenin çoğu da belirtilen görevi yerine getirmek için kullanılabilir yukarıda, bu göreve çok az devrenin (bazı ROM ve belki RAM dışında) ayrılması gerekecektir. Öte yandan, bir girişin değiştiği zaman ile çıktının onu uygun şekilde yansıttığı zaman arasında bir süre geçmesi gerekebilir.

Verilog veya VHDL kullanılarak, 15 girişi sürekli olarak izleyebilen ve belirtilen hesaplamayı gerçekleştirebilen bir donanım devresi inşa edilebilir. Böyle bir cihaz muhtemelen çıkışın 100ns içinde - mikrodenetleyiciden daha büyük büyüklük sıraları içinde - doğru bir gösterge üretmesini sağlayabilir, ancak bu göreve adanmış ve başka herhangi bir amaç için kullanılamaz devre miktarı çok daha büyük olacaktır.


Bu, bir ayrımı göstermek için özellikle net bir kesim örneği gibi görünmüyor - ayrıntılarında, zaten tanıdık olmayan kimseleri tanımaya gerçekten yardımcı olmayabileceği yeterince tartışmalı nokta var. Bu sorunla gerçekçi bir şekilde karşılaşan biri, muhtemelen geniş bir veri kelimesi ve iyi pin değiştirme kesintileri olan modern bir MCU seçecektir. Hangi çözümün daha fazla mantık harcadığına karar vermek, MCU'daki çok sayıda kullanılmayan çevre birimini veya FPGA'daki el değmemiş dilimleri sayıp saymayacağınıza karar vermenizi gerektirir. Birincisi biraz daha ucuz olacak.
Chris Stratton

@ChrisStratton: Belki de zamanlama gereksinimleri sıkılaşırsa durumun değişebileceğini söylemeliydim? Bir CPU'nun her 20 ms'de bir kaç mikrosaniye mevcut olmasını gerektiren, altta yatan sistemde herhangi bir değişiklik gerektirmeyebilir, ancak yanıt süresinin 200us olması gerekiyorsa, böyle bir gereksinim, aksi takdirde gerekenden daha hızlı bir CPU gerektirebilir. 20us altında, sadece işlemek için ekstra bir CPU eklemek gerekebilir ve 200ns altında bir CPU ile başarmak imkansız olabilir.
supercat

Çünkü MCU'nun yeteneklerinden yararlanmıyorsunuz. Pin değiştirme kesintisinde, çıkışı 20 ms sonra ayarlayacak bir donanım zamanlayıcı bloğu başlatın. Daha sonra boş zamanlarında bunun gerçekten garanti edilip edilmediğine karar verin ve değilse iptal edin. FPGA noktanızı belirtmek için harika bir örnek değil çünkü çok fazla bağımlılık var - gerçekten paralel çalışan tek parça olay algılamadır ve modern bir MCU zaten büyük ölçüde paralel donanımda bunu verir. Bu arada geri kalanı etkili bir şekilde sıralı, bu yüzden çok yavaş bir saat izleyen ultra hızlı bir makine mi yapıyorsunuz?
Chris Stratton

@ChrisStratton: Uygun bir iğne değiştirme kesme özelliği varsa ve zaten başka bir şey için kullanılmıyorsa, sürekli yoklama ihtiyacını ortadan kaldırabilir, ancak bir kerede çok şey olursa, herhangi bir hızda sırayla işlenmeleri gerekir. CPU bunları idare edebilir.
supercat

Sıralı işlem, sorun ifadenizin girdi ve yanıt arasında büyük bir gecikme göstermesi nedeniyle bir sorun teşkil etmez. Ve mevcut MCU çok meşgul olsa bile , bu amaç için bir tane eklemek bir FPGA ekleme maliyetinin bir kısmı olacaktır. Gerçekçi olarak, bu sorunun bir FPGA'da çözülmesinin tek yolu ya zaten yedek dilimler ve ona yönlendirilmiş sinyaller olan bir tane olması ya da eğitim veya hobi bağlamında yapay bir proje olmasıdır.
Chris Stratton
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.