在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
这样只要修改参数可以是实现代码的扩展。
思考:实际电路有优先级吗?
这方面问题的大神帮忙解答一下,感谢~