CPU 设计中如何考虑 ROM 延迟
How is ROM latency accounted for in CPU design
我正在尝试用 VHDL 为 Altera FPGA 设计一个简单的 CPU。然而,我正在努力思考如何解决 ROM 块引起的延迟。 ROM 块本身可以同时对输入地址和输出数据进行计时,或者仅对输入地址进行计时,从而在数据请求(设置地址)和取回数据之间提供 1 或 2 个时钟周期的延迟。
我能理解,如果 ROM 本质上是一个海量数据复用器,那么执行诸如跳转之类的事情是微不足道的,因为您只需设置地址,到下一个时钟周期,正确的指令就会出现!我只是不太明白如何通过 ROM 和 CPU 之间的延迟来管理它。据我所知,每条指令都需要知道是否获取新指令、修改 PC - 程序计数器(跳转)或停止(保持 PC 不变)但如果有 2 个周期的延迟,则指令肯定需要提前知道 2 个周期?
如何为这种系统编写 PC?
作为参考,内存数据宽度将与指令大小相同,因此每个内存位置存储一条指令。
在FPGA上,只有输入地址寄存器提供1个时钟周期的延迟几乎就足够了。然后你可以只用 PC 寄存器的下一个值而不是当前值来寻址 ROM。
下一个值是将在下一个上升(或下降)时钟沿加载到寄存器中的值。下一个值也将在同一时钟沿加载到 ROM 地址寄存器中。因此,两个寄存器将具有相同的内容,并且 ROM 实际上在时钟边沿之后在(新)PC 上传送数据。
如果流水线级超过 2 个,ROM 输出将存储在指令寄存器中。在这种情况下,您将自动拥有一个ROM输出寄存器。
我正在尝试用 VHDL 为 Altera FPGA 设计一个简单的 CPU。然而,我正在努力思考如何解决 ROM 块引起的延迟。 ROM 块本身可以同时对输入地址和输出数据进行计时,或者仅对输入地址进行计时,从而在数据请求(设置地址)和取回数据之间提供 1 或 2 个时钟周期的延迟。
我能理解,如果 ROM 本质上是一个海量数据复用器,那么执行诸如跳转之类的事情是微不足道的,因为您只需设置地址,到下一个时钟周期,正确的指令就会出现!我只是不太明白如何通过 ROM 和 CPU 之间的延迟来管理它。据我所知,每条指令都需要知道是否获取新指令、修改 PC - 程序计数器(跳转)或停止(保持 PC 不变)但如果有 2 个周期的延迟,则指令肯定需要提前知道 2 个周期?
如何为这种系统编写 PC?
作为参考,内存数据宽度将与指令大小相同,因此每个内存位置存储一条指令。
在FPGA上,只有输入地址寄存器提供1个时钟周期的延迟几乎就足够了。然后你可以只用 PC 寄存器的下一个值而不是当前值来寻址 ROM。
下一个值是将在下一个上升(或下降)时钟沿加载到寄存器中的值。下一个值也将在同一时钟沿加载到 ROM 地址寄存器中。因此,两个寄存器将具有相同的内容,并且 ROM 实际上在时钟边沿之后在(新)PC 上传送数据。
如果流水线级超过 2 个,ROM 输出将存储在指令寄存器中。在这种情况下,您将自动拥有一个ROM输出寄存器。