我正在尝试用 VHDL 为 Altera FPGA 设计一个简单的 CPU。然而,我正在尝试了解如何解决 ROM block 引起的延迟。 ROM block 本身可以同时对输入地址和输出数据进行计时,或者仅对输入地址进行计时,从而在数据请求(设置地址)和获取数据之间提供 1 或 2 个时钟周期的延迟。
我可以理解,如果ROM本质上是一个海量数据多路复用器,那么做诸如跳转之类的事情是微不足道的,因为你只需设置地址,到下一个时钟周期,正确的指令就会在那里!我只是不太明白如何管理 ROM 和 CPU 之间的延迟。据我所知,每条指令都需要知道是否要获取新指令、修改 PC - 程序计数器(跳转)或停止(保持 PC 相同),但如果有 2 个周期的延迟,该指令将需要提前知道 2 个周期?
如何为这种系统编写一台 PC?
仅供引用,内存数据宽度与指令大小相同,因此每个内存位置存储一条指令。
最佳答案
在 FPGA 上,仅输入地址寄存器提供 1 个时钟周期的延迟就几乎足够了。然后,您可以仅使用 PC 寄存器的下一个值而不是当前值来寻址 ROM。
下一个值是将在下一个上升(或下降)时钟沿加载到寄存器中的值。下一个值也将在同一时钟沿加载到 ROM 地址寄存器中。因此,两个寄存器将具有相同的内容,并且 ROM 实际上在时钟沿之后将数据传送到(新)PC。
如果您有 2 个以上的流水线级,则 ROM 输出存储在指令寄存器中。在这种情况下,您将自动拥有一个 ROM 输出寄存器。
关于vhdl - CPU 设计中如何考虑 ROM 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35941578/