Veriog HDL 基本电路设计15:RR调度

module round_robin (
  input clk,           // 时钟信号
  input rst,           // 复位信号
  input [3:0] inputs,  // 输入端口,4个信号位
  output reg out       // 输出端口,1个信号位
);

  // 内部寄存器声明
  reg [1:0] counter;
  reg [3:0] round_robin_array [0:2];

  // 初始化
  initial begin
    round_robin_array[0] = 4'b0001;  // 第1个信号
    round_robin_array[1] = 4'b0010;  // 第2个信号
    round_robin_array[2] = 4'b0100;  // 第3个信号
    counter = 2'b00;
    out = 1'b0;
  end

  always @ (posedge clk or posedge rst) begin
    if (rst) begin
      counter <= 2'b00;
      out <= 1'b0;
    end else begin
      // 在每次时钟上升沿,将计数器加1
      counter <= counter + 1;

      // 当达到第4个状态时,计数器重置,并选择下一个输入
      if (counter == 2'b11) begin
        counter <= 2'b00;

        if (round_robin_array[2] == 4'b1000) begin
          round_robin_array[2] <= 4'b0001;
        end else if (round_robin_array[1] == 4'b1000) begin
          round_robin_array[1] <= 4'b0001;
          round_robin_array[2] <= round_robin_array[2] << 1;
        end else if (round_robin_array[0] == 4'b1000) begin
          round_robin_array[0] <= 4'b0001;
          round_robin_array[1] <= round_robin_array[1] << 1;
          round_robin_array[2] <= round_robin_array[2] << 1;
        end else begin
          round_robin_array[0] <= round_robin_array[0] << 1;
          round_robin_array[1] <= round_robin_array[1] << 1;
          round_robin_array[2] <= round_robin_array[2] << 1;
        end
      end

      // 根据当前状态,输出对应的输入信号
      if (round_robin_array[0][counter] == 1) begin
        out <= inputs[0];
      end else if (round_robin_array[1][counter] == 1) begin
        out <= inputs[1];
      end else if (round_robin_array[2][counter] == 1) begin
        out <= inputs[2];
      end else begin
        out <= inputs[3];
      end
    end
  end

endmodule

RR调度器的原理非常简单,就是将多个输入信号按照一定的顺序轮流输出。为了实现这个过程,我们需要一些内部寄存器来保存当前状态,包括计数器和一个循环数组。counter记录当前的状态,round_robin_array则保存了输入信号的轮换顺序。

在时钟上升沿触发的always块中,我们首先检查重置信号rst是否被设置,如果是,我们就将counter和out重置为0。否则,我们将counter加1,并检查当前是否需要切换到下一个输入信号。如果counter等于3,表示我们已经输出了四个信号,需要切换到下一个输入。我们根据当前的循环顺序,确定下一个输入信号的位置,并将round_robin_array更新为下一个循环顺序。最后,我们根据当前状态的位置,从inputs中选择对应的输入信号,并将其输出到out端口。

注意到,以上代码中,我们使用了<<和>>运算符,它们分别表示左移和右移操作。通过这些操作,我们能够轻松地实现向左或向右移动一个二进制数的功能,并且可以避免使用循环语句进行迭代。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值