1
0
mirror of https://github.com/aap/pdp6.git synced 2026-02-09 09:51:33 +00:00
Files
aap.pdp6/verilog/arbiter.v
2019-10-26 16:49:04 +02:00

86 lines
1.7 KiB
Verilog

module arbiter(
input wire clk,
input wire reset,
// Slave 0
input wire [17:0] s0_address,
input wire s0_write,
input wire s0_read,
input wire [35:0] s0_writedata,
output reg [35:0] s0_readdata,
output reg s0_waitrequest,
// Slave 1
input wire [17:0] s1_address,
input wire s1_write,
input wire s1_read,
input wire [35:0] s1_writedata,
output reg [35:0] s1_readdata,
output reg s1_waitrequest,
// Master
output reg [17:0] m_address,
output reg m_write,
output reg m_read,
output reg [35:0] m_writedata,
input wire [35:0] m_readdata,
input wire m_waitrequest
);
wire cyc0 = s0_read | s0_write;
wire cyc1 = s1_read | s1_write;
reg sel0, sel1;
wire connected = sel0 | sel1;
always @(posedge clk or negedge reset) begin
if(~reset) begin
sel0 <= 0;
sel1 <= 0;
end else begin
if(sel0 & ~cyc0 | sel1 & ~cyc1) begin
// disconnect if cycle is done
sel0 <= 0;
sel1 <= 0;
end else if(~connected) begin
// connect to master 0 or 1
if(cyc0)
sel0 <= 1;
else if(cyc1)
sel1 <= 1;
end
end
end
// Do the connection
always @(*) begin
if(sel0) begin
m_address <= s0_address;
m_write <= s0_write;
m_read <= s0_read;
m_writedata <= s0_writedata;
s0_readdata <= m_readdata;
s0_waitrequest <= m_waitrequest;
s1_readdata <= 0;
s1_waitrequest <= 1;
end else if(sel1) begin
m_address <= s1_address;
m_write <= s1_write;
m_read <= s1_read;
m_writedata <= s1_writedata;
s1_readdata <= m_readdata;
s1_waitrequest <= m_waitrequest;
s0_readdata <= 0;
s0_waitrequest <= 1;
end else begin
m_address <= 0;
m_write <= 0;
m_read <= 0;
m_writedata <= 0;
s0_readdata <= 0;
s0_waitrequest <= 1;
s1_readdata <= 0;
s1_waitrequest <= 1;
end
end
endmodule