zKa*_*arp 6 verilog processor computer-architecture
我正在完成一个项目,并且要求是我们处理器内部功能单元之间的双向握手.我知道它是什么,但它有什么"标准"或简单的例子吗?
我只能想到两个单元之间,当它们之间有数据线时,当X发送到Y时,会给出一个单独的"发送"信号.当Y接收到"接收"信号时,会在另一条线路上发送给X. 一旦X读取接收到的信号,它就会停止在数据线上发送数据并将发送的线路设置为0或Z.Y然后将接收信号设置为0或Z.
这都是同步的(在同一个时钟上).
这是一个有效的方法吗?我认为它可以在大规模上变得非常混乱,但我只是在一个简单的基于累加器的处理器上工作.
单个时钟域最常见的简单握手是有效/准备握手.
如果'X'发送到'Y',则X的输出为data和valid,Y的输出为ready.
当X有数据要发送时,它断言有效,并查看准备就绪.如果posedge时钟有效并且准备就绪,则X将考虑要发送的数据,Y将考虑要接收的数据.
这种方案的优点是您可以在每个时钟周期发送一个数据,而无需任何停机时间.如果有效仍然很高,则在有效/就绪后的下一个周期为高,则将其视为第二个数据包.
此外,没有要求Y在断言准备就绪之前等待看到有效,Y可以在任何时候接收数据时断言就绪.
您描述的方案是我称之为'req/ack 4阶段握手',因为它需要4个时钟周期来发送一个数据
1. req=1 ack=0
2. req=1 ack=1
3. req=0 ack=1
4. req=0 ack=0
Run Code Online (Sandbox Code Playgroud)
当跨越时钟边界执行异步请求时,这种接口会更好,因为它消除了两次解释数据包的任何可能性.但是,对于完全同步的接口,您不需要这样做.