喜欢3次
如果没有JTAG烧写器,无法将程序直接烧写到DTCM中。我们实现了将BRAM挂载到E203的QSPI0端口的方法,BRAM中存储了相关指令的机器码。通过配置CPU从外部Flash中执行,可以最终实现CPU正确的运行相应的软件程序。
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的先读模式,它的工作时序图如下:
注意:在此工作模式下,只有当ENA为高电平的时候,BRAM才能够正常的进行数据交互。对于读操作,要设置WEA为低电平,同时在ADDRA上传递要读出数据的地址,下一个时钟可以正确的读出数据。对于写操作,要设置WEA为高电平,同时在ADDRA上传递要写入数据的地址,在DINA上传递要写入的数据,下一个时钟BRAM中数据会进行刷新。
补充:
BRAM需要读入的是.coe格式的文件,文件的格式如下图所示:
第一个参数表示数据的类型。
第二个参数表示每个地址存储的数据。
在代码中的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