2**MAX - 1
değerini içeren bir unsigned(MAX downto 0)
varsa, VHDL (87 | 93 | 200X) standartları, bunu tek tek artırdığımda ne olacağını tanımlar mı? (Ya da, benzer şekilde, ne zaman sıfırdan teker olarak azaltmak?)VHDL numeric_std imzalı/imzasız için taşma tanımlandı mı
cevap
Kısa cevap:
hiçbir taşma yok, taşma taşıma basitçe kaybolur. Böylece sonuç, işleminizin modulo 2^MAX tamsayı sonucudur.
Uzun cevap:
numeric_std
paket standart pakettir ama değil Çekirdek VHDL standartları (87,93,200X) 'dir. Referans için : numeric_std.vhd
sonunda +
operatörü (C = '0'
ile) ADD_UNSIGNED (L, R : unsigned; C : std_logic)
işlevini çağırır. Herhangi bir tam sayı/doğal işlenenin ilk olarak unsigned
'a dönüştürüldüğünü unutmayın.
işlevin tanımı şöyledir: Bir "taşma" Görüldüğü gibi
function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is
constant L_left : integer := L'length-1;
alias XL : unsigned(L_left downto 0) is L;
alias XR : unsigned(L_left downto 0) is R;
variable RESULT : unsigned(L_left downto 0);
variable CBIT : std_logic := C;
begin
for i in 0 to L_left loop
RESULT(i) := CBIT xor XL(i) xor XR(i);
CBIT := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
end loop;
return RESULT;
end ADD_UNSIGNED;
oluşursa i = L_left
için CBIT='1'
(taşıma bit). Sonuç biti RESULT(i)
normal olarak hesaplanır ve son taşınan bot değeri göz ardı edilir.
Burada C veya Verilog gibi/boşalmasının taşmaya bir unsigned
isteyen ve sorun ben ile geldi edilir yaşadım (result
ve delta
unsigned
vardır): taşma '0' & result
için
result <= unsigned(std_logic_vector(resize(('1' & result) - delta, result'length))); -- proper underflow
result <= unsigned(std_logic_vector(resize(('0' & result) + delta, result'length))); -- proper overflow
Eklemenin değerini doğru olarak alabilmek için 1 bit daha büyük olan bir unsigned
yapar. MSB daha sonra doğru taşma değerini veren resize
komutuyla kaldırılır. Alt akış için aynı.
7 değerine eşit bir MAX değeri için 1 ila 2 ekleme ** 7 - 1 (127), 2 ** 7 (128) değerine neden olacaktır.
en işaretsiz değer işaretsiz bir dizi türü uzunluğu tarafından belirlenir:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity foo is
end entity;
architecture faa of foo is
constant MAX: natural := 7;
signal somename: unsigned (MAX downto 0) := (others => '1');
begin
UNLABELED:
process
begin
report "somename'length = " & integer'image(somename'length);
report "somename maximum value = " &integer'image(to_integer(somename));
wait;
end process;
end architecture;
agrega (others => '1')
temsil eden bir '1' işaretsiz dizi türü ve maksimum ikili temsil somename
her elemanda mümkün değer.
Bu verir:
foo.vhdl: 15: 9: @ 0 ms: (rapor not): somename'length = 8
foo.vhdl: 16: 9: @ 0 ms: (rapor not): somename maksimum değer = 255
uzunluğu 8 ve işaretsiz dizi türü sayısal değer aralığı temsil edilebilir 0 ile 2 ** 8 için - 1 (255), mümkün olan en yüksek değer 2 daha büyük olan ** 7 (128) ve taşma yoktur.Bu daha yeni bir soruda (VHDL modulo 2^32 addition) görülmüştür. Kabul edilen cevabınız bağlamında, en soldaki değer yerine uzunluk anlamına geldiğinizi varsayar.
Sıfır durumdaki azalmanın değeri 2 ** 8 - 1 (255) (MAX = 7) değerine neden olur. Matematik dine bağlı olarak bir alt akış veya taşma.
Bağlantıya yeni başlayan bu soruya işaret etmek için Jonathan Drolet'den şapka ucu.
- 1. VHDL
- 2. Yacc'da azaltma sırası tanımlandı mı?
- 3. Python'un bool sıralama tanımlandı mı?
- 4. C++'da taşma/taşma kontrolü var mı?
- 5. MATLAB: alan adları 'sipariş tanımlandı mı?
- 6. yanıt verisi tanımlandı ama data.value tanımlanmamış mı?
- 7. VHDL UART, Windows
- 8. std :: copy_exception nerede tanımlandı?
- 9. taşma
- 10. VHDL: generic map setup
- 11. hayır "başlık" bileşeni tanımlandı
- 12. __dso_handle nerede tanımlandı?
- 13. Basit VHDL devresinin beklenmeyen davranışı
- 14. VHDL: işlem ve sayaç çalışmıyor
- 15. VHDL flip-flop sıfırlaması 0
- 16. CSS taşma-y: görünür, taşma-x: kaydırma
- 17. CSS: taşma-y: kaydırma; taşma-x: görünür
- 18. Taşma içeriği otomatik taşma taşması gizli mi?
- 19. VHDL - İki 8 bitlik vektörleri 9 bitlik bir vektöre ekleme
- 20. Liste görünümündeki öğeler için eylem taşma menüleri
- 21. Liste Nasıl Aritmetik Taşma Atmak İçin Azaltılır
- 22. Modelim üzerinden vhdl simülasyonu için VCD dökümü. NASIL?
- 23. INET6_ADDRSTRLEN neden C olarak 46 olarak tanımlandı?
- 24. vhdl girişine bir bloğun çıkışını geri bildirim
- 25. Büyük VHDL test tezgahları nasıl yönetilir
- 26. Metnin arka plan rengi için taşma
- 27. bahar bulut uygulamasında port 8080 nerede tanımlandı?
- 28. VHDL: CLK ve RESET işlemi nasıl kullanılır?
- 29. Oynat çerçeve - Scala, Yöntem iki defa tanımlandı
- 30. VHDL input dünya çapında bir statik değil
Tam olarak istediğim referans, teşekkürler :) (Lütfen taşıma bitiyle ilgili önceki yorumumu dikkate almayın, işlevi yanlış okuyorum!) – detly
@detly: – wap26
'a hoş geldiniz. Bu yanıt aynı zamanda MAX + 1'in uzunluğu. MAX adını kullanmanın bir problemi. Bir alt tip göstergesine (indeks aralığı) 0'dan aşağı ve 32'lik bir uzunluk (somename'length) olan bir imzasız olarak bildirilen somename için 0'ın sağ indeksi ile Maksimum değeri 2 ** 32 -1'dir. – user1155120