RTL编码之“严格优先级调度方法“

本文讨论了在RTL编码中如何使用if-else和for循环实现多通道FIFO的优先级调度,分别介绍了低位和高位优先级的代码示例,以及如何通过参数化适应不同数量的队列/通道。最后提出关于实际电路优先级设定的问题。
摘要由CSDN通过智能技术生成

在RTL编码中,经常遇到多个队列(或者多通道/FIFO)优先级调度。若队列(或者通道/FIFO)数较少,可以通过if-else可以实现优先级调度。

代码如下:

module pri_sch
(
    input                               clk         ,
    input                               rst_n       ,
    input                               sch_en      ,
    input           [4-1:0]             que_st      ,
    output  reg     [2-1:0]             que_id
);

/*if-else 实现优先级调度,低位优先级高*/
always @ (posedge clk or negedge rst_n) begin
    if (rst_n == 1'b0)
        que_id <= 2'd0;
    else if ((sch_en == 1'b1) && (|que_st == 1'b1)) begin
        if (que_st[0] == 1'b1)
            que_id <= 2'd0;
        else if (que_st[1] == 1'b1)
            que_id <= 2'd1;
        else if (que_st[2] == 1'b1)
            que_id <= 2'd2;
        else
            que_id <= 2'd3;
    end
    else;
end

endmodule

当队列(或者通道/FIFO)数大于8时,代码长度可知。

使用for循环实现优先级调度且易于扩展。

高位优先级高:

module pri_sch #(
    parameter NUM = 8   ,
    parameter WIDTH = $clog2(NUM)
)
(
    input                               clk         ,
    input                               rst_n       ,
    input                               sch_en      ,
    input           [NUM-1:0]           que_st      ,
    output  reg     [WIDTH-1:0]         que_id
);

/*高位优先级高*/
always @ (posedge clk or negedge rst_n) begin : HIGH_BIT_PRI_SCH
    integer i;
    if (rst_n == 1'b0) begin
        que_id <= {WIDTH{1'b0}};
    end
    else if ((sch_en == 1'b1) && (|que_st == 1'b1)) begin
        for (i = 0; i < NUM; i = i + 1) begin
            if (que_st[i] == 1'b1) begin
                que_id <= i[WIDTH-1:0];
            end
        end
    end
    else;
end

endmodule

低位优先级高:

module pri_sch #(
    parameter NUM = 8   ,
    parameter WIDTH = $clog2(NUM)
)
(
    input                               clk         ,
    input                               rst_n       ,
    input                               sch_en      ,
    input           [NUM-1:0]           que_st      ,
    output  reg     [WIDTH-1:0]         que_id
);

/*低位优先级高*/
always @ (posedge clk or negedge rst_n) begin : LOW_BIT_PRI_SCH
    integer i;
    if (rst_n == 1'b0) begin
        que_id <= {WIDTH{1'b0}};
    end
    else if ((sch_en == 1'b1) && (|que_st == 1'b1)) begin
        for (i = NUM - 1; i >= 1; i = i - 1) begin
            if (que_st[i] == 1'b1) begin
                que_id <= i[WIDTH-1:0];
            end
        end
    end
    else;
end

endmodule

这样只要修改参数可以是实现代码的扩展。

思考:实际电路有优先级吗?

这方面问题的大神帮忙解答一下,感谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值