Re: [問題] veriog撰寫問題
※ 引述《felghana (adol)》之銘言:
: : reg incr_d;
: : always @ ( posedge reset or posedge clk )
: : if ( reset ) incr_d <= 1'b0;
: : else incr_d <= incr;
: : wire incr_p = incr & ~incr_d;
: : reg decr_d;
: : always @ ( posedge reset or posedge clk )
: : if ( reset ) decr_d <= 1'b0;
: : else decr_d <= decr;
: : wire decr_p = decr & ~decr_d;
: : reg [12:0] mod_n;
: : always @ ( posedge reset or posedge clk )
: : if ( reset ) mod_n <= 13'h000;
: : else if ( incr_p ) mod_n <= mod_n + 13'h00a;
: : else if ( decr_p ) mod_n <= mod_n - 13'h00a;
: 講一下我對這個電路的想法好了 各位大大看有沒有錯
: 1.假定某一時間incr=1 那麼incr_p也會立刻變為1
: 2.當離這個時間最接近的那一次posedge clk發生的瞬間
: 會同時進入三個always block 因此incr_d=1造成incr_p=0
: 3.同時間第三個always block也要根據incr_p的值來決定進入哪個判斷式
: 我的疑問就是 這樣2和3同時發生 我有辦法讓他跑進else if(incr_p)這個判斷式裡面嗎?
: 到底是incr_p先變為0 再做判斷
: 還是incr_p還沒變為0時 就做完判斷了
: 我的電路要後者才是正確的
: 不知道我有哪邊想錯? 還請指教
c1 c2
_________ _________
__| |_________| clk
_________________________
______| incr
_________
___________________| incr_d
_______________
___| |_________ incr_p
如果你incr波型從c1之前為low,然後在c1、c2之間變化成high
這樣子你的incr_p如上圖的波型在c2時
第3個always就會跑進else if(incr_p)這個assignment
反之,在c1、c2之間變化成low,這樣子就會造成
第3個always跳過else if(incr_p)這個assignment
因此結論就是要看你的incr怎麼給,會影響第3個always的判斷
進而造成輸出的不同!!
-------------------------------------------------------
另帶一提,incr訊號可能會和第3個always的clk產生raceing!!
原因如下:
第1、2個always block下面的wire incr_p、decr_p屬於 Mealy Machine 輸出
然後成為第3個always的控制訊號,然後控制著mod_n的輸出
因此會造成在clk trigger時,第3個always的輸入在
同時間incr也發生變化,可能會造成第3個always選擇
else if(incr_p)或是不選擇else if(incr_p)
因此建議:
考慮清楚你的incr訊號與clk之間的關係
如果可以,你也許可以選擇把incr_p、decr_p做成 Moore Machine 輸出
這樣子電路行為也許能更符合你的需求!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.63.117.152
推
08/07 17:31, , 1F
08/07 17:31, 1F
→
08/07 20:09, , 2F
08/07 20:09, 2F
討論串 (同標題文章)
完整討論串 (本文為第 8 之 10 篇):