mirror of
https://github.com/alexforencich/verilog-ethernet.git
synced 2025-01-28 07:03:08 +08:00
Add LSB_PRIORITY parameter
This commit is contained in:
parent
b123525597
commit
d193ca5905
@ -35,7 +35,9 @@ module arbiter #
|
|||||||
// arbitration type: "PRIORITY" or "ROUND_ROBIN"
|
// arbitration type: "PRIORITY" or "ROUND_ROBIN"
|
||||||
parameter TYPE = "PRIORITY",
|
parameter TYPE = "PRIORITY",
|
||||||
// block type: "NONE", "REQUEST", "ACKNOWLEDGE"
|
// block type: "NONE", "REQUEST", "ACKNOWLEDGE"
|
||||||
parameter BLOCK = "NONE"
|
parameter BLOCK = "NONE",
|
||||||
|
// LSB priority: "LOW", "HIGH"
|
||||||
|
parameter LSB_PRIORITY = "LOW"
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire clk,
|
input wire clk,
|
||||||
@ -62,7 +64,8 @@ wire [$clog2(PORTS)-1:0] request_index;
|
|||||||
wire [PORTS-1:0] request_mask;
|
wire [PORTS-1:0] request_mask;
|
||||||
|
|
||||||
priority_encoder #(
|
priority_encoder #(
|
||||||
.WIDTH(PORTS)
|
.WIDTH(PORTS),
|
||||||
|
.LSB_PRIORITY(LSB_PRIORITY)
|
||||||
)
|
)
|
||||||
priority_encoder_inst (
|
priority_encoder_inst (
|
||||||
.input_unencoded(request),
|
.input_unencoded(request),
|
||||||
@ -78,7 +81,8 @@ wire [$clog2(PORTS)-1:0] masked_request_index;
|
|||||||
wire [PORTS-1:0] masked_request_mask;
|
wire [PORTS-1:0] masked_request_mask;
|
||||||
|
|
||||||
priority_encoder #(
|
priority_encoder #(
|
||||||
.WIDTH(PORTS)
|
.WIDTH(PORTS),
|
||||||
|
.LSB_PRIORITY(LSB_PRIORITY)
|
||||||
)
|
)
|
||||||
priority_encoder_masked (
|
priority_encoder_masked (
|
||||||
.input_unencoded(request & mask_reg),
|
.input_unencoded(request & mask_reg),
|
||||||
@ -113,12 +117,20 @@ always @* begin
|
|||||||
grant_valid_next = 1;
|
grant_valid_next = 1;
|
||||||
grant_next = masked_request_mask;
|
grant_next = masked_request_mask;
|
||||||
grant_encoded_next = masked_request_index;
|
grant_encoded_next = masked_request_index;
|
||||||
|
if (LSB_PRIORITY == "LOW") begin
|
||||||
mask_next = {PORTS{1'b1}} >> (PORTS - masked_request_index);
|
mask_next = {PORTS{1'b1}} >> (PORTS - masked_request_index);
|
||||||
|
end else begin
|
||||||
|
mask_next = {PORTS{1'b1}} << (masked_request_index + 1);
|
||||||
|
end
|
||||||
end else begin
|
end else begin
|
||||||
grant_valid_next = 1;
|
grant_valid_next = 1;
|
||||||
grant_next = request_mask;
|
grant_next = request_mask;
|
||||||
grant_encoded_next = request_index;
|
grant_encoded_next = request_index;
|
||||||
|
if (LSB_PRIORITY == "LOW") begin
|
||||||
mask_next = {PORTS{1'b1}} >> (PORTS - request_index);
|
mask_next = {PORTS{1'b1}} >> (PORTS - request_index);
|
||||||
|
end else begin
|
||||||
|
mask_next = {PORTS{1'b1}} << (request_index + 1);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -31,7 +31,9 @@ THE SOFTWARE.
|
|||||||
*/
|
*/
|
||||||
module priority_encoder #
|
module priority_encoder #
|
||||||
(
|
(
|
||||||
parameter WIDTH = 4
|
parameter WIDTH = 4,
|
||||||
|
// LSB priority: "LOW", "HIGH"
|
||||||
|
parameter LSB_PRIORITY = "LOW"
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input wire [WIDTH-1:0] input_unencoded,
|
input wire [WIDTH-1:0] input_unencoded,
|
||||||
@ -48,14 +50,19 @@ generate
|
|||||||
if (WIDTH == 2) begin
|
if (WIDTH == 2) begin
|
||||||
// two inputs - just an OR gate
|
// two inputs - just an OR gate
|
||||||
assign output_valid = |input_unencoded;
|
assign output_valid = |input_unencoded;
|
||||||
|
if (LSB_PRIORITY == "LOW") begin
|
||||||
assign output_encoded = input_unencoded[1];
|
assign output_encoded = input_unencoded[1];
|
||||||
|
end else begin
|
||||||
|
assign output_encoded = ~input_unencoded[0];
|
||||||
|
end
|
||||||
end else begin
|
end else begin
|
||||||
// more than two inputs - split into two parts and recurse
|
// more than two inputs - split into two parts and recurse
|
||||||
// also pad input to correct power-of-two width
|
// also pad input to correct power-of-two width
|
||||||
wire [$clog2(W2)-1:0] out1, out2;
|
wire [$clog2(W2)-1:0] out1, out2;
|
||||||
wire valid1, valid2;
|
wire valid1, valid2;
|
||||||
priority_encoder #(
|
priority_encoder #(
|
||||||
.WIDTH(W2)
|
.WIDTH(W2),
|
||||||
|
.LSB_PRIORITY(LSB_PRIORITY)
|
||||||
)
|
)
|
||||||
priority_encoder_inst1 (
|
priority_encoder_inst1 (
|
||||||
.input_unencoded(input_unencoded[W2-1:0]),
|
.input_unencoded(input_unencoded[W2-1:0]),
|
||||||
@ -63,7 +70,8 @@ generate
|
|||||||
.output_encoded(out1)
|
.output_encoded(out1)
|
||||||
);
|
);
|
||||||
priority_encoder #(
|
priority_encoder #(
|
||||||
.WIDTH(W2)
|
.WIDTH(W2),
|
||||||
|
.LSB_PRIORITY(LSB_PRIORITY)
|
||||||
)
|
)
|
||||||
priority_encoder_inst2 (
|
priority_encoder_inst2 (
|
||||||
.input_unencoded({{W1-WIDTH{1'b0}}, input_unencoded[WIDTH-1:W2]}),
|
.input_unencoded({{W1-WIDTH{1'b0}}, input_unencoded[WIDTH-1:W2]}),
|
||||||
@ -72,7 +80,11 @@ generate
|
|||||||
);
|
);
|
||||||
// multiplexer to select part
|
// multiplexer to select part
|
||||||
assign output_valid = valid1 | valid2;
|
assign output_valid = valid1 | valid2;
|
||||||
|
if (LSB_PRIORITY == "LOW") begin
|
||||||
assign output_encoded = valid2 ? {1'b1, out2} : {1'b0, out1};
|
assign output_encoded = valid2 ? {1'b1, out2} : {1'b0, out1};
|
||||||
|
end else begin
|
||||||
|
assign output_encoded = valid1 ? {1'b0, out1} : {1'b1, out2};
|
||||||
|
end
|
||||||
end
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user