Skip to content

Commit bf6d8a6

Browse files
committed
Adicionando conversor de barramento para ahb
1 parent a5c7c9c commit bf6d8a6

1 file changed

Lines changed: 120 additions & 0 deletions

File tree

rtl/ahblite_to_wishbone.sv

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
module ahb_to_wishbone #(
2+
parameter ADDR_WIDTH = 32,
3+
parameter DATA_WIDTH = 32
4+
)(
5+
input logic HCLK,
6+
input logic HRESETn,
7+
8+
// AHB Interface
9+
input logic [ADDR_WIDTH-1:0] HADDR,
10+
input logic [1:0] HTRANS,
11+
input logic HWRITE,
12+
input logic [2:0] HSIZE,
13+
input logic [2:0] HBURST,
14+
input logic [3:0] HPROT,
15+
input logic HLOCK,
16+
input logic [DATA_WIDTH-1:0] HWDATA,
17+
input logic HREADY,
18+
output logic [DATA_WIDTH-1:0] HRDATA,
19+
output logic HREADYOUT,
20+
output logic [1:0] HRESP,
21+
22+
// Wishbone Interface
23+
output logic wb_cyc,
24+
output logic wb_stb,
25+
output logic wb_we,
26+
output logic [ADDR_WIDTH-1:0] wb_adr,
27+
output logic [DATA_WIDTH-1:0] wb_dat_w,
28+
input logic [DATA_WIDTH-1:0] wb_dat_r,
29+
input logic wb_ack
30+
);
31+
32+
// Internal state
33+
logic ahb_active;
34+
logic [2:0] burst_cnt;
35+
logic burst_en;
36+
logic [ADDR_WIDTH-1:0] base_addr;
37+
logic [2:0] beat_size;
38+
39+
// AHB access condition
40+
logic ahb_access = (HTRANS[1] == 1'b1) && HREADY;
41+
42+
// Response and read data
43+
assign HRDATA = wb_dat_r;
44+
assign HRESP = 2'b00; // OKAY
45+
assign HREADYOUT = 1'b1; // Always ready (zero-wait for now)
46+
47+
// Burst type check
48+
logic is_burst = (HBURST != 3'b000); // Not SINGLE
49+
50+
always_ff @(posedge HCLK or negedge HRESETn) begin
51+
if (!HRESETn) begin
52+
wb_cyc <= 0;
53+
wb_stb <= 0;
54+
wb_we <= 0;
55+
wb_adr <= 0;
56+
wb_dat_w <= 0;
57+
ahb_active <= 0;
58+
burst_cnt <= 0;
59+
burst_en <= 0;
60+
base_addr <= 0;
61+
beat_size <= 0;
62+
end else begin
63+
// Default deassertions
64+
wb_cyc <= 0;
65+
wb_stb <= 0;
66+
67+
if (ahb_access && !ahb_active) begin
68+
// Start transaction
69+
wb_adr <= HADDR;
70+
wb_we <= HWRITE;
71+
wb_dat_w <= HWDATA;
72+
wb_cyc <= 1;
73+
wb_stb <= 1;
74+
ahb_active <= 1;
75+
76+
// Save base and setup burst
77+
base_addr <= HADDR;
78+
beat_size <= HSIZE;
79+
burst_cnt <= get_burst_len(HBURST); // Number of beats
80+
burst_en <= is_burst;
81+
end else if (ahb_active && wb_ack) begin
82+
// On ACK: if burst, prepare next beat
83+
if (burst_en && burst_cnt > 1) begin
84+
wb_cyc <= 1;
85+
wb_stb <= 1;
86+
wb_we <= HWRITE;
87+
wb_adr <= next_burst_addr(wb_adr, beat_size);
88+
wb_dat_w <= HWDATA;
89+
burst_cnt <= burst_cnt - 1;
90+
ahb_active <= 1; // continue burst
91+
end else begin
92+
ahb_active <= 0;
93+
burst_en <= 0;
94+
end
95+
end
96+
end
97+
end
98+
99+
// Function to compute number of beats from HBURST
100+
function [2:0] get_burst_len(input [2:0] burst);
101+
case (burst)
102+
3'b000: get_burst_len = 3'd1; // SINGLE
103+
3'b001: get_burst_len = 3'd4; // INCR4
104+
3'b010: get_burst_len = 3'd8; // INCR8
105+
3'b011: get_burst_len = 3'd16; // INCR16
106+
default: get_burst_len = 3'd1; // INCR (undefined length)
107+
endcase
108+
endfunction
109+
110+
// Function to calculate next burst address (incremental only)
111+
function [ADDR_WIDTH-1:0] next_burst_addr(
112+
input [ADDR_WIDTH-1:0] addr,
113+
input [2:0] size
114+
);
115+
begin
116+
next_burst_addr = addr + (1 << size); // increment by beat size
117+
end
118+
endfunction
119+
120+
endmodule

0 commit comments

Comments
 (0)