verilog代码实例-round robin arbiter

// ######################################################################
// Filename        : prr_arbiter.v
// Description     : prior round robin arbiter
//                   There are two working modes, divided into:
//                   when the input parameter "ARB_MODE=periodic",the arbiter is periodic switching arbitration
//                   when the input parameter "ARB_MODE=valid",the arbiter is arbitration based on Valid signal
// Author          : 
// Created On      : 
// Last Modified By: 
// Last Modified On: 
// Update Count    : 
// Status          : Verified
// verilog-filelist: None
// verilog-file    : None
// ######################################################################
`timescale 1ns/1ps
module prr_arbiter#(
    parameter  ARB_MODE = "periodic"            ,//periodic , valid
    parameter  REQ_NUM = 8          
)(
    input  wire                     clk_in      ,
    input  wire                     rst_n       ,
    //----------------------------------------------------//
    input  wire     [REQ_NUM-1:0]   req         ,
    input  wire     [REQ_NUM-1:0]   prior       ,
    output wire     [REQ_NUM-1:0]   grant
);
//==============================================================================================//
//======                                 define signal                                  ========//
//==============================================================================================//
    wire    [REQ_NUM-1:0]   req_prior;
    wire    [REQ_NUM-1:0]   req_masked;
    wire    [REQ_NUM-1:0]   mask_higher_req;
    wire    [REQ_NUM-1:0]   grant_masked;
    wire    [REQ_NUM-1:0]   req_unmasked;
    wire    [REQ_NUM-1:0]   unmask_higher_req;
    wire    [REQ_NUM-1:0]   grant_unmask;

    reg     [REQ_NUM-1:0]   pointer_reg;
    wire    [REQ_NUM-1:0]   pointer;
    
    reg     [REQ_NUM-1:0]   grant_reg;
//==============================================================================================//
//======                                 behave of RTL                                  ========//
//==============================================================================================//
    assign req_prior  = req & prior;
    //--------------------------------------------------------------------
    //------simple priority arbitration for masked portion          ------
    //--------------------------------------------------------------------
    assign req_masked = (|req_prior) ? (req_prior & pointer) : (req & pointer);
    assign mask_higher_req = (mask_higher_req|req_masked)<<1;
    assign grant_masked = (~mask_higher_req)&req_masked;
    //--------------------------------------------------------------------
    //------simple priority arbitration for unmasked portion        ------
    //--------------------------------------------------------------------
    assign req_unmasked = (|req_prior) ? req_prior : req ;
    assign unmask_higher_req = (unmask_higher_req|req_unmasked)<<1;
    assign grant_unmask = (~unmask_higher_req)&req_unmasked;
    //--------------------------------------------------------------------
    //------                                                        ------
    //--------------------------------------------------------------------
    assign grant = (|req_masked) ? grant_masked : grant_unmask ;
    
    //******************************************************************//
    //------arbitration based on Valid signal                       ------
    //******************************************************************//
    generate if(ARB_MODE == "valid")begin:gen_valid_arbiter
        always@(posedge clk_in or negedge rst_n)begin
            if(!rst_n)begin
                grant_reg <= {REQ_NUM{1'b0}};
            end else begin
                grant_reg <= grant;
            end
        end
        //--------------------------------------------------------------------
        //------pointer update                                          ------
        //--------------------------------------------------------------------
        always@(posedge clk_in or negedge rst_n)begin
            if(!rst_n)begin
                pointer_reg <= {REQ_NUM{1'b1}};
            end else if((|req_masked == 1'b1) && (|(grant_reg&req) == 1'b0 ))begin
                pointer_reg <= mask_higher_req;
            end else if((|req == 1'b1) && (|(grant_reg&req) == 1'b0 ))begin
                pointer_reg <= unmask_higher_req;
            end else begin
                pointer_reg <= pointer_reg;
            end
        end
        assign pointer = |(grant_reg&req) ? pointer : pointer_reg ;

    //******************************************************************//
    //------periodic switching arbitration                          ------
    //******************************************************************//
    end else begin:gen_periodic_arbiter
        //--------------------------------------------------------------------
        //------pointer update                                          ------
        //--------------------------------------------------------------------
        always@(posedge clk_in or negedge rst_n)begin
            if(!rst_n)begin
                pointer_reg <= {REQ_NUM{1'b1}};
            end else if(|req_masked == 1'b1)begin
                pointer_reg <= mask_higher_req;
            end else if(|req == 1'b1)begin
                pointer_reg <= unmask_higher_req;
            end else begin
                pointer_reg <= pointer_reg;
            end
        end
        assign pointer = pointer_reg ;
    end endgenerate
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值