Skip to content

Commit a5c7c9c

Browse files
authored
Merge pull request #12 from LSC-Unicamp/reestruturando_projeto
Corrigindo sinais da memoria de dados
2 parents 726dbb1 + ca651ef commit a5c7c9c

File tree

2 files changed

+180
-8
lines changed

2 files changed

+180
-8
lines changed

rtl/axi4_to_wishbone.sv

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
module axi4_to_wishbone_simple #(
2+
parameter ADDR_WIDTH = 32,
3+
parameter DATA_WIDTH = 32,
4+
parameter ID_WIDTH = 4
5+
)(
6+
input logic clk,
7+
input logic rst_n,
8+
9+
// AXI Write Address Channel
10+
input logic [ID_WIDTH-1:0] S_AXI_AWID,
11+
input logic [ADDR_WIDTH-1:0] S_AXI_AWADDR,
12+
input logic S_AXI_AWVALID,
13+
output logic S_AXI_AWREADY,
14+
15+
// AXI Write Data Channel
16+
input logic [DATA_WIDTH-1:0] S_AXI_WDATA,
17+
input logic [(DATA_WIDTH/8)-1:0] S_AXI_WSTRB,
18+
input logic S_AXI_WVALID,
19+
output logic S_AXI_WREADY,
20+
21+
// AXI Write Response Channel
22+
output logic [ID_WIDTH-1:0] S_AXI_BID,
23+
output logic [1:0] S_AXI_BRESP,
24+
output logic S_AXI_BVALID,
25+
input logic S_AXI_BREADY,
26+
27+
// AXI Read Address Channel
28+
input logic [ID_WIDTH-1:0] S_AXI_ARID,
29+
input logic [ADDR_WIDTH-1:0] S_AXI_ARADDR,
30+
input logic S_AXI_ARVALID,
31+
output logic S_AXI_ARREADY,
32+
33+
// AXI Read Data Channel
34+
output logic [ID_WIDTH-1:0] S_AXI_RID,
35+
output logic [DATA_WIDTH-1:0] S_AXI_RDATA,
36+
output logic [1:0] S_AXI_RRESP,
37+
output logic S_AXI_RVALID,
38+
input logic S_AXI_RREADY,
39+
40+
// Wishbone Interface
41+
output logic WB_CYC,
42+
output logic WB_STB,
43+
output logic WB_WE,
44+
output logic [ADDR_WIDTH-1:0] WB_ADDR,
45+
output logic [DATA_WIDTH-1:0] WB_WDATA,
46+
output logic [(DATA_WIDTH/8)-1:0] WB_SEL,
47+
input logic [DATA_WIDTH-1:0] WB_RDATA,
48+
input logic WB_ACK
49+
);
50+
51+
// Estados
52+
typedef enum logic [2:0] {
53+
IDLE,
54+
WB_WRITE,
55+
WB_WRITE_RESP,
56+
WB_READ,
57+
WB_READ_RESP
58+
} state_t;
59+
60+
state_t state, next_state;
61+
62+
// Registradores internos
63+
logic [ADDR_WIDTH-1:0] addr_reg;
64+
logic [DATA_WIDTH-1:0] wdata_reg;
65+
logic [(DATA_WIDTH/8)-1:0] wstrb_reg;
66+
logic [ID_WIDTH-1:0] id_reg;
67+
logic is_write;
68+
69+
// FSM principal
70+
always_ff @(posedge clk or negedge rst_n) begin
71+
if (!rst_n) begin
72+
state <= IDLE;
73+
end else begin
74+
state <= next_state;
75+
end
76+
end
77+
78+
always_comb begin
79+
// Defaults
80+
S_AXI_AWREADY = 0;
81+
S_AXI_WREADY = 0;
82+
S_AXI_BVALID = 0;
83+
S_AXI_BRESP = 2'b00;
84+
S_AXI_BID = id_reg;
85+
86+
S_AXI_ARREADY = 0;
87+
S_AXI_RVALID = 0;
88+
S_AXI_RRESP = 2'b00;
89+
S_AXI_RDATA = WB_RDATA;
90+
S_AXI_RID = id_reg;
91+
92+
WB_CYC = 0;
93+
WB_STB = 0;
94+
WB_WE = 0;
95+
WB_ADDR = addr_reg;
96+
WB_WDATA = wdata_reg;
97+
WB_SEL = wstrb_reg;
98+
99+
next_state = state;
100+
101+
case (state)
102+
IDLE: begin
103+
if (S_AXI_AWVALID && S_AXI_WVALID) begin
104+
next_state = WB_WRITE;
105+
end else if (S_AXI_ARVALID) begin
106+
next_state = WB_READ;
107+
end
108+
end
109+
110+
WB_WRITE: begin
111+
WB_CYC = 1;
112+
WB_STB = 1;
113+
WB_WE = 1;
114+
if (WB_ACK) begin
115+
next_state = WB_WRITE_RESP;
116+
end
117+
end
118+
119+
WB_WRITE_RESP: begin
120+
S_AXI_BVALID = 1;
121+
if (S_AXI_BREADY) begin
122+
next_state = IDLE;
123+
end
124+
end
125+
126+
WB_READ: begin
127+
WB_CYC = 1;
128+
WB_STB = 1;
129+
if (WB_ACK) begin
130+
next_state = WB_READ_RESP;
131+
end
132+
end
133+
134+
WB_READ_RESP: begin
135+
S_AXI_RVALID = 1;
136+
if (S_AXI_RREADY) begin
137+
next_state = IDLE;
138+
end
139+
end
140+
endcase
141+
end
142+
143+
// Captura de endereço/dados
144+
always_ff @(posedge clk or negedge rst_n) begin
145+
if (!rst_n) begin
146+
addr_reg <= 0;
147+
wdata_reg <= 0;
148+
wstrb_reg <= 0;
149+
id_reg <= 0;
150+
end else begin
151+
if (state == IDLE) begin
152+
if (S_AXI_AWVALID && S_AXI_WVALID) begin
153+
addr_reg <= S_AXI_AWADDR;
154+
wdata_reg <= S_AXI_WDATA;
155+
wstrb_reg <= S_AXI_WSTRB;
156+
id_reg <= S_AXI_AWID;
157+
S_AXI_AWREADY <= 1;
158+
S_AXI_WREADY <= 1;
159+
end else if (S_AXI_ARVALID) begin
160+
addr_reg <= S_AXI_ARADDR;
161+
id_reg <= S_AXI_ARID;
162+
S_AXI_ARREADY <= 1;
163+
end
164+
end
165+
end
166+
end
167+
168+
endmodule

rtl/controller.sv

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ always_ff @(posedge clk ) begin
160160
finish_execution <= 1'b0;
161161
else begin
162162
if(bus_mode) begin
163-
if(core_addr_i[5:0] == end_position[5:0])
163+
if(core_addr_i[5:0] == end_position[5:0]
164+
`ifdef ENABLE_SECOND_MEMORY
165+
|| data_mem_addr_i[5:0] == end_position[5:0]
166+
`endif
167+
)
164168
finish_execution <= 1'b1;
165169
end else begin
166170
if(core_addr_i == end_position
@@ -285,15 +289,15 @@ Memory #(
285289
) Core_Data_Memory (
286290
.clk (clk),
287291

288-
.cyc_i (data_memory_cyc_i),
289-
.stb_i (data_memory_stb_i),
290-
.we_i (data_memory_we_i),
292+
.cyc_i (data_memory_cyc),
293+
.stb_i (data_memory_stb),
294+
.we_i (data_memory_we),
291295

292-
.addr_i (data_memory_addr_i),
293-
.data_i (data_memory_data_i),
294-
.data_o (data_memory_data_o),
296+
.addr_i (data_memory_address),
297+
.data_i (data_memory_write_data),
298+
.data_o (data_memory_read_data),
295299

296-
.ack_o (data_memory_ack_o)
300+
.ack_o (data_memory_ack)
297301
);
298302
`endif
299303

0 commit comments

Comments
 (0)