Академический Документы
Профессиональный Документы
Культура Документы
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Design Name:
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ahblit(hdatain,hclk,hrst,hwrite,hsize,hburst,htrans,hready,haddr1,hresp,out1
);
input [2:0]hburst;
input [2:0]hsize;
input [31:0]hdatain;
input [31:0]haddr1;
input hwrite,hrst,hclk;
reg[31:0] ram1[255:0];
//reg[31:0] ram2[255:0];
//reg[31:0] ram3[255:0];
//reg[31:0] out2;
//reg[31:0] out3;
reg[31:0] addr_reg1;
//reg[31:0] addr_reg2;
//reg[31:0] addr_reg3;
parameter single=3'b000;
parameter undefined=3'b001;
parameter wrap4=3'b010;
parameter wrap8=3'b100;
parameter incr8=3'b101;
parameter wrap16=3'b110;
parameter incr16=3'b111;
parameter BYTE=3'b000;
parameter HALFWORD=3'b001;
parameter doubleword=3'b011;
parameter word4=3'b100;
parameter word8=3'b101;
parameter word16=3'b110;
parameter word32=3'b111;
integer i;
always @(posedge hclk)
begin
case(hsize)
BYTE:
begin
case(hburst)
single:begin
if(hwrite==1)
begin
hresp<=0;
hready<=1;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
out1<=ram1[haddr1];
end
end
undefined:begin
if(hwrite==1)
begin
hresp<=1;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
for(i=0;i<=4;i=i+1)
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+1'b1};
ram1[addr_reg1]<=hdatain;
out1<=ram1[haddr1];
end
end
incr4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
for(i=0;i<=4;i=i+1)
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b001};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
end
wrap4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:2],addr_reg1[1:0]+1'b1};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr8:begin
if(hwrite==1)
begin
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b001};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap8:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:3],addr_reg1[2:0]+1'b1};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b001};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:4],addr_reg1[3:0]+1'b1};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
HALFWORD:begin
case(hburst)
undefined:begin
if(hwrite==1)
begin
hresp<=1;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+2'b10};
ram1[addr_reg1]<=hdatain;
out1<=ram1[haddr1];
end
end
incr4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+2'b10};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
end
wrap4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:3],addr_reg1[2:0]+2'b10};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr8:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+2'b10};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap8:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:4],addr_reg1[3:0]+2'b10};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+2'b10};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:5],addr_reg1[4:0]+2'b10};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
WORD:begin
case(hburst)
undefined:begin
if(hwrite==1)
begin
hresp<=1;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b100};
ram1[addr_reg1]<=hdatain;
out1<=ram1[haddr1];
end
end
incr4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b100};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap4:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:4],addr_reg1[3:0]+3'b100};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr8:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b100};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap8:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:5],addr_reg1[4:0]+3'b100};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
incr16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:0]+3'b100};
ram1[haddr1]<=addr_reg1;
out1<=ram1[haddr1];
end
end
wrap16:begin
if(hwrite==1)
begin
hresp<=0;
hready<=0;
htrans<=2'b10;
ram1[haddr1]<=hdatain;
addr_reg1<=haddr1;
end
else
begin
hresp<=0;
hready<=1;
htrans<=2'b11;
addr_reg1<={addr_reg1[31:6],addr_reg1[5:0]+3'b100};
ram1[addr_reg1]<=hdatain;
out1<=ram1[addr_reg1];
end
end
endmodule