RISC-V MCU中文社区

【分享】 【分享】【队伍编号CICC2841】将BRAM挂载到E203 QSPI端口

发表于 全国大学生集成电路创新创业大赛 2022-05-28 21:39:16
0
170
3

目的

如果没有JTAG烧写器,无法将程序直接烧写到DTCM中。我们实现了将BRAM挂载到E203的QSPI0端口的方法,BRAM中存储了相关指令的机器码。通过配置CPU从外部Flash中执行,可以最终实现CPU正确的运行相应的软件程序。

BRAM配置

Parameters Value
Interface_Type Native
Memory_Type Single_Port_RAM
Operating Mode Read_First
Read _Width 32
Enable_Port_Type Use ENA Pin

其余参数按照需要自己配置即可,由于BRAM只作为指令存储器,因此将其配置成了读优先模式。
对于BRAM的先读模式,它的工作时序图如下:
图片alt
注意:在此工作模式下,只有当ENA为高电平的时候,BRAM才能够正常的进行数据交互。对于读操作,要设置WEA为低电平,同时在ADDRA上传递要读出数据的地址,下一个时钟可以正确的读出数据。对于写操作,要设置WEA为高电平,同时在ADDRA上传递要写入数据的地址,在DINA上传递要写入的数据,下一个时钟BRAM中数据会进行刷新。
补充:
BRAM需要读入的是.coe格式的文件,文件的格式如下图所示:
图片alt
第一个参数表示数据的类型。
第二个参数表示每个地址存储的数据。

代码

在代码中的QSPI接口处添加如下代码即可

`timescale 1ns / 1ps

module flash_top(
    input wire icb_cmd_valid,
    output wire icb_cmd_ready,
    input wire [31:0] icb_cmd_addr,    
    input wire icb_cmd_read,
    input wire [31:0] icb_cmd_wdata,

    output wire icb_rsp_valid,
    input wire icb_rsp_ready,
    output wire [31:0] icb_rsp_rdata,

    input wire clk,
    input wire rst_n
    );

  parameter base = 16'h2000;
  wire [31:0] qspi0_dout; 
  wire cs = (base == icb_cmd_addr[31:16]);
  wire wen = ~icb_cmd_read;
  genvar i;

  reg icb_cmd_valid_t0;
  reg icb_cmd_valid_t1;
   always@(posedge clk)
    begin
        icb_cmd_valid_t0<=icb_cmd_valid;
    end

   always@(posedge clk)
    begin
        icb_cmd_valid_t1<=icb_cmd_valid_t0;
    end 


  assign icb_rsp_valid = icb_cmd_valid_t1;
  assign icb_cmd_ready = icb_rsp_ready;
  assign icb_rsp_rdata = qspi0_dout;

  blk_mem_gen_0 u_blk_mem_gen_0(
        .addra(icb_cmd_addr[14:2]),
        .clka(clk),
        .dina(icb_cmd_wdata),
        .douta(qspi0_dout),
        .ena(1'b1),
        .wea(1'b0)
   ); 
endmodule
喜欢3
用户评论
lzy_verilog

lzy_verilog 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板