2015-12-08 156 views
1

我打算在VHDL中設計一個類似MIPS的CPU。 CPU將具有經典的五級管道,無需轉發和防止危險。在計算機體系結構課程中,我瞭解到第一個MIPS-CPU用於在時鐘上升沿讀取寄存器文件,並在時鐘下降沿寫入。我使用的FPGA不支持同時使用上升和下降時鐘邊沿(關於讀寫寄存器),所以我不能像原始MIPS那樣完全做到這一點,並且必須在時鐘上升沿完成。同時讀取和寫入寄存器

所以,這裏是我遇到問題的部分。該指令在寫回階段回寫到寄存器。寫回階段將數據直接發送到解碼階段。解碼階段的另一條指令想要讀取同一個寄存器,寫入階段也要寫入。

在這種情況下會發生什麼?解碼階段是否獲取指令的新值或仍然在寄存器文件中的舊值?

+2

「大多數FPGA不支持時鐘下降沿」......多麼奇怪的想法,你在哪裏讀到的?他們不支持的是在兩個時鐘邊沿對同一個寄存器進行時鐘控制(並且例外通常是I/O模塊)......但是,由於讀取和寫入數據是分開的,因此在同一個時鐘邊沿上讀寫是很好的信號。如果將te寄存器移動到BlockRam中,請確保讀取其有關同時讀寫的數據(通常位於不同的端口上)。 –

+0

你說得對。在這一點上,董事會的用戶指南並不十分清楚。 FPGA確實支持下降沿,但不能同時使用兩個邊沿。 – fsasm

+0

我想如果你讀了舊的值,那麼你需要多一個循環的結果轉發(讀取新值提供了通過寄存器文件的轉發)。 –

回答

0

適合經典五階段設計的解碼階段的寄存器文件由三端口RAM(或兩個雙端口RAM)和兩個複用器和比較器組成。要求比較器和複用器繞過來自回寫階段的數據。這是需要的,因爲寫入數據在下一個週期寫入三端口RAM。因爲來自回寫階段的信號是同步的,所以這不是問題。

0

問題在於你對「註冊」這個術語有什麼瞭解。或者更具體地說,您希望如何將寄存器庫映射到FPGA。

最簡單但不是很有效的方法是根據寄存器大小將每個MIPS寄存器映射到幾個觸發器。您只能在時鐘沿(如下降沿)更新這些觸發器。之後,您可以隨時讀取新內容,也稱爲異步讀取。該解決方案效率不高,因爲多路複用器從寄存器庫中選擇一個MIPS寄存器需要大量的邏輯資源。

如果您有一塊FPGA可以將LUT用作分佈式存儲器,那麼可以保存多路複用器的幾乎所有邏輯資源。分佈式內存通常也提供異步讀取(當然還有同步寫入)。請閱讀合成工具的供應商文檔,瞭解如何描述這種類型的內存進行合成。

最後但並非最不重要的一點,您可以將完整的寄存器組映射到片上存儲塊。這些典型地僅提供同步讀取,即,從時鐘邊緣開始讀取。 (當然,它們也只提供同步寫入)。但是,這些通常是雙端口RAM。因此,您可以在一個端口的下降沿進行寫入,並在另一個端口的上升沿進行讀取。請閱讀您的FPGA的文檔,瞭解寫入的時間。例如,在某些Altera FPGA上,寫入延遲到時鐘的下一個相反沿(此處爲上升沿)。