勇敢的芯伴你玩轉Altera FPGA連載89:FPGA片內異步FIFO實例 特權同學,版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD ![]() 該工程實例內部系統功能框圖如圖9.72所示。我們通過IP核例化一個異步FIFO,定時寫入數據,然后再讀出所有數據。通過QuartusII集成的在線邏輯分析儀SignalTap II,我們可以觀察FPGA片內異步FIFO的讀寫時序。 ![]() 圖9.72 異步FIFO實例功能框圖 本實例的異步FIFO與上一個實例的同步FIFO有別,這個異步FIFO不僅讀寫的位寬不同,讀寫的時鐘也不同。異步FIFO對于跨時鐘域的應用非常有幫助,比同步FIFO實用得多了。 本實例工程模塊層次如圖9.73所示。 ![]() 圖9.73 異步FIFO模塊層次 Quartus II中,點擊菜單“Tools à Run Simulation Tool à RTL Simulation”進行仿真。接著,Modelsim中我們可以查看讀FIFO的波形。 如圖9.82所示,這是一組的FIFO讀寫測試波形,左邊fifo_wren拉高時執行FIFO寫入操作,右邊fifo_rden拉高時執行FIFO讀操作。 ![]() 圖9.82 FIFO讀寫時序波形 如圖9.83所示,這是FIFO寫入操作波形的放大,由PLL輸出c0時鐘12.5MHz同步,fifo_wren拉高時,每個時鐘周期依次寫入數據0xba,0xbb,0xbc,0xbd,0xbe,0xbf……。由于fifo_empty信號是read-side時鐘同步的(為PLL輸出c2時鐘50MHz,c0的4倍),因此fifo_empty在FIFO第一個數據寫入后第4個時鐘周期拉低,表示FIFO已經不空了。 ![]() 圖9.83 FIFO 寫時序波形 如圖9.84所示,這是FIFO讀操作波形的放大,PLL輸出c2時鐘為50MHz同步,在fifo_rden信號拉高后,其后的一個時鐘周期(此時fifo_rdrdy信號拉高了)就出現了第一個數據0xbbba,隨后是0xbdbc,0xbfbe……。寫入數據為8bit,讀出數據為16bit,且寫入數據的高字節處于讀出數據的低8bit。這和我們寫入FIFO的數據是一致的。由于在我們執行讀操作前,FIFO的32個數據出于滿狀態,因此fifo_full信號高電平,在第一個FIFO數據讀出后,fifo_full指示信號立刻拉低,表示FIFO已經不是出于滿狀態了。 ![]() 圖9.84 FIFO讀時序波形 FIFO操作的規則大體可以歸納如下: ● 寫使能信號fifo_wren拉高時,當前的寫入數據fifo_wrdb有效,即fifo_wrdb被存儲到FIFO中,如測試波形中依次寫入的數據ba、bb、bc、bd……。 ● 讀使能信號fifo_rden拉高時,第2個時鐘周期讀出數據出現在fifo_rddb有效,如測試波形中依次寫入的數據babb、bcbd……。 ● 讀寫數據分別和讀寫時鐘同步。 ● 寫入數據是8bit位寬,讀出數據是16bit位寬,則讀出的數據是高8bit代表第一個寫入的8bit數據,低8bit代表第二個寫入的8bit數據。 連接好下載線,給CY4開發板供電。 點擊菜單“Tools à SignalTap II Logic Analyzer”,進入邏輯分析儀主頁面。 在右側的“JTAG ChinaConfiguration”窗口中,建立好USB Blaster的連接后,點擊“SOF Manager”后面的Programmer按鈕進行下載。 如圖9.85所示,在“trigger”下面羅列了我們已經添加好的需要觀察的信號,尤其是在fifo_empty信號的TriggerConditions一列,我們設置了值下降沿,表示fifo_empty下降沿(FIFO不為空)時我們將觸發采集。另外,我們用鼠標點擊選中Instance下面的唯一一個選項,然后單擊InstanceManager后面的運行按鈕,執行一次觸發采集。 ![]() 圖9.85 波形采樣觸發設置 波形如圖9.86所示。兩組密密麻麻的數據,前面一組fifo_wren拉高了,表示這是一組寫入FIFO的數據;而后面一組fifo_rden為高電平,表示從FIFO讀出數據。 ![]() 圖9.86 FIFO讀寫時序波形 將寫入的頭幾個數據放大,如圖9.87所示。連續寫入了數據BAh、BBh、BCh、BDh……。 ![]() 圖9.87 FIFO寫時序波形 頭幾個讀數據的時序放大,如圖9.88所示。FIFO在讀時能信號fifo_wren拉高后,通常數據默認是在其后的一個時鐘周期出現,即它所對應的數據是滯后1個時鐘周期出現,這里我們使用了信號fifo_rdrdy拉高對應FIFO讀出數據有效;此外,這里的FIFO讀寫位寬不同,寫入時8bit,而讀出是16bit(首字節在LSB),因此首先的讀出的數據依次為BBBAh、BDBCh……。 ![]() 圖9.88 FIFO讀時序波形 |