久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ALTERA FIFO 讀寫verilog代碼

 薛董_艾瑞 2018-01-31

FIFO,,在FPGA中是一種非常基本,,使用非常廣泛的模塊,。FPGA高手可能覺得不值一提,但對于像我這樣的新手,,有時(shí)卻是個(gè)大問題,,弄了一個(gè)多月,總算有所進(jìn)展,,希望把自己的一些總結(jié)寫下來,,一方面希望對其他入門者有所幫助,另一方面希望看到的高手們批評指正,。另外得特別感謝特權(quán)同學(xué)的教程,。

         在大學(xué)中編了兩年單片機(jī)(斷斷續(xù)續(xù)),C語言的串行思維深入人心,,一下子轉(zhuǎn)換到FPGA并行的工作方式和有些奇異的編程風(fēng)格,,一開始還真有點(diǎn)處理不好。另一方面,,對FPGA各種延遲非常困惑,,比如RAM模塊讀取延遲,F(xiàn)IFO讀取數(shù)據(jù)延遲等,,常常不知道如何處理,。下面說說我現(xiàn)在的理解和解決辦法。

FPGA寫入數(shù)據(jù)

寫入相對簡單,,只需要在時(shí)鐘上升沿來臨之時(shí)使能wrreq和寫入data,,當(dāng)然還需要判斷FIFO full信號。時(shí)序圖如下,,在第一個(gè)時(shí)鐘之前使能wrreq信號,,在第一個(gè)時(shí)鐘及以后的幾個(gè)時(shí)鐘上升沿FIFO判斷wrreq有效并且讀入數(shù)據(jù)。(圖片為轉(zhuǎn)載并 編輯)


一份參考的代碼如下

  1. reg     [7:0]   fifo_wcnt;  
  2. always @(posedge led or negedge rst) begin  
  3.     if (~rst) begin  
  4.         fifo_wreq<=1'b0;  
  5.         fifo_wdat<=0;  
  6.         fifo_wcnt<=0;//測試數(shù)據(jù)  
  7.     end else begin  
  8.         if(~fifo_wfull)begin//FIFO沒有寫滿的時(shí)候就寫入數(shù)據(jù)  
  9.                 fifo_wcnt<=fifo_wcnt+1'b1;                 
  10.                 fifo_wreq<=1'b1;  
  11.                 fifo_wdat<=fifo_wcnt+8'd2;  
  12.         end else begin  
  13.             fifo_wreq<=1'b0;  
  14.         end  
  15.     end  
  16. end  


這里fifo_wfull值得注意,,在沒有延遲的時(shí)候這個(gè)信號可以直接為FIFO直接輸出的full信號,,但實(shí)際中通常都會(huì)有一個(gè)或者多個(gè)時(shí)鐘的延遲??梢越Y(jié)合使用wrusedw信號對FIFO保留一定的余量,,比如FIFO容量為1024,定義如下:

  1. assign                        wfifo_full =(recFIFO_WCnt>1000)|recFIFO_wfull;  


FIFO讀出數(shù)據(jù)

         時(shí)序圖如下,,在第二個(gè)時(shí)鐘上升沿來臨后使能rdreq信號,,第三個(gè)時(shí)鐘FIFO判斷rdreq信號,然后第四個(gè)時(shí)鐘來臨時(shí)方可讀取數(shù)據(jù)(在empty信號表示FIFO飛空的時(shí)候有效),。因此需要注意這兩個(gè)時(shí)鐘的延遲,,但是我們的重點(diǎn)應(yīng)該放在獲取、處理數(shù)據(jù)上,,而不應(yīng)該是處理這些煩心的時(shí)序操作上,。


一份可用的代碼如下

  1. assign                                 rfifo_ren= ~rfifo_empty;  
  2. reg                                    canread;  
  3. //fifo read  
  4. always @(posedge clk or negedge rst) begin  
  5.          if(~rst)begin  
  6.                    canread<=1'b0;  
  7.          endelse begin  
  8.                    canread<=rfifo_ren;  
  9.          end  
  10. end  
  11.    
  12. reg                      [7:0] readcnt;//讀出計(jì)數(shù)  
  13. reg                      [7:0] dispdata;//讀出數(shù)據(jù)顯示  
  14. always @(posedge clk or negedge rst) begin  
  15.          if(~rst)begin  
  16.                    readcnt<=0;  
  17. dispdata<=0;  
  18.          endelse begin  
  19.                    if(canread)begin  
  20.                             readcnt<=readcnt+1'b1;  
  21.                             dispdata<=rfifo_rdata;  
  22.                    endelse begin  
  23.                              
  24.                    end  
  25.          end  
  26. end  


解釋:empty為0后,ren隨之變?yōu)?,,使能FIFO讀出信號(不是上述時(shí)序圖內(nèi)容),。下一個(gè)時(shí)鐘來臨時(shí)FIFO判斷ren使能,同時(shí)這個(gè)時(shí)鐘之后canread方才讀入~empty信號為1使能,。再下一個(gè)時(shí)鐘來臨時(shí),,F(xiàn)IFO輸出信號,,而canread已經(jīng)有效,外設(shè)讀取數(shù)據(jù),。

         比較奇怪的是ALTERA的文檔中并沒說empty有延遲,,對FIFO直接的操作中也并沒有發(fā)現(xiàn)這個(gè)延遲,也就是說本來FIFO已經(jīng)讀空了,,但是FIFO的empty信號并沒有有效,,如果完全按照empty信號讀取會(huì)導(dǎo)致多讀出一個(gè)或多個(gè)數(shù)據(jù)。在隨后的一個(gè)cy68013 USB2.0接口實(shí)現(xiàn)實(shí)際用FIFO時(shí)發(fā)現(xiàn)了empty具有一個(gè)時(shí)鐘的延遲,,發(fā)送256組數(shù)據(jù)卻顯示讀取了257組數(shù)據(jù),。但是這里如果像full一樣采取保留一定余量的方法會(huì)導(dǎo)致FIFO中始終會(huì)暫留有一些數(shù)據(jù),除非你知道你自己發(fā)送了多少個(gè)數(shù)據(jù),。

         上面的代碼中使用這種流水線式寄存器轉(zhuǎn)移方法很好的處理了FIFO信號延遲的問題,,同樣使用它還可以輕易的解決empty延遲一個(gè)時(shí)鐘的問題,只需稍微改一下上面的代碼,。不過若是延遲多個(gè)時(shí)鐘???還的看看具體的場合,。

  1. wire                                   rfifo_ren;  
  2. reg                                    rfifo_ren1;  
  3. assign                                 rfifo_ren= ~rfifo_empty;  
  4. always @(posedge clk or negedge rst) begin  
  5.          if(~rst) begin  
  6.                    rfifo_ren1<=1'b0;  
  7.          endelse begin  
  8.                    rfifo_ren1<=rfifo_ren;  
  9.          end  
  10. end  
  11. assign canread =rfifo_ren1&rfifo_ren;//因?yàn)閞en會(huì)多延遲一個(gè)時(shí)鐘失效  
  12.    
  13. reg                      [7:0] readcnt;//讀出計(jì)數(shù)  
  14. reg                      [7:0] dispdata;//讀出數(shù)據(jù)顯示  
  15. always @(posedge clk or negedge rst) begin  
  16.          if(~rst)begin  
  17.                    readcnt<=0;  
  18. dispdata<=0;  
  19.          endelse begin  
  20.                    if(canread)begin  
  21.                             readcnt<=readcnt+1'b1;  
  22.                             dispdata<=rfifo_rdata;  
  23.                    endelse begin  
  24.                              
  25.                    end  
  26.          end  
  27. end  



解釋:加了讀取保護(hù)功能的FIFO在empty使能之后rfifo_ren使能也不會(huì)有問題,關(guān)鍵是canread信號,。empty信號為1后,,rfifo_ren隨即為0,在下一個(gè)時(shí)鐘來臨時(shí)FIFO輸出一個(gè)數(shù)據(jù)(上一個(gè)時(shí)鐘rfifo_ren還是有效的)并判斷rfifo_ren失能,,停止輸出數(shù)據(jù),。但是由于empty多延遲了一個(gè)時(shí)鐘,因此這個(gè)數(shù)據(jù)是不需要的,,如果& 上~empty則可以使canread在這個(gè)時(shí)鐘來臨前失能,。


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多