mirror of
https://github.com/aap/pdp6.git
synced 2026-02-09 09:51:33 +00:00
86 lines
1.7 KiB
Verilog
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
|