Я пытаюсь реализовать мост OCP-AXI для преобразования сигналов OCP в сигналы AXI, чтобы мастер OCP мог общаться с подчиненным AXI. Тем не менее, я довольно плох в Verilog, поскольку я новичок в этом, и я думаю, что мне немного неясно, как работает мост.
Я попытался написать код, как показано ниже.
В настоящее время моя идея моста OCP-AXI состоит в том, чтобы отображать сигналы OCP в сигналы AXI и наоборот, насколько это возможно. Я также понимаю необходимость того, чтобы мост сначала принимал сигналы от мастера OCP и выводил только сигналы AXI в следующем тактовом цикле.
Могу ли я спросить, верна ли моя идея?
module ocp2axi_bridge (
/* OCP signals */
input clk, // Clock
//input clk_en, // Clock Enable; unsure if required
input [31:0] maddr,
input [ 2:0] mcmd,
input [31:0] mdata,
input [31:0] sdata,
input mdatavalid,
input mrespaccept,
input mdatalast,
input mdatabyteen,
input sresp,
input sresplast,
output scmdaccept,
output sdataaccept,
/* AXI Write signals */
output [31:0] awaddr,
output awvalid,
input awready,
output [31:0] wdata,
output wlast,
output wvalid,
output [ 3:0] wstrb,
input wready, //slave can accept write data
input bresp,
input bvalid,
output bready, // master can accept write response
/* AXI Read signals */
output [31:0] araddr,
output arvalid,
input arready,
input [31:0] rdata,
input rlast,
input rvalid, // no mappable signal in OCP (unsure)
output rready,
input rresp
);
always @ (posedge clk)begin
if (mcmd == 3'b001) begin //write operation
awaddr <= maddr; // converter drives AXI awaddr
awvalid <= 1; //converter drives awvalid to elicit response from AXI slave
end
else if (mcmd == 3'b010) begin
araddr <= maddr; //converter drives AXI araddr
arvalid <= 1; //converter drives awvalid to elicit response from AXI slave
end
end
assign scmdaccept = awready | arready; // scmdaccept is triggered either by awready or arready HIGH
assign sdataaccept = wready;
assign mrespaccept = bready | rready; // guess that mrespaccept is the overall sig. for master's readiness to accept slave responses
always @ (posedge clk and scmdaccept == 1) begin
if (mcmd == 3'b001) begin // write ops
wdata <= mdata; // route data on mdata line to AXI wdata line
mdatavalid <= wvalid; // channel holds valid write data
wlast <= mdatalast; // route LAST signal to AXI wlast
wstrb <= mdatabyteen; // route OCP lane strobe controls to AXI wstrb
end
else if (mcmd == 3'b010) begin
sdata <= rdata; //put incoming rdata from AXI slave to OCP mdata
sresplast <= rlast; // AXI slave rlast response mapped to sresplast
end
end
/* ^ (XOR) is used because an OKAY response is bvalid = 1 and bresp = 0 */
always@(*) begin
if (bvalid ^ bresp) begin
sresp <= 1;
end
else begin
sresp <= 0;
end
end
endmodule
Спасибо всем за помощь! :)