VHDL: INTEGER türünden STD_LOGIC_VECTOR'a dönüştürme


28

Bir mod-16 sayacı oluşturdum ve çıktı sonucu bir INTEGER (INTEGER kullandığım tüm örnekler).

Hex-to-7-segment ekran kod çözücüsünü yaptım ve girişi bir STD_LOGIC_VECTOR (bu şekilde yazdı, çünkü doğruluk tablosunu belirlemek kolaydı).

Sayacın çıkışını kod çözücünün girişine bağlamak istiyorum, ancak QuartusII'de derlemeye çalışırken 'tür uyuşmazlığı' hataları alıyorum.

VHDL listesinde bir INTEGER türünden STD_LOGIC_VECTOR türüne dönüştürmenin bir yolu var mı?

Yanıtlar:


20

Diğerlerinin dediği gibi, kullanmak ieee.numeric_std, asla ieee.std_logic_unsigned, bu gerçekten bir IEEE paketi değildir.

Ancak, VHDL 2008 destekli araçları kullanıyorsanız, ieee.numeric_std_unsignedesasen std_logic_vectorimzasız gibi davranan yeni paketi kullanabilirsiniz .

Ayrıca, açıkça belirtilmediğinden, burada (işaretsiz) bir tamsayıdan şuna dönüştürmek için kullanılan gerçek kod örneği std_logic_vector:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

16

LoneTech'in dediği gibi use ieee.numeric_std, arkadaşın. A ' std_logic_vectoryı dönüştürebilirsiniz integer, ancak onu ilk önce signedveya sonra kullanmanız gerekir unsigned(derleyici, kastettiğin hiçbir fikri olmadığı için). VHDL kesinlikle yazılmış bir dildir. Ben ettik daha yazılı bu konuda blogumda

Temel olarak, 7seg dönüştürücünüzü almak için değiştirirdim integer(ya da aslında naturalsadece pozitif sayılarla ilgileneceği düşünülürse) - dönüşüm daha sonra basit bir dizi aramasıdır. Varlıklar üzerinde bir girdi olarak kullandığınız tamsayı ile içindeki ve içindeki dizinleri içeren sabit bir dizi oluşturun.


Bunun için teşekkürler. Yorumlarınızı çok takdir ediyorum. Programlama konusunda biraz titrek olan bir profesyonun başlamasına yardımcı olmak için VHDL'yi öğrenerek bir tür TA pozisyonundaydım. Bilgilerinizi ona ileteceğim - kullandığımız ders kitabı VHDL 'ahlak' sorularına girmedi.
J. Polfer

1
Tutarlılık garantisi olduğundan 'ahlak' meselesinden daha az değildir. Numeric_std lib IEEE tarafından kurulan gerçek bir standarttır, std_logic_unsigned kütüphanesi bir satıcı tarafından oluşturulmuştur ve sektörde gerçek bir resmi tanım olmadan kabul edilmiştir. Standart olmayan lib'ler ile satıcılar arası uyumluluk garantisi yoktur, ancak normalde çalışır. Şimdi de standarda geçmek iyi bir form.
MattG

1

Diyelim ki 4 bitlik sayacınızda INTEGER çıkışı SOME_INTEGER var ve siz 4 bitlik bir STD_LOGIC_VECTOR'a dönüştürmek istediniz.

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

Bunu, anlamlı sayılarla vektörleri başlatmak için de kullanabilirsiniz.

SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"

"IEEE.STD_LOGIC_ARITH.ALL kullanın" eklemeniz gerekebilir. ve / veya STD_LOGIC_UNSIGNED.

Tamamlayıcı işlem conv_integer (vektör) 'dir. Karşılaştırma yaparken bunu kullanmak hoşuma gidiyor. Bu yüzden ilan edebilirim

constant SOME_CONSTANT : integer := 999;

Ve sonra, bunu bir if ifadesinde kullanabilirim

if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
  then OTHER_VECTOR <= (others => '0');
end if;

EDIT: Değişkeni bir Tamsayı olarak bildirmeniz gerekmez. Bunun yerine bildirimi std_logic_vector olarak değiştirmeyi deneyin. + Ve - operatörleri std_logic_vectors üzerinde çalışır.


3
Lütfen bunu yapma! Numeric_std kullanın (bkz. LoneTech'inkiler ve cevaplarım)
Martin Thompson

Bunu yapmak için daha iyi bir yolunuz varsa, sorun değil, ancak önerim işe yarıyor, bu nedenle aşağı oylama işleminizin gereksiz olduğunu düşünüyorum. Std_logic_arith'i yıllardır kullandım ve hiçbir zaman sorun yaşamadım. Satıcıların uygulamalarını değiştirmelerine ilişkin korkuların asılsız olduğunu düşünüyorum; Aklı başında hangi satıcı, müşterilerin tasarımlarını bozma riski taşıyacak?
ajs410

1
Hangi tedarikçinin IEEE'nin ad alanına özel satıcıya hangi ürünleri koyacağına dair bir cevabınız var. Özellikle imzalı ve imzasız değerlerle uğraşırken kaba kalır .
Yann Vernier

"+ Ve - operatörleri std_logic_vectors üzerinde çalışır." AFAIK, anlamını yanlış anlamadığım sürece çalışmazlar. genellikle önce imzalı / imzasız verileri tutan bir türe ulaşmak gerekir.
stanri,

1

Sen türleri kullanarak ilginizi çekebilir unsignedve signedgelen ieee.numeric_std. Onlar ile uyumlu std_logic_vector, ancak sayısal bir yorum var (ikili ya da 2-tamamlayıcı). Böyle bir yorumu koymak için bir seçenek de var std_logic_vector, ancak bu önerilmez .


0

Ana cevabın dediği gibi, önerilen yöntem aşağıdaki gibidir:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

Bununla birlikte, bunun neden önerildiğini ve neden VHDL'nin tamsayıları std_logic_vectors biçimine dönüştürmenin bu kadar görünüşte kıvrımlı bir yolunu açıklamak istiyorum.

Bu türlerin araçlar tarafından nasıl göründüğü ortaya çıkıyor.

Bir standard_logic_vector kelimenin tam anlamıyla 1 ya da 0 bir demet. 10001 var. Bu sayı kaç? Şey, buna bağlı. İmzalı mı yoksa imzasız mı? Bu SLV bilmiyor ya da umursamıyor. Kaç bit SLV'niz ne kadar sürüyor?

Bir tamsayı imzalanır ve genellikle 32 bit (doğru hatırlıyorsam).

1. Aşama: Tamsayımı daha kısa ve imzasız hale getirin. Bu kısım:

to_unsigned(my_int, my_slv'length));

“Bu tam sayıya sahibim, imzasız olmasını istiyorum ve SLV'nin uzunluğuna sığmasını istiyorum.”

Aşama 2: Ardından, bu bitleri alın ve my_slv'yi çalıştırmak için bunları kullanın.

my_slv <= std_logic_vector(...)

"Bu bitleri al ve slv'imi sürmek için kullan"

( A <= BVHDL'de terminoloji üzerine bir not, "A B tarafından sürülür" olarak okunur)

Kombine, bu sizi alır:

my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

Geleneksel bir programlama arka planından geldiğinde, programlama yolunda düşünmek çok kolaydır. Ancak VHDL'de yazdığınız kodun donanımda fiziksel etkileri vardır. Bu yöntemin neden işe yaradığını ve önerildiğini bilmek, donanım terimleriyle yazdıklarınızı düşünmeye bir adım daha yaklaşır.

Bonus ipucu: to_ önekindeki işlevler, işlenenleri kısaltan / değiştiren işlevlerdir. Onları imzasız veya belirli bir uzunlukta veya her ikisini de yaparlar. Bu yüzden to_unsigned, uzunluğu belirtmenizi gerektirir. To_ olmayan işlevler (bu örnekte düz std_logic_vector (...)), türler zaten doğrudan uyumlu olduğunda kullanılır. Msgstr "Bu bitleri al ve onları bu tipte doldur, değişiklik gerekmez." Bunların uzunluk argümanı yok çünkü iki taraf da aynı. Böylece böyle şeyler inşa ederken, yukarıdan bakmam gerekmiyor, sadece verileri nasıl değiştirdiğimi düşünüyorum.


0

Bir tamsayı std_logic_vector dönüştürmek için birkaç seçeneğiniz vardır. Numeric_std kullanarak:

vect <= std_logic_vector( to_unsigned( your_int, vect'length));

veya

vect <= std_logic_vector( to_signed( your_int, vect'length));

Std_logic_arith kullanarak:

vect <= conv_std_logic_vector( your_int, vect'length);

std_logic_arith bir standart değildir, fakat çoğu araç onu IEEE kütüphanesinde derler ve yaygın olarak kullanılır.

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.