VerilogHDL代码AHB总线master部分.docx
《VerilogHDL代码AHB总线master部分.docx》由会员分享,可在线阅读,更多相关《VerilogHDL代码AHB总线master部分.docx(13页珍藏版)》请在冰豆网上搜索。
VerilogHDL代码AHB总线master部分
VerilogHDL代码_AHB总线_master部分
moduleahb_master(HBUSREQ,HLOCK,HTRANS,HADDR,HWRITE,HSIZE,HBURST,HWDATA,HSEL,hcount,HRESETn,HCLK,HGRANT,HREADY,HRESP,HRDATA,BUSREQ,ADDREQ,WRITE,ADDR,SIZE,BURST,SEL,TRANS,WDATA);
outputHBUSREQ,HLOCK,HWRITE;
output[1:
0]HTRANS,HSEL;
output[31:
0]HADDR,HWDATA;
output[2:
0]HSIZE,HBURST;
inputHGRANT,HREADY,HCLK,HRESETn,BUSREQ,ADDREQ,WRITE;
input[31:
0]ADDE,WDATA;
input[2:
0]SIZE,BURST;
input[1:
0]HRESP,SEL,TRANS;
input[31:
0]HRDATA;
regHBUSRREQ,HLOCK,HWRITE,hcount;
reg[1:
0]HTRANS,HSEL;
reg[31:
0]HADDR,HWDATA;
reg[2:
0]HSIZE,HBURST;
wireHGRANT,HREADY,HCLK,HRESETn,WRITE;
wire[31:
0]ADDR,WDATA;
wire[2:
0]SIZE,BURST;
wire[1:
0]HRESP,SEL,TRANS;
wire[31:
0]HRDATA;
regbus_reg,adde_reg,new_hready,old_hready;
reg[31:
0]RDATA;
reg[31:
0]h_addr;
parameterOKAY=2'b00
ERROR=2'b01
RETRY=2'b10
SPLIT=2'b11;
always@(posedgeHCLK)
begin
if(!
HRESETn)
begin
HBUSREQ=0;
HLOCK=0;
HWRITE=0;
HTRANS=2'b00;
HSEL=2'b00;
HADDR=32'h000000000;
HWDATA=32'h000000000;
HSIZE=2'b00;
HBURST=2'b00;
bus_reg=0;
addr_reg=0;
new_hready=0;
old_hready=0;
hcount=0;
end
end
always@(posedgeHCLK)
begin
if(HRESETn)
begin
if(!
addr_reg)
begin
if(ADDREQ)
begin
HADDR=ADDR;
h_addr=ADDR;
HWRITE=WRITE;
HSIZE=SIZE;
HBURST=BURST;
HSEL=SEL;
HTRANS=TRANS;
addr_reg=1'b1;
HWDATA=32'h000000000;
end
end
elseif(addr_reg)
begin
HADDR=32'h000000000;
HWRITE=1'b0;
HSIZE=3'b000;
HBURST=3'b000;
HTRANS=2'b00;
addr_reg=1'b0;
end
if(!
ADDREQ)
begin
if(WRITE)
begin
hcount=0;
case({TRANS})
2'b00:
begin
HWDATA=WDATA;
if(HREADY&&!
new_hready&&HRESP==ERROR)
new_hready=1;
elseif(new_hready!
=old_hready)
HWDATA=32'h00000000;
end
2'b01:
begin
hcount=hcount+1;
new_hready=0;
HWDATA=WDATA;
if(HREADY&&!
new_hready&&HRESP)
new_hready=1;
elseif(new_hready!
=oldhready)
hWDATA=32'h00000000;
end
2'b10:
begin
HWDATA=32'h00000000;
end
2'b11:
begin
hcount=hcount+1;
HWDATA=WDATA;
if(HREADY&&HRESP==OKAY)
begin
if(!
new_hready)
new_hready=1;
end
elseif(new_hready!
=old_hready)
begin
HWDATA=WDATA;
new_hready=0;
end
elseif(HREADY&&HRESP==ERROR)
begin
HWDATA=32'h00000000;
end
end
endcase
end
elseif(!
WRITE)
begin
case({TRANS})
2'b00:
begin
if(!
HREADY)
RDATA=HRDATA;
elseif(HREADY)
RDATA=32'h00000000;
end
2'b01:
begin
if(!
HREADY)
begin
RDATA=HRDATA;
if(HBURST==000)
h_addr=h_addr+1;
else
h_addr=h_addr-1;
end
elseif(HREADY)
RDATA=32'h00000000;
end
2'b10:
begin
RDATA=32'h00000000;
end
2'b11:
begin
if(!
HREADY)
begin
RDATA=HRDATA;
if(HBURST==000)
h_addr=h_addr+1;
else
h_addr=h_addr-1;
end
endcase
end
end
end
endmodule
moduleram_top(
HCLK,
HRESETn,
HSEL_s,
HADDR_s,
HBURST_s,
HTRANS_s,
HRDATA_s,
HWDATA_s,
HWRITE_s,
HREADY_s,
HRESP_s
);
inputHCLK;
inputHRESETn;
inputHSEL_s;
input[19:
0]HADDR_s;
input[2:
0]HBURST_s;
input[1:
0]HTRANS_s;
input[31:
0]HWDATA_s;
inputHWRITE_s;
output[1:
0]HRESP_s;
output[31:
0]HRDATA_s;
outputHREADY_s;
wire[31:
0]ram_RDATA;
wire[17:
0]ram_ADDR;
wire[31:
0]ram_WDATA;
wireram_WRITE;
ram_ahbifU_ram_ahbif(
.HCLK(HCLK),
.HRESETn(HRESETn),
.HSEL_s(HSEL_s),
.HADDR_s(HADDR_s),
.HBURST_s(HBURST_s),
.HTRANS_s(HTRANS_s),
.HRDATA_s(HRDATA_s),
.HWDATA_s(HWDATA_s),
.HWRITE_s(HWRITE_s),
.HREADY_s(HREADY_s),
.HRESP_s(HRESP_s),
.ram_RDATA(ram_RDATA),
.ram_ADDR(ram_ADDR),
.ram_WDATA(ram_WDATA),
.ram_WRITE(ram_WRITE)
);
ram_inferU_ram_infer(
.q(ram_RDATA),
.a(ram_ADDR),
.d(ram_WDATA),
.we(ram_WRITE),
.clk(HCLK)
);
endmodule
moduleram_infer(
q,
a,
d,
we,
clk
);
output[31:
0]q;
input[31:
0]d;
input[17:
0]a;
inputwe;
inputclk;
reg[31:
0]mem[262143:
0];
always@(posedgeclk)
begin
if(we)
begin
mem[a]<=d;
end
end
assignq=mem[a];
endmodule
moduleram_ahbif(
HCLK,HRESETn,
HSEL_s,
HADDR_s,
HBURST_s,
HTRANS_s,
HRDATA_s,
HWDATA_s,
HWRITE_s,
HREADY_s,
HRESP_s,
ram_RDATA,
ram_ADDR,
ram_WDATA,
ram_WRITE
);
///////////////////////////////////////
//declarationofinput&output
///////////////////////////////////////
inputHCLK;
inputHRESETn;
inputHSEL_s;
input[19:
0]HADDR_s;
input[2:
0]HBURST_s;
input[1:
0]HTRANS_s;
input[31:
0]HWDATA_s;
inputHWRITE_s;
output[1:
0]HRESP_s;
output[31:
0]HRDATA_s;
outputHREADY_s;
input[31:
0]ram_RDATA;
output[17:
0]ram_ADDR;
output[31:
0]ram_WDATA;
outputram_WRITE;
///////////////////////////////////////
//declarationofregisters&wires///////////////////////////////////////
wire[1:
0]HRESP_s;
wire[31:
0]HRDATA_s;
regHREADY_s;
wire[31:
0]ram_WDATA;
reg[17:
0]ram_ADDR;
regram_WRITE;
wirewr_en;
wirerd_en;
wireready_en;
///////////////////////////////////////
//program&function
///////////////////////////////////////
assignHRESP_s=2'b00;
always@(posedgeHCLKornegedgeHRESETn)
begin//HSIZE=3'b010--32bits
if(!
HRESETn)begin
ram_ADDR<=18'b000000000000000000;
end
elseif(HSEL_s==1'b1)
begin
ram_ADDR<=HADDR_s[19:
2];
end
end
assignwr_en=HSEL_s&HTRANS_s[1]&HWRITE_s;
always@(posedgeHCLKornegedgeHRESETn)
begin
if(!
HRESETn)
begin
ram_WRITE<=1'b0;
end
elseif(wr_en)
begin
ram_WRITE<=1'b1;
end
else
begin
ram_WRITE<=1'b0;
end
end
assignram_WDATA=HWDATA_s;
assignHRDATA_s=ram_RDATA;
assignready_en=HSEL_s&HTRANS_s[1];
always@(posedgeHCLKornegedgeHRESETn)
begin
if(!
HRESETn)
begin
HREADY_s<=1'b0;
end
elseif(ready_en)
begin
HREADY_s<=1'b1;
end
else
begin
HREADY_s<=1'b0;
end
end
endmodule