İçindekiler:

Bir FPGA'dan Herhangi Bir Sensör Yapın: 4 Adım
Bir FPGA'dan Herhangi Bir Sensör Yapın: 4 Adım

Video: Bir FPGA'dan Herhangi Bir Sensör Yapın: 4 Adım

Video: Bir FPGA'dan Herhangi Bir Sensör Yapın: 4 Adım
Video: Sohbetlerden Kesitler - FPGA ve avantajları nedir? 2024, Aralık
Anonim
Image
Image
FPGA
FPGA

Çoğu üretici hayatlarında en az bir kez bir termometre yapmayı denedi, belki evde sahip oldukları yeterince akıllı değil ya da belki bir sonraki NEST'i inşa edebileceklerini düşünüyorlar. Bununla birlikte, bir noktada, bir sıcaklık sensörüne (ve belki başka sensörler: basınç, ışık) bağlı son teknoloji yazılımlarına sahip bir mikro denetleyicileri vardı. Şimdiye kadar her şey mükemmel, yazılım çalışıyor ve sensör algılıyor. Hadi test edelim!

Hmmmm… belki de sensörü saç kurutma makinesiyle ısıtmalı ve buzla soğutmalı, bir süre işe yarıyor. Ama profesyonel görünmüyor, ısıtırsanız sensör değerleri çok hızlı değiştiriyor, birkaç dereceden fazla ısınmıyor. Proje bir fiyasko! Ancak algoritma yeni, birçok faktörü hesaba katıyor, bu aptalca küçük şeye takılıp kalması ne kadar yazık.

Benim çözümüm şudur: bir FPGA'nın bir PC'den akan (veya bellekte depolanan veya FPGA içinde geçici oluşturulan) değerlere sahip bir sensör görevi görmesini sağlayın. Bu nedenle, değerli MCU'nuz için FPGA bir sensör gibi görünür, ancak herhangi bir sensör değil: hangi sensörü beğenirseniz seçin. Belki de beklenenden daha fazla çözünürlüğe veya daha hızlı tepki süresine ihtiyacınız olduğuna karar verdiniz, sensörü değiştirmeniz gerekiyor. İnternetten sipariş edin, birkaç gün içinde, birkaç ay içinde kim bilir gelir. PCB'nizi yeniden döndürün veya yeni sensörlü bir modül sipariş edin. Veya … birkaç tıklama ve FPGA, yepyeni sensörünüz olarak yapılandırılır ve tam dahili yapılandırmayı taklit edebilir.

Bunu yazarken, FPGA, BRAM'de (FPGA'da) depolanan sıcaklık verileriyle bir LM75 gibi davranabilir.

Adım 1: MCU

MCU seçimim, bir LPCXpresso'da bir LPC4337'dir. Üstüne bir ekran ve gerçek bir LM75 sensörlü bir kalkanım (LPC Genel Amaçlı Kalkan) var. LPC4337, 200MHz'de çalışan bir ARM Cortex M4 ve daha küçük bir Cortex M0'dır (burada kullanılmamaktadır). Gerçek sensör I2C1 çevre birimine bağlı ve sanal olanımız I2C0'a bağlanacak. Kaynak GitHub'ımda mevcut.

Nasıl inşa edilir? LPCXpresso IDE'yi LPCOpen kitaplığıyla birlikte indirin. Bu kitaplığı IDE'ye aktarın ve projeyi GitHub'dan da açın. Her şey yapılandırılmalıdır ve sol alt köşedeki "Hata Ayıkla" seçeneğine tıklayabilirsiniz.

Tüm proje NXP'nin örneklerinden birine dayanmaktadır (projemin gerçek bir sensörü simüle ettiğini ve MCU tarafında özel koda ihtiyaç duymadığını göstermek için). Ana dosyada (iox_sensor.cpp olarak adlandırılır) şu kod bulunur:

#define SENSÖRLER_ON_SHIELD

#if tanımlı(SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif tanımlı(SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

SENSOR_ON_SHIELD ve SENSOR_OR_FPGA'yı değiştirerek, kullanıcı, farklı I2C pinlerinde olduğu gibi, gerçek veya sanal olan, hangi sensörün konuşacağını derleme zamanında değiştirebilir.

Adım 2: FPGA

Seçtiğim FPGA kartım, Digilent tarafından yapılmış, Xilinx Arty 7'ye sahip bir Artix 7'dir. Biri hata ayıklama için diğeri gerçek yük için, MCU kartıyla bağlantı olmak üzere iki adet PMod konektörü kullanılır.

Yine, FPGA'nın kaynak kodu GitHub'ımda (fpgaSide klasörü) mevcuttur.

Nasıl inşa edilir? Xilinx Vivado IDE'yi indirin, satın alın veya açın. Proje dosyalarını GitHub'dan içe aktarın. Dosyalardan biri (content.coe), sahte sensöre aktarılacak olan ham formattaki sıcaklık verileridir. Aynı ada sahip, insan tarafından okunabilen sıcaklık verilerini ham LM75 verilerine dönüştürmeye yardımcı olan bir Excel dosyası da vardır. Bunu Java ile yazılmış bir yazılım parçasıyla otomatik bir sürece değiştirmeyi planlıyorum ama o zamana kadar bu çözüm işe yarıyor. Sentez ve Uygulama biraz zaman almalı, bunu dikkate alın.

Adım 3: Nasıl Çalışır?

O nasıl çalışır?
O nasıl çalışır?
O nasıl çalışır?
O nasıl çalışır?

Dediğim gibi, MCU için FPGA bir sensöre, daha doğrusu bir I2C sensörüne benziyor. I2C çevre biriminin çıkışı, FPGA'nın girişine bağlanır. FPGA'nın içinde 3 ana bileşen vardır: - I2C Denetleyici - I2C Aygıtı - Veri I2C Denetleyici, FPGA'nın pinlerinden I2C verilerini alır ve bunları FPGA'nın geri kalanına gönderir ve aynısını ters sırada yapar. I2C Protokolü için dahili bir durum makinesi bulundurur (bu arada, işte bunun belgeleri). Bu bileşen I2C Cihazına ne gönderir? Halihazırda alınan bayt, o baytın mevcut iletişimdeki konumu ve MCU'nun FPGA'ya yazıp yazmadığı veya FPGA'dan okuyup okumadığı. I2C Cihazı gönderilen baytları alır ve sensörün simüle edilmiş dahili yapısını günceller. Yalnızca kayıt işaretçisini güncelleyebilir veya veri kaynağından yeni veriler isteyebilir. Veri bileşeni, yeni veri noktalarının akışını sağlar. Şu anda, adresi saniyede iki kez artırılan (yaklaşık olarak) bir ROM belleğidir.

Nihai hedefim nedir? İkinci resimde gösterilmiştir. Yani: FPGA içinde aynı anda daha fazla I2C cihazının (sensörler ve diğerleri) simüle edilmesini mümkün kılmak. Sensörün arka ucundaki veriler FPGA'da önbelleğe alınacak ve USB veya Ethernet üzerinden PC'den aktarılacak. Daha gelişmiş sensörleri ve diğer I2C Cihazlarını (bellek, LED sürücüleri vb.) destekleyin.

Adım 4: Hepsini Bir Araya Getirmek

Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy

Şimdi her şeyi birbirine bağlama zamanı. Teorik olarak basittir: mcu kartının bir PMod konektörü vardır (I2C0 & SSP0 (SPI gibi çalışabilir)). Artix kartı, istediğiniz gibi kullanılabilecek 4 PMod konektörüne sahiptir. MCU ile konuşmak için D konektörünü ve Mantık Analizörüme bağlanmak için B konektörünü seçiyorum.

Uyarı

İki kartı bu şekilde birbirine bağlayamazsınız. Niye ya? PMod, bir Master/Host kartının (güç veren) bir Slave/Sensör kartına (güç alan) bağlantısını kolaylaştırmak için yapılmıştır. Ama bu projede her iki kart da güç veriyor ve bir kartın 3.3V çıkışını diğer kartın 3.3V çıkışına bağlarsanız kötü şeyler olabilir. Ama olmayabilirler ve siz sadece FPGA'nın güç raylarının parametrelerini değiştirebilirsiniz (çok dikkatli bir şekilde tasarlanmışlardır). O yüzden bu riski almayın ve yukarıdaki resimlerde görüldüğü gibi konnektörü bir pin sola hareket ettirin (ve ayrıca FPGA kartını çevirin). İşte PMod spesifikasyonu, onu inceleyebilirsiniz, kısaca yaptığım şey iki panonun VCC'lerini birbirine bağlamamak.

Önerilen: