「博文連載」EVDK DDR3 Demo調試筆記(關於VREF的問題)

「博文连载」EVDK DDR3 Demo调试笔记(关于VREF的问题)

昨天在調試Lattice EVDK開發板上的DDR3 Demo時,遇到一個莫名其妙的問題,今天來總結一下,並與大家分享。

一、問題描述

在Demo的頂層文件ddr3_test_top.v中有如下幾句話:

 input test1; output out_test1; assign out_test1 = test1;

且test1和out_test1與Design中的其他邏輯沒有任何的關係,然而,當我把它刪除的時候,卻發現原本運行正常的Demo卻出錯了!!!

於是乎,先去檢查這兩個引腳是否和硬件相關,在LPF文件中找到其相關約束:

LOCATE COMP "test1" SITE "F5" ; IOBUF PORT "test1" IO_TYPE=SSTL15_I ; LOCATE COMP "out_test1" SITE "B1" ; IOBUF PORT "out_test1" IO_TYPE=SSTL15_I ;

然後查看EVDK開發板的原理圖:

「博文连载」EVDK DDR3 Demo调试笔记(关于VREF的问题)

握草,這是什麼鬼?

於是乎,進一步做測試,把test1和out_test1替換為其他的引腳試試看呢。結果發現:當test1在Bank7上時,Demo功能正常,當test1不在Bank7上時,功能則不正常!

想了好久,奈何我這種小菜鳥卻怎麼也想不明白,於是請教了大牛!

二、問題分析

首先,還是檢查原理圖和LPF文件,由於EVDK板子上有兩個Mircon的DDR3的內存顆粒,且均為x16的Configuration。也就是DQ的寬度為16bit,兩個顆粒合併為32bit的DQ。其中顆粒一對應DQ0~DQ15,顆粒二對應DQ16~DQ31。DQ0~DQ15連接到了Bank6上面,而DQ16~DQ31連接到了Bank7上面。但是需要注意的是,一些控制信號(如RST、CS、WE、DM等)則分佈在Bank6Bank7上,換句話說,即使Design中只需要使用一個DDR3顆粒,也需要同時使用Bank6和Bank7。

因為DDR3採用的是SSLT15 I電平標準,所以需要設置Bank6和Bank7的VREF。在LPF文件中,我們可以找到:

LOCATE VREF "BANK_6_VREF" SITE "V4" ; LOCATE VREF "BANK_7_VREF" SITE "J7" ;

檢查原理圖,發現V4和J7引腳也正確地連接到了參考電壓上。

此時,我們再次將上文提到的ddr3_test_top.v中的test1和out_test1相關的幾條語句刪除,並刪除LPF文件中的相關語句。

然後從新綜合、MAP,並PAR,此時在PAR的報告中可以發現如下的警告:

WARNING - par: LOCATE VREF "BANK_7_VREF" preference has been ignored, because no PIO in bank "7" uses this VREF.

也就是說Diamond認為,我們的Design中並沒有使用Bank7中的PIO,所以不需要VREF,並忽略了LPF文件中給出的約束。所以Bank7的VREF引腳並未被設置為VREF模式,而是作為普通IO的(默認模式)。但是DDR3使用的是SSLT15 I電平標準,需要VERF引腳為其提供0.75V的參考電壓(一般使用1.5V的VCCIO分壓即可),如下圖所示:

「博文连载」EVDK DDR3 Demo调试笔记(关于VREF的问题)

檢查ECP5數據手冊,發現如下一句話:

The VREF voltage is used to set the threshold for the referenced inputbuffers, such as SSTL.

注意是input!這就解釋了為什麼當test1引腳分配在Bank7上可以,分配在其他引腳上就不行的原因了。因為如果Bank7上沒有input的話,Diamond就會認為此時為Bank7設置VREF是沒有必要的,所以也就忽略了LPF中的約束。

難道是ECP5的數據手冊寫錯了?難道是DDR的output也需要VREF?

其實不然,再次檢查EVDK板的原理圖,發現Bank6和Bank7的VREF實際上連接的是同一個電壓(換句話說,這兩個VREF是直接連在一起的)。但是合理的硬件設計方式是,不同Bank的VREF獨立(即不要連接在一起)。也正是這種不合理的設計方式,導致了本文所討論的問題。

在我們的設計中實際上只需要給Bank6設置VREF即可,Bank7實際上是不需要的,但是為什麼不給Bank7 VREF的話,DDR卻不能正常工作呢?原因在於,如果Bank7的J7引腳(VREF1_7)沒有被配置為VREF輸入模式的話,其默認為上拉的。而J7引腳(VREF1_7)的上拉會影響到VREF的電壓,進而影響到Bank6上的V4引腳(VREF1_6)的VREF輸入,最終導致Bank6沒有穩定有效的VREF,因此DDR不能正常工作。

為了讓J7引腳(VREF1_7)不影響VREF的電壓,顯然最好是將其也設置成VREF輸入模式,為了防止我們的設置被Diamond優化掉,才出現了本文前面所討論的這一問題。

三、關於SSTL電平(更新內容)

這裡來分析一下為什麼DDR3的相關IO的輸入需要參考電壓,而輸出卻不需要。DDRx SDRAM普通IO採用的是SSTL電平標準(clk和dqs等採用的是SSTL的差分版本SSTLD),而SSTL實際上是一種偽差分電平。

所謂偽差分電平,就是信號的接收端是一個差分的接收器,但是其中一端固定接參考電壓VREF,而另一端接單端信號線。輸入信號電壓與參考電壓之間進行比較,作為判決輸入信號高低的標準。而偽差分標準的輸出驅動器則是單端信號標準中常見的推輓式的結構(Push-Pull),顯然是不需要參考電壓VREF的。

由於偽差分電平的信號輸出的擺幅較小,瞬態的電流較小,保持信號完整性要相對容易些。因此,這種電平主要應用在高速的存儲器接口中,如DDRx SDRAM、QDR SRAM和RLDRAM等中。

這種結構的好處是,其輸入信號只需要在VREF上下小幅度擺動即可被輸入驅動器正確地接收。這樣信號的噪聲餘量就很大,信號能否被正確接收下來,VREF將起到關鍵作用,因此設計時需要保證VREF較高的精度。

「博文连载」EVDK DDR3 Demo调试笔记(关于VREF的问题)
「博文连载」EVDK DDR3 Demo调试笔记(关于VREF的问题)


分享到:


相關文章: