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
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.
Vim içinde nasıl etkin bir şekilde bir...
Yakalamak birden fazla satır istisnala...
Java sınıf yolu içinde birden fazla ka...
Nasıl böyle büyük mükafat içinde birde...
Vim birleştirme birden fazla satır (ik...