FPGA SD 卡 之 乒乓操作 、同步fifo


這里記錄一個實際的需要使用乒乓操作的例子:讀sd卡數據的時,在spi的模式下。發送單數據塊的讀取命令,在回應之后會有

512字節的數據。使用乒乓操作,可以用兩個八位的寄存器,就可以完成連續的512字節讀入fifo。但是如果操作不好的話就會出現位置不對的情況。

上圖是讀入fifo的數據。

上圖是實際的數據。(起始地址為1000h)00h 01h,就是位置不對的地方。

 

上述結果的代碼:

assign fifo_data_in = (i == 10'd7) ? data_read_1 : data_read_2;

 

分析代碼可知:00. 01是不要的數據,但是確寫入了fifo中。應該說猜了很久,都不知道。這也是我的弱點所在,不能猜,而要實在的仿真分析。在我仿真了fifo的波形后,才知道fifo的寫入當前時刻的,上一時刻的值見仿真波形。還有就是我的猜測:fifo寫入的值,如果不使能write_req_r信號,值就不會更新到實際的fifo的數據總線上。所以在實際的調試中不管我如何丟棄開始的數據,總是有一個不相關的數據存在。之所以是猜測,是因為我現在還沒有證實。在仿真中可以明顯的看到,就算沒有使能write_req_r, fifo寫入的數據也能更新。

 

 

從仿真的波形可以看出:在data_in=1才使能write_req_r,在data_in=2,fifo才寫入1 。 但是根據我的分析,應該要寫入0。想想唯一不同只有這一句了:assign fifo_data_in = (i == 10'd7) ? data_read_1 : data_read_2;因為使用乒乓操作所以要做個選擇。好的仿真看看。測試:如果 i 變化了且data_read_1和data_read_2有變化,但是write_req_r沒有使能,觀察fifo_data_in有沒有變化即可。如果有變化證明我的猜測是錯的。(沒有仿真之前我不能確定,表明着我對verilog和數字電路的不理解,這也是我以后要加強的地方。)好吧下面是仿真的結果。

 

很顯然:即使沒有使能write_req_r,fifo_data_in也會變化在實際的仿真中我也使用了:

assign    fifo_data_in = flag_write ? fifo_data_in_r : counter;。可知我的猜測是錯誤的。還是不能猜的。那它為什么會多些一個當前數據的前一個存在fifo_data_in的中數據。

分析中。。。。。。。。。。。。。。。。。。。。。。。。有知道的,希望能留言。

 

 

呵呵,我還是想搞清楚到底是怎么回事。我使用了絕招,signaltap II 來看看在觸發寫,讀的現場數據。

 

 上圖是:write_req_r下降沿觸發是,但是的數據狀態。明顯的可以看到下降沿前后都是EB,因此可以確定肯定不是寫的問題,這和前面的分析是一致的。(心里暗想,肯定是讀的問題了。不然,我真的不知道怎么解決了)

上圖是read_req_r下降沿觸發時的數據。可以看到在使能的時候,data_out_r的值沒有更新。雖然,現在還不知道原因,但是事實證明,問題就是出在這。(終於放心了。。。。)

 

 

 

現在來找找原因:(先使用modelsim仿真看看)

(嗯,和我開始的仿真是一樣的)上圖是modelsim的仿真圖,可見不會讀fifo_data[0]前的值,即輸出是及時的更新的。奇怪了,怎么仿真和實際的情況不一樣?我就去找,仿真和實際的不同點。

實際:data_tr_r <= fifo_data_out;

仿真:wire   fifo_data_out;

於是我就將仿真改成和實際的,加一個非阻塞的賦值。看看會不會,讀的時候不會及時的更新。(希望是啊,不然我有不知道要如何解釋了。呵呵。。。)

哈哈,,,)可以,真的是,改成和實際的一樣時,真的要落后一個時鍾。

我想想這是什么問題,就是對於阻塞賦值和非阻塞賦值的不理解造成的。實際卻又不是,那是不是不能解決,只能丟掉第一次讀的?(不能想當然啊)

仔細分析(還是要靠這個):

在fifo中的輸出 :data_out_r <= fifo_data[read_addr];  assign   data_out = data_out_r;

在接收數據的時候:data_tr_r <= fifo_data_out; assign data_tr = data_tr_r;

可知,這可是存在兩級的觸發器的,所以開始要多打一拍,結束的時候要多打一拍。至此,問題可以說是分析好了。

呵呵,,,,,開心!

 

 

 

總結:

  要學會仿真的分析問題,而不是盲目的測試(耗時間,耗精力,還不會提高!)。

     要扎實,認真。不能想當然。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM