zoukankan      html  css  js  c++  java
  • Verilog hdl 实现单周期cpu

    参考计组实验测试指令 - 简书,添加了一些细节。

    1.添加 bne指令

    修改 ctrl.v


     

     

     

    之后修改mipstestloopjal_sim.asm,mars dump 为 bnetest.dat


     

    修改sccomp_tb


     

    modelsim编译,模拟。信号添加sccomp_tb: u_ctrl -> i_bne ,npc,  pc


     

    可见i_bne控制信号为1时,npc变为44。添加bne成功

    2.添加jr指令

    先看其格式。


     

    R型指令。

    故在ctrl.v如下修改。


     

    ctrl.v又两处修改


     

    然后在NPC.v修改。注意添加参数和input


     

     

     

    =RD1的原因可见sccpu.v


     

    在ctrl_encode_def 定义NPC_JR


     

    在sccpu.v添加参数  .RD1


     

    然后写测试程序

    $ra先赋值为4.这样应该会不断循环。

    导出测试


     

    勿忘修改sccomp_tb


     

    波形图可见PC从1c变到设定的4。添加成功


     

    3.添加JALR


     

    ctrl.v


     

     

     

     

     

    JALR指令格式为 jalr rs

    无条件跳转到由寄存器rs指定的指令,并将下一条指令的地址保存到寄存器$ra中

    测试代码


     

    可见从14跳到4,


     

    并且$ra 记录 18


     

    4.添加NOR指令


     

     

     

    在alu.v中


     

    测试代码


     

    波形:


     

    寄存器:


     

    5.添加sll & sra & srl指令

    注意这里做了扩展


     

    注意同时修改了input ALUOp的宽度


     

    然后在ctrl.v中

    写寄存器

    注意只改了RegWrite,下面的RD没改


     

     

    添加输出


     

     

     

     

    在sccpu.v中


     

     

     

     

     

    测试代码:


     

    波形:可以看到ALUop对应 sll,srl,sra的1000,1001,1010


     

    寄存器值:


     

    6.sllv和srlv

    这里sllv使用的是rs低五位 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令 - yxwkaifa - 博客园

    sllv $t1,$t2,$t3。

    则t1值为t2左移t3的低五位

    但是这里不太懂,没搞明白是怎么实现的逻辑左右移,位数可变

    这里犯了一次错误。复制粘贴后忘了改数字了


     

     

     

     

     

     

    测试代码:


     

    波形:


     

    寄存器变化


     

    7.stli指令

    小于则置一


     

     

     

     

    测试代码:


     

    波形:


     

    寄存器值:


     

    8.lui指令

    取高十六位


     

     

     

     

     

     

     

    测试代码:


     

    波形图:


     

    寄存器值:


     

    9.andi指令


     

     

    别忘了RT


     

     

    aluop同and


     

    测试代码:


     

    波形图:


     

    寄存器:


     

    以上。nice!

    学号后八位排序

    01510029

    lui 0x0151

    ori 0x0029


     

    记得改sccomp_tb


     

    跑完看result.txt


     

    大概是完成了排序。

  • 相关阅读:
    C# -- 使用缓冲区进行文件下载操作
    C# -- 使用ODBC连接数据库
    C# -- Quartz.Net入门案例
    C# -- LinkedList的使用
    ASP.NET -- 获取浏览器信息
    Windows -- 从注册表删除IE浏览器加载项
    C# -- FTP上传下载
    C# -- 使用Ping检查网络是否正常
    WinForm -- 为TextBox文本框添加鼠标右键菜单
    C# -- 使用Parallel并行执行任务
  • 原文地址:https://www.cnblogs.com/lqerio/p/11117623.html
Copyright © 2011-2022 走看看