Apb Protocol
Apb Protocol
DESIGN:
module apb_protocol (PCLK,PRESETn,PADDR,PWRITE,PSEL,PENABLE,PWDATA,PRDATA,PREADY);
input PCLK;
input PRESETn;
input PSEL;
input [31:0]PADDR;
input PWRITE;
input PENABLE;
input [31:0]PWDATA;
input PREADY;
reg [31:0]array[31:0];
begin
if(PRESETn)
end
always@(*)
begin
case(present_state)
idle_mode:begin
if(PSEL && !PENABLE)
next_state <=idle_mode;
end
setup_mode:begin
if (PSEL && PENABLE)
next_state <=acess_mode;
else
next_state <=idle_mode;
end
acess_mode:begin
else
default :
next_state <= idle_mode;
endcase
end
always @(posedge PCLK or PWRITE)
begin
if(next_state == idle_mode)
PRDATA <= 0;
else if (next_state == setup_mode)
PRDATA <= 0;
else begin
else begin
PRDATA <= array[PADDR];end
end
end
endmodule
TEST BENCH:
module apb_tb;
// Inputs
reg PCLK;
reg PRESETn;
reg [31:0] PADDR;
reg PWRITE;
reg PSEL;
reg PENABLE;
reg [31:0] PWDATA;
reg PREADY;
// Outputs
.PCLK(PCLK),
.PRESETn(PRESETn),
.PADDR(PADDR),
.PWRITE(PWRITE),
.PSEL(PSEL),
.PENABLE(PENABLE),
.PWDATA(PWDATA),
.PRDATA(PRDATA),
.PREADY(PREADY)
);
initial begin
// Initialize Inputs
PCLK = 0;
PRESETn = 1;
PADDR = 0;
PWRITE = 0;
PSEL = 0;
PENABLE = 0;
PWDATA = 0;
PREADY = 0;
end
initial begin
PCLK = 1'b1;
forever #5 PCLK = ~PCLK;
end
initial begin
#3;
PRESETn = 0;
#8;
PWRITE = 1;
PADDR = 1;
PWDATA = 32'd8;
PREADY = 1;
PSEL = 1;
#10;
PENABLE = 1;
PREADY = 0;
#10;
PADDR = 2;
PWDATA = 32'd20;
#10;
PREADY = 1;
#10;
PSEL = 0;
PENABLE = 0;
PREADY = 0;
#10;
PREADY = 1;
#10;
PWRITE = 0;
PSEL = 1;
#10;
PENABLE = 1;
PREADY = 0;
#10;
PADDR = 1;
#10;
PREADY = 1;
#10;
PSEL = 0;
PENABLE = 0;
PREADY = 0;
end
endmodule
SIMULATION OUPUT: