2012-08-02 14 views

cevap

6

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.

+0

Tam olarak istediğim referans, teşekkürler :) (Lütfen taşıma bitiyle ilgili önceki yorumumu dikkate almayın, işlevi yanlış okuyorum!) – detly

+0

@detly: – wap26

+0

'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

1

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 deltaunsigned 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ı.

1

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.