佐须之男的博客

技术需要沉淀,成长需要痛苦,成功需要坚持,敬仰需要奉献

Vivado和Quartus平台移植tinyriscv记录

    近些年大家都在热衷造芯片、造处理器,RISC-V是经常能听到的一个词。RISC-V公开的ISA指令集,但是具体如何实现并没有统一的标准,所以网上有很多开源的RISC-V实现。tinyriscv就是开源的版本之一,并且作者编写的文档也很全,非常适合新手用来练手和学习RISC-V。

软硬件说明:

    本文记录了佐大在移植tinyriscv过程中遇到的一些问题,希望这篇文章能帮助到大家。佐大用的开发板是Terasic DE1、Digilent Nexys4-DDR,对应软件版本是Quartus II 13.0、Vivado 2018.3。

Vivado:

    在Vivado平台上,佐大用的是tinyriscv的master分支。由于master分支默认的clk主频是50M HZ,而Nexys4-DDR的clk时钟是100M HZ,所以需使用PLL分频到50M HZ。在约束引脚的时,佐大把UART指到了开发板USB UART的引脚,就在这里踩坑了。使用tinyriscv_fw_downloader.py上传ROM始终失败,折腾半天发现是Nexys4-DDR USB UART兼容性问题,把UART约束到PMOD引脚就正常了。

Vivado和Quartus平台移植tinyriscv记录 技术分享 第1张

Quartus:

    在Quartus平台上,tinyriscv的master分支有如下问题:1.Quartus不允许申明特别大容量的reg会报错。2.佐大尝试增加bram功能失败了。所以佐大最终用的是tinyriscv的bram分支。由于DE1性能太弱了clk跑不了50M HZ,所以clk用的是24M HZ,同时需修改rtl/core/define.v中的CPU_CLOCK_HZ 为24000000。

    在申明RAM IP核时,使用单周期、不锁存q、宽度32bit、深度根据你开发版资源自行设置。然后修改rtl/perips目录的rom.v和ram.v的代码即可,下面是佐大的参考代码。

     /*
    gen_ram #(
        .DP(DP),
        .DW(32),
        .MW(4),
        .AW(32)
    ) u_gen_ram(
        .clk(clk),
        .addr_i(addr),
        .data_i(data_i),
        .sel_i(sel_i),
        .we_i(we_i),
        .data_o(data_o)
    );
     */
     ip_rom u(
        .clock(clk),
        .wren(we_i),
        .byteena(sel_i),
        .address(addr),
        .data(data_i),
        .q(data_o),
     );

    由于作者使用的Vivado平台,并没有考虑到Quartus的兼容性问题,需要修改rtl\utils\vld_rdy.v文件,下面是佐大的参考代码。

     /*
    if (CUT_READY == 1) begin
        // If cut ready, then only accept when stage is not full
        assign rdy_o = (~vld_r);
    end else begin
        // If not cut ready, then can accept when stage is not full or it is popping 
        assign rdy_o = (~vld_r) | vld_clr;
    end
     */
     assign rdy_o = (CUT_READY == 1) ? (~vld_r) : (~vld_r) | vld_clr;

    资源占用情况如下图

Vivado和Quartus平台移植tinyriscv记录 技术分享 第2张

总结:

    本文就是一篇随笔,技术含量不高,更多的是记录佐大最近的动态。参加了佐大OpenWrt培训班的学员,佐大可提供移植tinyrisc的技术指导,希望佐大的绵薄之力能帮助你们成长。

« 上一篇 下一篇 »

© 2016 佐须之男版权所有 | 业务合作 181-1435-4589 (陆工)