【问题标题】:Verilog two-way handshaking exampleVerilog 双向握手示例
【发布时间】:2014-01-05 21:17:47
【问题描述】:

我正在完成一个项目,并且要求在我们的处理器内部的功能单元之间进行双向握手。我知道它是什么,但是否有任何“标准”或一个很好的简单示例?

我只能想到两个单元之间的事情,当它们之间有一条数据线并且当 X 发送到 Y 时,会给出一个单独的“发送”信号。当 Y 接收到“已接收”信号时,将通过另一条线将信号发送到 X。一旦 X 读取到接收到的信号,它就会停止在数据线上发送数据并将发送线设置为 0 或 Z。Y 然后将接收到的信号也设置为 0 或 Z。

这都是同步的(在同一个时钟上)。

这是解决此问题的有效方法吗?我认为它在大规模上会变得非常混乱,但我只在一个简单的基于累加器的处理器上工作。

【问题讨论】:

    标签: verilog processor computer-architecture


    【解决方案1】:

    单个时钟域最常见的简单握手是有效/就绪握手。

    如果“X”正在发送到“Y”,则 X 的输出为 datavalid,而 Y 的输出为 ready

    当 X 有数据要发送时,它断言有效,并准备好。如果在 posedge 时钟上 valid 和 ready 为高电平,则 X 将考虑发送数据,Y 将考虑接收数据。

    此方案的优点是您可以在每个时钟周期发送一个数据而无需任何停机时间。如果 valid/ready 为高后的下一个周期仍为高,则认为这是第二个数据包。

    此外,没有要求 Y 在它断言就绪之前等待查看有效,Y 可以在它可以接收数据的任何时候断言就绪。

    您描述的方案就是我所说的“请求/确认 4 阶段握手”,因为发送一个数据需要四个时钟周期

    1. req=1 ack=0
    2. req=1 ack=1
    3. req=0 ack=1
    4. req=0 ack=0
    

    当跨时钟边界执行异步请求时,这种接口会更好,因为它消除了两次解释数据包的任何可能性。但是对于完全同步的接口,您不需要它。

    【讨论】:

      【解决方案2】:

      我经常使用类似于 Tims 建议的方案来让 FSM 相互触发/暂停。 go (req) 信号可能会触发较低或辅助模块中的处理,该处理在完成时进行确认。

      reg go;
      reg complete;
      
      //abstracted FSM1
      always @(posedge clk) begin
        case( fsm1_state )
          START_SUB : begin
            go              <= 1'b1;
            fsm1_next_state <= WAIT_SUB;
          end
          WAIT_SUB: begin
            if (complete == 1'b1) begin
              go              <= 1'b0;
              fsm1_next_state <= COMPLETED_SUB;
            end
            else begin
              go              <= 1'b1;         //Might not be required to hold high in Synch design
              fsm1_next_state <= WAIT_SUB;     // Holds state
            end
          end
          default: begin
            go              <= 1'b0;
            fsm1_next_state <= fsm1_state;
          end
        endcase
      end
      
      //fsm2
      always @(posedge clk) begin
        case( fsm2_state )
          WAITING : begin
            complete        <= 1'b0;
            if (go ==1'b1) begin
              fsm2_next_state <= DOSOMETHING;
            end
            else begin
              fsm2_next_state <= WAITING;
            end 
          end
          DOSOMETHING : begin
            complete        <= 1'b1;
            fsm2_next_state <= WAITING;
            // if an async system wait until go is deasserted
            // rather than pulse complete for 1 cycle
          end
        endcase
      end
      

      应始终初始化或重置状态机,并使用默认情况来消除意外锁定状态。

      【讨论】:

        【解决方案3】:

        我认为您正在寻找设计仲裁者。有许多不同的仲裁方案。最简单的是循环方案。如果有人想要访问资源(如 CPU 或内存等),那么该模块将声明一个请求行。它一直等到仲裁器断言一条授权线,此时它被允许继续其处理,因为它知道它对由仲裁器控制的接口具有专用访问权限。

        【讨论】:

        • 我不确定这是否可行。我有一个控制器,它基于 T 状态,发送信号控制单元何时从数据总线读取、写入数据总线等。功能单元本身不知道数据来自哪里或要去哪里。除非我误解了你的回答。
        • 我不确定您在寻找什么。您可以编辑您的问题以使其更清楚吗?当您说 Z 是 Z 是另一个组件还是高阻抗时?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        相关资源
        最近更新 更多