2016-04-02 15 views
0

içinde yasak ikili atamaya girmeden değişkenleri Sıfırla başlatamıyorum Bir FSM oluşturdum, adım adım bir denklemin parçalarını hesaplar, sonra girdiyi günceller ve tekrar yapar bir cok zaman. Şimdi bu sonuçları her yinelemede biriktirmek istiyorum.Oluşan değerleri biriktirmek istiyorum, ancak VERILOG

Varsayalım val üretilen değerdir ve zval ardışık değerler sumatory, bu

always @ (sum_val) 
Zval = Zval + val; 

gibi bir kayıt kullanmak ve bu

always @ (enable) 
Zval = 0; 

Quartus-II gibi başlatmak çalışıyordu olduğunu çarpma atamalarını çözemeyen şikayetler.

Eğer başlatılamıyorsa, simülasyon sırasında, Zval baştan bir şey umursamıyor, bu yüzden val + a umurumda değil, aynı zamanda dikkat etmiyor.

Ne yapmalıyım? Herhangi bir tavsiye çok takdir edilecektir.

+0

Sıfırlama sırasında başlatılamıyor musunuz? – rahulcodesinverilog

+0

FSM'nin sıfırlanma durumunu mı kastediyorsunuz? Sorun şu ki her yinelemede çukur sıfırlama işlemini birkaç kez geçiyorum. Sumatory değişkenini sıfır gibi koyarak önceki sonucu silebilirim, niyetim bu sonuçları eklemektir: S – sujeto1

cevap

3

Verilog'un simülasyonda yapabileceklerinin, donanımı tanımlarken yapabileceğiniz her şeyin çok büyük bir üst kümesi olduğunu not etmek çok önemli. Örneğin, Zval kayıt için sağladığınız tanım aslında bir kayıt oluşturmaz, bunun yerine her tür saatten bağımsız olarak sum_val her iki kenarındaki bir tür iki duraklıdır. Bu tür tasarımlar mümkün olsa da, karmaşıklığı nedeniyle genellikle önlenmeyen asenkron tasarım alanına girerler. FPGA tasarımı için FPGA tasarımında iki kat daha doğrudur, tipik olarak senkron tasarımlar yaptığınızı ve asenkron sistemlerin uygulanmasında çok kötü bir performans sergilediğinizi varsayar. Bir asenkron ile

always @(posedge clk, negedge rst) begin 
    if (~rst) begin 
    Zval <= '0; 
    end 
    else begin 
    if (sum_val) begin 
     Zval <= Zval + val; 
    end 
    end 
end 

Bu (clk üzerine) bir senkron kayıt tipik biçimidir: Bunun gibi, senin sorunun Quartus sevsin ve çalışmak daha kolay bulacaksınız basit bir senkron kayıt oluşturarak çözülebilir rst'u sıfırlayın. Bunu FPGA kartındaki butona bağlayarak sistemi istediğiniz zaman sıfırlayabilirsiniz, bu da Zval değerini 0'a ayarlayacaktır. Ayrıca asenkronize parçanın (Zval <= '0;) ve senkron kısmın (diğerlerinin) ayrı cümlelerini de dikkate alın; Her zaman bu maddeleri ayırın ya da sentez aracı genellikle garip şeyler yaratacaktır.

+0

Bu çok ilginç. Özür dilerim, sorum var. Sistemimde kesinlikle bir "start" butonu uygulamıştım, bu "rst" den aynı olurdu, bu yüzden start sistemine bastığımda her zaman registerları ve FSM'yi reset seviyesine getiriyor. Yoksa "ilk" bir de başlangıçtan vazgeçmek için gerekli mi? – sujeto1

+0

@ sujeto1 Eşzamanlı veya eşzamanlı değilse, 'start'nızı nasıl uyguladığınıza bağlıdır. Eğer bir eşzamanlı 'start' ise, yukarıdaki örnekte yer alan başka bir cümleye eklemeniz gerekir, bu da bedeni 'gibi görünür (eğer başlarsa) Zval <=' 0; eğer son (sum_val) Zval <= Zval + val; Sonu '. Eğer 'start' asenkron ise, yukarıdaki örnekte rst ile aynı şey olur ve ona bağlanabilir. Bununla birlikte, yukarıdaki örnekte, 'rst'ün düşük olduğu iddia edilir, dolayısıyla' 1'b0' değerinin değeri sistemi sıfırlar ve '1'b1 'değeri sistemin çalışmasına izin verir. – Unn

İlgili konular