2014-02-18 51 views
2

我正在學習verilog,並且當我不知道電路如何在Verilog代碼中工作時,我會轉到RTL查看器以查看數字邏輯。但是在這段代碼中出現了一個奇怪的組件,我不知道這個組件是什麼。是觸發器,多路複用器還是邏輯端口?下面是 的代碼和圖片,在圖片中,組件是紅色的三角形。使用verilog的quartus RTL查看器中的奇怪組件

的代碼:

module testesoma(clock,reset,in, out,aux); 

input wire reset, clock, in ; 
output reg [3:0] out,aux; 


always @(posedge clock or posedge reset) 
begin 
    if(reset) 
     begin 
      out = 0; 
     end 
    else  
     out = aux; 
     aux = aux + 1; 
end 
endmodule 

enter image description here

回答

4

什麼是一個偉大的示意圖:+1爲了生成它的麻煩。您的代碼存在多個問題,這是使用阻止分配,反饋,不使用合成模板等等的危險的一個很好的例子。 Quartus肯定搞砸了,但考慮到輸入,這並不奇怪。問題:

  1. 不使用這裏阻塞賦值 - 使用<=
  2. 理清你的begin S和end秒。作爲一個起點,除非有必要,否則不要在代碼中加入任何begin/end;它是詳細的,並隱藏這樣的錯誤。當您明確需要創建多分塊時,僅使用begin/end。請注意,aux=aux+1超出了您鐘錶的if/else聲明 - 何時執行?
  3. 整理出您希望aux增加的時間和地點。
  4. 當您有類似aux=aux+1的反饋意見時,請謹慎對待。如果你不小心,真正的硬件會振盪。
  5. 不要像這樣寫鏈式邏輯 - 開始思考並行。

Quartus已經有了相當不錯的成績,但是它所產生的電路只會振盪,並且輸出沒有計時,這可能是您的意圖。 Quartus已經加入了紅色緩衝區,因爲它可以看到它已經產生了一個不穩定的反饋電路,而且它打破了它的三心二意。它應該在某處發出警告。

1 - 重寫你的代碼;像

always @(posedge clock or posedge reset) 
     if(reset) 
      out <= 0; 
     else  
      out <= aux; 

    always @(posedge clock or posedge reset) 
     if(reset) 
      aux <= 0; 
     else  
      aux <= aux + 1'b1; 

2 - 不分配給多個變量的主頻always,除非/直到你明白什麼可以去錯了,(提示:檢查所有分支機構 /執行路徑,確認事情發生邏輯到所有變量分配到所有可能的路徑)

3 - 找一本關於VHDL,閱讀三角洲延遲/分配的章節,和你的Verilog會更好。

+2

好的答案,但必須在第2點加上注意。'begin'和'end'等同於'C'中的大括號和[consensus] (http://programmers.stackexchange.com/questions/16528/single-statement-if-block-braces-or-no)是省略這些內容對於一個內線更容易引入意外的錯誤。 OP中的一個錯誤就是這樣一個例子 - 無法開始/結束'else'子句。 – Chiggs

+0

謝謝,現在我看到「else」之後的「開始」和「結束」錯誤,現在通過改正電路變成可以理解的電路。我需要組合邏輯的「=」,例如: 'code' a = b + c; d = a + e; f = d + a; 'code' 你會建議我將順序的組合邏輯分開嗎? –

2

即符號僅僅是一個緩衝器,其驅動輸出等於輸入。至於爲什麼它會出現在數字邏輯電路圖中,我不確定。

緩衝器對電路的數字功能沒有任何影響,當網絡的電容太大而無法有效驅動驅動器單元時,它們會被合成器插入。你大都可以忽略它。

另外我有點懷疑該示意圖,它看起來不符合您的RTL。 rtl在每個posedge時鐘上遞增aux,但是這顯示了通過加法器的組合反饋循環,看起來它根本不起作用。

+0

感謝,現在我知道這個組件在quartus上是什麼 –