看板 Electronics 關於我們 聯絡資訊
※ 引述《dinex (Dinex)》之銘言: : 在撰寫Verilog的時候,常常會被告誡說blocking assignment最好不要跟non-blocking : assignment寫在一起,以免邏輯之間會產生錯誤 : 現在本人發現一個狀況:明明non-blocking還有blocking已經分開來寫了,但是兩者 : 之間卻還是有時間上的影響? : ===以下為示意版=== : assign c=(b==a)?1:0; : always@(posedge CLK) : case(state) : state 1: : a<=1; : state 2: : b<=a; : endcase : always@(posedge CLK) : if(state==state 2) : d<=c?1:0; : 如上所示,走完state 2以後,這時候c的數值應當會變成1,然後d要存入1這個數值 : 但是經過實際模擬,d在判斷存入哪個數值的時候,卻還是用c=0來進行判斷(此時若直接 : 把c拉出來當output,可以看到其值已經變成1了)就算改成d=c?1:0也還是相同結果。請問 : 這是在邏輯上發生哪些錯誤了?先謝謝大大們的幫忙了! 你的問題在於還沒搞清楚sequentail和combinational邏輯的差異。 而且也還沒搞懂non-blocking和blocking是什麼意思... 當code寫上@ (posedge clk)就已經說明,這是一個flip flop受到 "clk正緣"的控制產生的行為... 換句話說,當你clk敲下去的時候,正緣對到的時間c一定是0, d在正緣之後會等於0。 而你改成combinational邏輯後得到你想要的結果,就已經證明上述 所講的,因為combinational邏輯就是一旦條件成立,即時發生... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.44.170 ※ 文章網址: http://www.ptt.cc/bbs/Electronics/M.1406451861.A.B98.html