Реализация моста между OCP и AXI - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь реализовать мост 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

Спасибо всем за помощь! :)

...