前言

​ 懒癌发作,项目早就结束了。但是一直不想写。:smile:

先占个坑,以后再写完整。

​ 项目需要用到一个镁光的flash,需要一个开源的qspi-flash控制器,连接到CPU上作为CPU外设。

感谢开源qspi-flash 控制器已经提供了比较完善的架构。

我需要做的主要有:

  • 根据flash型号的差别迁移flash 的指令
  • 根据项目需要将控制器的ahb接口转接到apb接口
  • 迁移原项目中使用的IP看不到源代码的IP都要被替换
  • 替换项目中的存储器ram,与公司项目整体保持一致
  • 搭建仿真环境,上板验证

环境

  • FPGA开发板:ZYBO

  • 软件:Vivado 2020.2、python3

  • 开源qspi-flash 控制器开源项目中的文档很详细,请仔细阅读

正文

一、指令迁移

qspi_define.vh头文件定义了非编程模式下支持的指令译码。

根据芯片型号的不同进行修改即可。

qspi_inst_decode.v文件中定义了指令的译码,可以根据需要进行修改。

二、apb2ahb

apb只支持单次读写32字节,但是项目使用的控制器中的寄存器位宽并不相等。

使用apb读写寄存器可能会影响其他寄存器。

​ 为了方便,修改apb接口层代码将每个寄存器位宽都调整至32位。但是寄存器的有效位宽还是和之前一样。

修改后的寄存器地址如下:

// FLASH REG ADDRESS
`define  FLASH_REG_Divide  32'h00     //valid bit width 32
`define  FLASH_REG_Ctrl    32'h04     //valid bit width 16
`define  FLASH_REG_Csr     32'h08     //valid bit width 8
`define  FLASH_REG_State   32'h0c     //valid bit width 8
`define  FLASH_REG_Addr    32'h010        //valid bit width 32
`define  FLASH_REG_Data    32'h014        //valid bit width 32

三、替换fifo mem

​ 原项目提供了宏开关,FPGA 使用 Xilinx的IP。

IP很方便但是看不到源码,需要替换掉。好在也比较简单,只需要替换fifo中使用的ram就行了。

// synthesis translate_off
initial begin
    for(i=0;i<255;i=i+1)
        mem[i] = {WIDTH{1'b0}};
end
// synthesis translate_on
endmodule

需要注意的是,ram中需要加上仿真清零语句。否则会导致不定态的传播。

四、Vivado命令行仿真

这部分是我一直想做但又不会做的部分。这部分参考了官方文档:ug900-160页

//切换到当前目录
cd  %~dp0

//编译源文件
call xvlog -sv  -i D:\work\sdk_test\micron_flash\design\qspi_controller\include D:\work\sdk_test\micron_flash\testbench\testbench.sv
call xvlog  -i D:\work\sdk_test\micron_flash\design\qspi_controller\include D:\work\sdk_test\micron_flash\testbench\N25Qxxx_flash_model\N25Qxxx.v

//建立设计
// -realx 是必须的,他会忽略文件中没有仿真尺度的代码的问题
call xelab -relax testbench -debug typical

//开始仿真
call xsim testbench -gui -t sim.tcl 

这个脚本在window中执行。

运行时需要先将vivado 的bin目录前加到可执行路径中。

因为xvlog\xelab\xsim都是外部命令,所以需要使用call调用。

call会等待命令返回后,执行下一条命令

不适用call,终端使用权移交外部命令后不会返回,只能执行第一条命令

可以在sim.tcl 中设置仿真的属性:

# 将所有的信号都存储起来,方便随时查看信号。
log_wave -r /
# 设置仿真时间,也可以 run all
run 2 us
# 指定仿真的波形文件
set_property xsim.view D:/work/sdk_test/micron_flash/scripts/work.testbench.wcfg [get_filesets sim_1]

仿真的波形文件第一次可以先不设定,在gui界面中选择好后,保存。

供后面的仿真使用。

若想要重新仿真,就需要删除临时文件

cd  %~dp0
rd /s /q .Xil 
rd /s /q xsim.dir 
del *.jou
del *.log
del *.pb
del *.wdb

del用于删除文件

rd用于删除目录

  • /s 删除指定目录和所有子目录及其包含的所有文件
  • /q 安静模式。删除目录时,不会提示确认信息

五、上板测试

ZYBO上验证,验证的时候使用ARM硬核运行程序。地址从0x40000000开始。

测试了读出,写入和擦除。

微信图片_20220409215720.png

附件

  1. 项目仿真环境开源:

参考文献

  1. QSPI for SoC (github.com)
  2. ug900-160页

本当の声を響かせてよ