SORU
22 Aralık 2012, CUMARTESİ


Birden fazla Kansas Lav RTL ile bir blok içinde aynı kayıt atamaları

Sorun RTL bir blok aynı kayıt için birden fazla atamaları içeren Kansas Lav davranışlarını anlamakta güçlük çekiyorum. İşte 1 numara sürümü:

foo :: (Clock c) => Signal clk Bool
foo = runRTL $ do
    r <- newReg True
    r := low    
    return $ var r

Bu beklediğim gibi davranır:

*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .

VHDL oluşturulur:

architecture str of assignments is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  OUTPUT <= sig_2_o0;
end architecture str;

Ancak, bu diğer versiyonu da işe yarayacağını umuyordum:

foo = runRTL $ do
    r <- newReg True

    r := low
    r := high
    return $ var r

Ama değil, ve ikinci atama hesaba dahil değil değil:

*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .

Neden kafam karıştı çünkü reg var tanımlı açısından tam bir saat döngüsü gibi değil yani ben yapabilirim imkansız-sentez şeyler gibi şube dayanarak r ve sonra yeniden yeni bir değer için. Neden mi bu ikinci form çalışmıyor?

Sadece bir simülasyon sorunu da değil: ikinci sürümü için VHDL açıkça ikinci atama nesil zaman: atılmak olduğunu gösterir oluşturdu

architecture str of assignments2 is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  OUTPUT <= sig_2_o0;
end architecture str;

Yani temelde, çıkışı gibi olmasını beklerdim

architecture str of assignments2 is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  sig_2_o0 <= '1';
  OUTPUT <= sig_2_o0;
end architecture str;

ama o/VHDL anlamı olurdu gerektiğinden emin değilim.

CEVAP
8 Temmuz 2013, PAZARTESİ


Bu sorun, birden çok kullanıyorengellenmeyensinyal atama için açıklamaları.

  sig_2_o0 <= '0';
  sig_2_o0 <= '1';

Bunun için bizimle iletişime geçiniz

at next event assign '0' to sig_2_o0.
at next event assign '1' to sig_2_o0.

Bu kullanarak daha farklıengellemeödev:

  sig_2_o0 := '0';
  sig_2_o0 := '1';

Tercüme:

assign '0' to sig_2_o0.
assign '1' to sig_2_o0.

Atamaları engelliyor

Engelleme atamaları kullandığınızda değeri net bir şekilde tanımlandı. İçin yola çıkacak ilk '0', sonra iptal '1'. Bu örnekte de simülasyon veya sentez donanım için ilk engelleme görevden etkisi olmalı. İlk atama ve ikinci arasında 0 gecikme var gibi düşün. Bu aslında hiçbir şey olan 0 genişlikte bir darbe anlamına gelir. Sadece son atama olan eşdeğer, ilk tamamen ihmal edilir. Bir uyarı ise atamalar, örneğin "1 ns" o zaman ilk atama simülasyon ardından ikinci görürsünüz. sonra bir gecikme koyarsan olur Donanım, gecikmeler dikkate alınmaz ve bu yüzden gecikmeler ekleyerek değişiklik olacak. Aslında, sentezlenmiş olması gerektiği RTL ekleme gecikmeler kesinlikle bu nedenle önerilmez. Donanım simülasyon ile eşleşen son derece arzu edilir, ve gecikmeler ekleyerek uyuşmazlığı oluşmasına neden olabilir.

Engellenmeyen atamaları

Ama engellenmeyen atamaları kullandığınızda simülatörü iki atamaları bir sonraki sefer için planlanmış bir olay vardır. Sinyal Set '1' ve aynı zamanda '0'. Atanmış atama sinyali alacak? Bilmek yolu yoktur. Hatalı atanmış olduğundan, her iki değeri olabilir. Gezegendeki denetleyicisi ve sentez her tüy toplama aracı birden fazla engellenmeyen bu gibi atamaları oluşuyor, bir hata atmak gerekir. Onu taklit etmek mümkün olabilir, ama açıkça RTL ile ilgili bir sorun vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • funbro1

    funbro1

    11 Aralık 2007
  • Matt Harding

    Matt Harding

    23 Mayıs 2006