OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 287|回复: 1

[国产FPGA] 如何将有地址控制的数据转换为无地址控制的AXI-Stream数据流(求助大佬)

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2024-11-29
在线时间
1 小时
发表于 2024-12-2 10:23:04 | 显示全部楼层 |阅读模式
5金钱
顶层
// npu data sram interface
  output logic [1:0][15:0]               bankA_dma_cs         ,
  output logic [1:0][15:0]               bankA_dma_we         ,
  output logic [1:0][15:0][10:0]         bankA_dma_addr       ,
  output logic [1:0][15:0][127:0]        bankA_dma_din        ,
  output logic [1:0][15:0][15:0]         bankA_dma_byte_en    ,
  input        [1:0][15:0][127:0]        bankA_dma_dout       ,
  output logic [1:0][15:0]               bankB_dma_cs         ,
  output logic [1:0][15:0]               bankB_dma_we         ,
  output logic [1:0][15:0][10:0]         bankB_dma_addr       ,
  output logic [1:0][15:0][127:0]        bankB_dma_din        ,
  output logic [1:0][15:0][15:0]         bankB_dma_byte_en    ,
  input        [1:0][15:0][127:0]        bankB_dma_dout       ,


bankA和bankB逻辑代码

//*****************************************
// data sram cs/we/addr/din/strb
//*****************************************
// address control constants
logic [15:0][3:0] bank_addr;
assign bank_addr  = 64'hfedc_ba98_7654_3210;
logic [1:0] bank_index;
assign bank_index = 2'b10;

// data sram cs
genvar ibank;
genvar ics;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankA_cs_gen_bank
    for(ics=0;ics<16;ics++) begin : bankA_cs_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankA_dma_cs[ibank][ics] <= 1'b0;
            end else begin
                bankA_dma_cs[ibank][ics] <= (((bank_index[ibank] == val_rd_addr_i[`CH_LHS:`CH_RHS])
                && val_rd_addr_i[`BANK_AB] == 1'b0 && val_rd_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ics] && r_data_en)
                || ((bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS] && val_wr_addr_i[`BANK_AB] == 1'b0
                && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ics])
                && (w_data_en || (w_data_en_d3 && preproc_type == SHIFTADD))))  ? 1'b1 : 1'b0;
            end
        end
    end
end
endgenerate

// data sram we
genvar iwe;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankA_we_gen_bank
    for(iwe=0;iwe<16;iwe++) begin : bankA_we_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankA_dma_we[ibank][iwe] <= 1'b0;
            end else begin
                bankA_dma_we[ibank][iwe] <= ((bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                && val_wr_addr_i[`BANK_AB] == 1'b0 && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[iwe])
                && ((w_data_en && preproc_type != SHIFTADD) || (w_data_en_d3 && preproc_type == SHIFTADD))) ? 1'b1 : 1'b0;
            end
        end
    end
end
endgenerate

// data sram addr
genvar iaddr;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankA_addr_gen_bank
    for(iaddr=0;iaddr<16;iaddr++) begin : bankA_addr_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankA_dma_addr[ibank][iaddr] <= 11'b0;
            end else begin
                bankA_dma_addr[ibank][iaddr] <= (val_rd_addr_i[`BANK_AB] == 1'b0
                    && bank_index[ibank] == val_rd_addr_i[`CH_LHS:`CH_RHS]
                    && val_rd_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[iaddr] && r_data_en)
                ? val_rd_addr_i[`INBANK_ADDR_ST:`INBANK_ADDR_ED] :
                    ((val_wr_addr_i[`BANK_AB] == 1'b0 && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[iaddr])
                    && bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                    && (w_data_en || (w_data_en_d3 && preproc_type == SHIFTADD)))
                ? val_wr_addr_i[`INBANK_ADDR_ST:`INBANK_ADDR_ED] : 11'h0;
            end
        end
    end
end
endgenerate

// data sram din
genvar idin, ibit;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankA_din_gen_bank
    for(idin=0;idin<16;idin++) begin : bankA_din_gen
        for(ibit=0;ibit<128;ibit++) begin : bankA_din_bit_gen
            always_ff @(posedge clk or negedge reset_n) begin
                if(!reset_n) begin
                    bankA_dma_din[ibank][idin][ibit] <= 1'b0;
                end else if (val_wr_addr_i[`BANK_AB] == 1'b0
                    && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[idin]) begin
                    bankA_dma_din[ibank][idin][ibit] <=
                        bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                    ?  ((w_data_en && preproc_type == WRITETHROUGH)
                    ? val_wr_data_i[ibit] :
                        (w_data_en && preproc_type == SHIFT)
                    ? data_a_after_shift_w[ibit] :
                        (w_data_en_d3 && preproc_type == SHIFTADD)
                    ? shift_add_result_w[ibit] : 1'b0) : 1'b0;
                end else begin
                    bankA_dma_din[ibank][idin][ibit] <= 1'b0;
                end
            end
        end
    end
end
endgenerate

// data sram strb
genvar istrb, isbit;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankA_strb_gen_bank
    for(istrb=0;istrb<16;istrb++) begin : bankA_strb_gen
        for(isbit=0;isbit<16;isbit++) begin : bankA_strb_bit_gen
            always_ff @(posedge clk or negedge reset_n) begin
                if(!reset_n) begin
                    bankA_dma_byte_en[ibank][istrb][isbit] <= 1'b0;
                end else if (val_wr_addr_i[`BANK_AB] == 1'b0
                    && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[istrb]) begin
                    bankA_dma_byte_en[ibank][istrb][isbit] <=
                        bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                        ?  (((w_data_en && preproc_type == WRITETHROUGH)
                            || (w_data_en && preproc_type == SHIFT)
                            || (w_data_en_d3 && preproc_type == SHIFTADD))
                        ? val_wr_strb_i[isbit] : 1'b0) : 1'b0;
                end else begin
                    bankA_dma_byte_en[ibank][istrb][isbit] <= 1'b0;
                end
            end
        end
    end
end
endgenerate


//*****************************************
// data sram bankB cs/we/addr/din/strb
//*****************************************
// data sram cs
genvar ibcs;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankB_cs_gen_bank
    for(ibcs=0;ibcs<16;ibcs++) begin : bankB_cs_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankB_dma_cs[ibank][ibcs] <= 1'b0;
            end else begin
                bankB_dma_cs[ibank][ibcs] <= (((bank_index[ibank] == val_rd_addr_i[`CH_LHS:`CH_RHS])
                && val_rd_addr_i[`BANK_AB] == 1'b1 && val_rd_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibcs] && r_data_en)
                || ((bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS] && val_wr_addr_i[`BANK_AB] == 1'b1
                && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibcs])
                && (w_data_en || (w_data_en_d3 && preproc_type == SHIFTADD))))  ? 1'b1 : 1'b0;
            end
        end
    end
end
endgenerate

// data sram we
genvar ibwe;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankB_we_gen_bank
    for(ibwe=0;ibwe<16;ibwe++) begin : bankB_we_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankB_dma_we[ibank][ibwe] <= 1'b0;
            end else begin
                bankB_dma_we[ibank][ibwe] <= ((bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                && val_wr_addr_i[`BANK_AB] == 1'b1 && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibwe])
                && ((w_data_en && preproc_type != SHIFTADD) || (w_data_en_d3 && preproc_type == SHIFTADD))) ? 1'b1 : 1'b0;
            end
        end
    end
end
endgenerate

// data sram addr
genvar ibaddr;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankB_addr_gen_bank
    for(ibaddr=0;ibaddr<16;ibaddr++) begin : bankB_addr_gen
        always_ff @(posedge clk or negedge reset_n) begin
            if(!reset_n) begin
                bankB_dma_addr[ibank][ibaddr] <= 11'b0;
            end else begin
                bankB_dma_addr[ibank][ibaddr] <= (val_rd_addr_i[`BANK_AB] == 1'b1
                    && bank_index[ibank] == val_rd_addr_i[`CH_LHS:`CH_RHS]
                    && val_rd_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibaddr] && r_data_en)
                ? val_rd_addr_i[`INBANK_ADDR_ST:`INBANK_ADDR_ED] :
                    ((val_wr_addr_i[`BANK_AB] == 1'b1 && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibaddr])
                    && bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                    && (w_data_en || (w_data_en_d3 && preproc_type == SHIFTADD)))
                ? val_wr_addr_i[`INBANK_ADDR_ST:`INBANK_ADDR_ED] : 11'h0;
            end
        end
    end
end
endgenerate

// data sram din
genvar ibdin, ibbit;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankB_din_gen_bank
    for(ibdin=0;ibdin<16;ibdin++) begin : bankB_din_gen
        for(ibbit=0;ibbit<128;ibbit++) begin : bankB_din_bit_gen
            always_ff @(posedge clk or negedge reset_n) begin
                if(!reset_n) begin
                    bankB_dma_din[ibank][ibdin][ibbit] <= 1'b0;
                end else if (val_wr_addr_i[`BANK_AB] == 1'b1
                    && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibdin]) begin
                    bankB_dma_din[ibank][ibdin][ibbit] <=
                        bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                    ?  ((w_data_en && preproc_type == WRITETHROUGH)
                    ? val_wr_data_i[ibbit] :
                        (w_data_en && preproc_type == SHIFT)
                    ? data_a_after_shift_w[ibbit] :
                        (w_data_en_d3 && preproc_type == SHIFTADD)
                    ? shift_add_result_w[ibbit] : 1'b0) : 1'b0;
                end else begin
                    bankB_dma_din[ibank][ibdin][ibbit] <= 1'b0;
                end
            end
        end
    end
end
endgenerate

// data sram strb
genvar ibstrb, ibsbit;
generate
for(ibank=0;ibank<BANK_NUM;ibank++) begin : bankB_strb_gen_bank
    for(ibstrb=0;ibstrb<16;ibstrb++) begin : bankB_strb_gen
        for(ibsbit=0;ibsbit<16;ibsbit++) begin : bankB_strb_bit_gen
            always_ff @(posedge clk or negedge reset_n) begin
                if(!reset_n) begin
                    bankB_dma_byte_en[ibank][ibstrb][ibsbit] <= 1'b0;
                end else if (val_wr_addr_i[`BANK_AB] == 1'b1
                    && val_wr_addr_i[`BANK_ADDR_ST:`BANK_ADDR_ED]==bank_addr[ibstrb]) begin
                    bankB_dma_byte_en[ibank][ibstrb][ibsbit] <=
                        bank_index[ibank] == val_wr_addr_i[`CH_LHS:`CH_RHS]
                        ?  (((w_data_en && preproc_type == WRITETHROUGH)
                            || (w_data_en && preproc_type == SHIFT)
                            || (w_data_en_d3 && preproc_type == SHIFTADD))
                        ? val_wr_strb_i[ibsbit] : 1'b0) : 1'b0;
                end else begin
                    bankB_dma_byte_en[ibank][ibstrb][ibsbit] <= 1'b0;
                end
            end
        end
    end
end
endgenerate




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

2037

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5676
金钱
5676
注册时间
2018-10-21
在线时间
1614 小时
发表于 2024-12-4 09:56:30 | 显示全部楼层
参考vitis的例程,PL 读写 PS 端 DDR
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 02:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表