From 92420e248d4449a2aa61e92f05c0867912d48d56 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Wed, 16 Feb 2022 14:44:01 -0800 Subject: Split into multiple files. --- hdl/echo_arbiter.sv | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 hdl/echo_arbiter.sv (limited to 'hdl/echo_arbiter.sv') diff --git a/hdl/echo_arbiter.sv b/hdl/echo_arbiter.sv new file mode 100644 index 0000000..b6892b1 --- /dev/null +++ b/hdl/echo_arbiter.sv @@ -0,0 +1,62 @@ +module echo_arbiter + ( input bit clock + , input bit resetn + + , output bit in0_ready + , input bit in0_valid + , input bit [7:0] in0_data + + , output bit in1_ready + , input bit in1_valid + , input bit [7:0] in1_data + + , input bit out_ready + , output bit out_valid + , output bit [7:0] out_data + ); + + bit in0_hold_valid; + bit [7:0] in0_hold; + + bit in1_hold_valid; + bit [7:0] in1_hold; + + always @(posedge clock) begin + if (!resetn) begin + in0_ready = 0; + in1_ready = 0; + out_valid = 0; + out_data = 0; + in0_hold_valid = 0; + in0_hold = 0; + in1_hold_valid = 0; + in1_hold = 0; + end else begin + if (out_ready) out_valid = 0; + if (in0_ready && in0_valid) begin + in0_hold_valid = 1; + in0_hold = in0_data; + end + if (in1_ready && in1_valid) begin + in1_hold_valid = 1; + in1_hold = in1_data; + end + + if (!out_valid) begin + if (in0_hold_valid) begin + out_valid = 1; + out_data = in0_hold; + in0_hold_valid = 0; + end else if (in1_hold_valid) begin + out_valid = 1; + out_data = in1_hold; + in1_hold_valid = 0; + end + end + + in0_ready = !in0_hold_valid; + in1_ready = !in1_hold_valid; + end + end + +endmodule -- cgit v1.2.3