2013-11-28 85 views
0

我試圖我NEXYS2板與SR編程與非門鎖存與使能信號C.我輸入(S,R,C)輸出(Q,Qbar)。下面是我嘗試過的一些VHDL代碼,但不斷收到錯誤。如果這有助於任何人理解我的問題,那麼原理圖也在下面。如果你知道它在Verilog中也可以。 預先感謝您VHDL或Verilog SR鎖存

process(S,R,C,Q,Qbar) 
begin 
    if (C = '1') then 
     Q <= (R nand Qbar); 
     Qbar <= (S nand Q); 
    end if; 
end process; 

Schematic

+0

能否請您加入到這個問題,你所看到的錯誤訊息? – rick

+0

如果給我一個時鐘錯誤,但我不知道爲什麼,因爲我試圖通過僅使用控制輸入而不使用時鐘來異步執行此操作 – user3023323

+0

「C」輸入可能被合成工具處理爲「時鐘」 ,因爲'C'可以用作實現中的推斷鎖存器的啓用。綜合工具不是用這種循環來處理設計,並可能試圖通過推斷鎖存來打破循環。我認爲你的設計只是某種測試的一部分,因爲這樣的設計不能擴展到大型系統。 –

回答

0

您的原理圖是正確的。

問題出在你的VHDL代碼中,因爲你沒有完全指定電路的功能(注意c ='0'的輸出值沒有被定義),這導致了鎖存器的推斷(只有已註冊的電路可以設計時規格不完整,因爲無論如何,結果信號都存儲在D型觸發器中)。

你可以做以下(其他備選方案中):

entity sr_latch is 
    port ( 
    s, r, c: in bit; 
    q, qbar: buffer bit); 
end entity; 

architecture sr_latch of sr_latch is 
begin 
    q <= (s nand c) nand qbar; 
    qbar <= (r nand c) nand q; 
end architecture 
2

首先,你對你的原理的實現是不正確,R應該是 〜S,和S應該〜R上。當C爲1時,嘗試使用S或R跟蹤邏輯,其等於1 - 輸出應設置爲高電平。

更正的Verilog(我只帶了Altera的&的Verilog這裏):

module top(
      input wire S, R, C, 
      output reg Q, Qbar); 

    always @(S, R, C, Q, Qbar) 
     if(C) begin 
     Q <= (~R & Q) | S; 
     Qbar <= (~S & Q) | R; 
     end 
endmodule 

這synthesises好了在Altera,隨着的

Warning (10240): Verilog HDL Always Construct warning at test.v(5): inferring latch(es) for variable "Q", which holds its previous value in one or more paths through the always construct 

線2個警告和警告從定時分析器,它分析了兩個組合的 環路作爲鎖存器。技術觀點看起來似乎是合理的,但是這種編碼風格會產生 問題,這可能會導致問題。

問題是,您明確地編寫了唯一的反饋路徑,但您還需要讓合成器推斷一個鎖存器。你的代碼包括if(C = '1'),所以當C不是1時,合成器推斷存儲器行爲 - 一個鎖存器。但是,這個 是沒有意義的,因爲你也明確地告訴它鎖存器的位置在哪裏,反饋路徑是 。不要這樣做;假設任何合成器都足夠聰明以找出你的真正含義是錯誤的。這裏有一個 版本,毫無疑問你想要什麼:

module top(
      input wire S, R, C, 
      output wire Q, Qbar); 

    wire S2 = ~(C & S); 
    wire R2 = ~(C & R); 
    assign Q = ~(S2 & Qbar); 
    assign Qbar = ~(R2 & Q); 
endmodule 

這反而給了警告,兩個人的2個節點發現的組合循環「,作爲 你所期望的。這也合成好了,RTL /技術視圖看起來很好,第一眼看上去就是 。

標準免責聲明:時序分析師不善於使用 組合循環進行時序設計。如果你只是在玩 左右,這可能只是工作,但如果這是一個真正的設計,你需要認真思考你的約束條件,以及分析器是否真的追蹤了你的反饋路徑(它可能沒有「T)。您需要使用sdf 反向註釋來進行時序模擬,以確認它實際上可行。

+0

非常感謝您的幫助,但原理圖是正確的。我知道這是肯定的,你所建議的陳述不會給我正確的結果。 – user3023323

+0

我沒有說原理圖是不正確的 - 我說你的*原理圖*的實現*不正確。您的代碼與您的電路圖不匹配。不過,這很重要。閱讀我的文章的其餘部分。 – EML