RISC_CPU模块的调试

代码:

cpu.v

`include "clk_gen.v"
`include "accum.v"
`include "adr.v"
`include "alu.v"
`include "machine.v"
`include "counter.v"
`include "machinectl.v"
`include "register.v"
`include "datactl.v"module cpu(clk,reset,halt,rd,wr,addr,data);input clk,reset;output rd,wr,addr,halt;inout data;wire clk,reset,halt;wire [7:0]  data;wire [12:0] addr;wire rd,wr;wire clk1,fetch,alu_clk;wire [2:0] opcode;wire [12:0] ir_addr,pc_addr;wire [7:0] alu_out,accum;wire zero,inc_pc,load_acc,load_pc,load_ir,data_ena,contr_ena;clk_gen  m_clk_gen (.clk(clk),.clk1(clk1),.fetch(fetch),.alu_clk(alu_clk),.reset(reset));register  m_register (.data(data),.ena(load_ir),.rst(reset),.clk1(clk1),.opc_iraddr({opcode,ir_addr}));accum      m_accum    (.data(alu_out),.ena(load_acc),.clk1(clk1),.rst(reset),.accum(accum));alu        m_alu      (.data(data),.accum(accum),.alu_clk(alu_clk),.opcode(opcode),.alu_out(alu_out),.zero(zero));machinectl  m_machinecl(.ena(contr_ena),.fetch(fetch),.rst(reset));machine    m_machine  (.inc_pc(inc_pc),.load_acc(load_acc),.load_pc(load_pc),.rd(rd), .wr(wr), .load_ir(load_ir), .clk1(clk1),.datactl_ena(data_ena), .halt(halt), .zero(zero),.ena(contr_ena),.opcode(opcode));datactl    m_datactl  (.in(alu_out),.data_ena(data_ena),.data(data));adr        m_adr (.fetch(fetch),.ir_addr(ir_addr),.pc_addr(pc_addr),.addr(addr));counter    m_counter  (.ir_addr(ir_addr),.load(load_pc),.clock(inc_pc),.rst(reset),.pc_addr(pc_addr));endmodule
//--------------------------------------- cpu.v ?????  -------------------------------------------------

ram.v

// --------------- RAM?ROM ----------------------------------------
module ram( data, addr, ena, read, write );
inout [7:0] data;
input [9:0] addr;
input ena;
input read, write;
reg [7:0] ram [10'h3ff:0];assign data = ( read && ena )?  ram[addr] : 8'hzz;always @(posedge write)
begin
ram[addr]<=data;
end
endmodule

rom.v

module rom( data, addr, read, ena );
output [7:0] data;
input [12:0] addr;
input read, ena;
reg [7:0] memory [13'h1fff:0];
wire [7:0] data;assign data= ( read && ena )? memory[addr] : 8'bzzzzzzzz;endmodule

addr_decode.v

//--------------?????----------------------
module addr_decode( addr, rom_sel, ram_sel);
output rom_sel, ram_sel;
input [12:0] addr;
reg rom_sel, ram_sel;always @( addr )
begin
casex(addr)
13'b1_1xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b01;
13'b0_xxxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;
13'b1_0xxx_xxxx_xxxx:{rom_sel,ram_sel}<=2'b10;
default:{rom_sel,ram_sel}<=2'b00;
endcase
end
endmodule/* ????????????????ROM?RAM?
FFFFH---1800H RAM
1800H---0000H ROM -----------------------------*/

cputop.v

//------------------------------------------- cputop.v ????? -----------------------------------------------------
/***********************************************************************
***  ?????cputop ????????????????cpu???????????
***                    ???????????????????????????????
***            ??????????????????????CPU????RTL??
***            ?????????????? 
************************************************************************/
`include "ram.v"
`include "rom.v"
`include "addr_decode.v"
`include "cpu.v"`timescale 1ns / 100ps
`define PERIOD 100             // matches clk_gen.v
module cputop;reg reset_req,clock;integer test;reg [(3*8):0] mnemonic;    //array that holds 3 8-bit ASCII charactersreg [12:0] PC_addr,IR_addr;wire [7:0] data;wire [12:0] addr;wire rd,wr,halt,ram_sel,rom_sel;//------------------------   cpu ?????????ROM?RAM?????--------------------------------------
cpu   t_cpu (.clk(clock),.reset(reset_req),.halt(halt),.rd(rd),.wr(wr),.addr(addr),.data(data));ram   t_ram  (.addr(addr[9:0]),.read(rd),.write(wr),.ena(ram_sel),.data(data));rom   t_rom  (.addr(addr),.read(rd),.ena(rom_sel),.data(data));addr_decode   t_addr_decode (.addr(addr),.ram_sel(ram_sel),.rom_sel(rom_sel));//--------------------cpu ?????????ROM?RAM???????---------------------------------- 
initialbegin clock=1;//display time in nanoseconds$timeformat ( -9,  1, " ns", 12);display_debug_message;sys_reset;test1;$stop;test2;$stop;test3;$stop;
endtask display_debug_message;begin$display("\n**************************************************");$display("*  THE FOLLOWING DEBUG TASK ARE AVAILABLE:           *");$display("* \"test1; \" to load the 1st diagnostic progran. *");$display("*  \"test2; \" to load the 2nd diagnostic program. *");$display("*  \"test3; \" to load the Fibonacci program.      *");$display("*****************************************************\n");endendtasktask test1;begintest = 0;disable MONITOR;$readmemb ("test1.pro", t_rom.memory);$display("rom loaded   successfully!");$readmemb("test1.dat",t_ram.ram);$display("ram loaded   successfully!");#1 test = 1;#14800  ;sys_reset;endendtasktask test2;begintest = 0;disable MONITOR;$readmemb("test2.pro",t_rom.memory);$display("rom loaded  successfully!");$readmemb("test2.dat",t_ram.ram);$display("ram loaded  successfully!");#1 test = 2;#11600;sys_reset;endendtasktask test3;begintest = 0;disable MONITOR;$readmemb("test3.pro",t_rom.memory);$display("rom loaded  successfully!");$readmemb("test3.dat",t_ram.ram);$display("ram loaded  successfully!");#1 test = 3;#94000;sys_reset;endendtasktask sys_reset;beginreset_req = 0;#(`PERIOD*0.7) reset_req = 1; #(1.5*`PERIOD) reset_req = 0;  endendtask always @(test)begin: MONITORcase (test)1: begin                        //display results when running test 1$display("\n*** RUNNING CPUtest1 - The Basic CPU Diagnostic Program ***");$display("\n     TIME           PC       INSTR      ADDR     DATA  ");$display("    ----------      ----     -----     -----       ----- ");while (test == 1) @(t_cpu.m_adr.pc_addr)//fixedif ((t_cpu.m_adr.pc_addr%2 == 1)&&(t_cpu.m_adr.fetch == 1))//fixed begin# 60    PC_addr <=t_cpu.m_adr.pc_addr -1 ;IR_addr <=t_cpu.m_adr.ir_addr;# 340   $strobe("%t   %h     %s     %h  %h", $time, PC_addr, mnemonic, IR_addr,data );//HERE DATA HAS BEEN CHANGED T-CPU-M-REGISTER.DATAend  end2: begin$display("\n*** RUNNING CPUtest2 - The Advanced CPU Diagnostic Program ***");$display("\n     TIME          PC       INSTR      ADDR     DATA  ");$display("   ----------      ---        -----       -----    ---- ");while (test == 2) @(t_cpu.m_adr.pc_addr)if ((t_cpu.m_adr.pc_addr%2 == 1) && (t_cpu.m_adr.fetch == 1))begin # 60    PC_addr  <= t_cpu.m_adr.pc_addr - 1 ;IR_addr  <= t_cpu.m_adr.ir_addr;# 340   $strobe("%t  %h  %s  %h %h", $time, PC_addr,mnemonic, IR_addr, data );end  end3: begin$display("\n***   RUNNING CPUtest3 - An Executable Program   ***");  $display("*** This program should calculate the fibonacci  ***");$display("\n    TIME      FIBONACCI NUMBER");$display(  "  ---------   -----------------");while (test == 3)begin wait ( t_cpu.m_alu.opcode == 3'h1) // display Fib. No. at end of program loop$strobe("%t     %d", $time,t_ram.ram[10'h2]);wait ( t_cpu.m_alu.opcode != 3'h1);endend       endcaseend
//-------------------------------------------------------------------------
always @(posedge halt)       //STOP when HALT instruction decodedbegin#500                $display("\n*********************************************");$display(    "**  A HALT INSTRUCTION WAS PROCESSED  !!!  **");$display(     "*********************************************\n");end
always #(`PERIOD/2) clock=~clock;   
always  @(t_cpu.m_alu.opcode)  //get an ASCII mnemonic for each opcodecase(t_cpu.m_alu.opcode)3'b000  : mnemonic ="HLT";3'h1    : mnemonic = "SKZ";3'h2    : mnemonic = "ADD";3'h3    : mnemonic = "AND";3'h4    : mnemonic = "XOR";3'h5    : mnemonic = "LDA";3'h6    : mnemonic = "STO";3'h7    : mnemonic = "JMP";default : mnemonic = "???";endcaseendmodule
//------------------------------------------- cputop.v ????? -----------------------------------------------------

仿真:

sim:/cputop/rom_sel
run -all

# **************************************************
# *  THE FOLLOWING DEBUG TASK ARE AVAILABLE:           *
# * "test1; " to load the 1st diagnostic progran. *
# *  "test2; " to load the 2nd diagnostic program. *
# *  "test3; " to load the Fibonacci program.      *
# *****************************************************

# rom loaded   successfully!
# ram loaded   successfully!

# *** RUNNING CPUtest1 - The Basic CPU Diagnostic Program ***

#      TIME           PC       INSTR      ADDR     DATA  
#     ----------      ----     -----     -----       ----- 
#    1200.0 ns   0000      JMP     003c  zz
#    2000.0 ns   003c      JMP     0006  zz
#    2800.0 ns   0006      LDA     1800  00
#    3600.0 ns   0008      SKZ     0000  zz
#    4400.0 ns   000c      LDA     1801  ff
#    5200.0 ns   000e      SKZ     0000  zz
#    6000.0 ns   0010      JMP     0014  zz
#    6800.0 ns   0014      STO     1802  ff
#    7600.0 ns   0016      LDA     1800  00
#    8400.0 ns   0018      STO     1802  00
#    9200.0 ns   001a      LDA     1802  00
#   10000.0 ns   001c      SKZ     0000  zz
#   10800.0 ns   0020      XOR     1801  ff
#   11600.0 ns   0022      SKZ     0000  zz
#   12400.0 ns   0024      JMP     0028  zz
#   13200.0 ns   0028      XOR     1801  ff
#   14000.0 ns   002a      SKZ     0000  zz
#   14800.0 ns   002e      HLT     0000  zz

# *********************************************
# **  A HALT INSTRUCTION WAS PROCESSED  !!!  **
# *********************************************

# Break in Module cputop at E:/FPGA/study/cpu/cputop.v line 43
quit -sim

# rom loaded  successfully!
# ram loaded  successfully!

# *** RUNNING CPUtest2 - The Advanced CPU Diagnostic Program ***

#      TIME          PC       INSTR      ADDR     DATA  
#    ----------      ---        -----       -----    ---- 
#   16200.0 ns  0000   LDA  1801 aa
#   17000.0 ns  0002   AND  1802 ff
#   17800.0 ns  0004   XOR  1801 aa
#   18600.0 ns  0006   SKZ  0000 zz
#   19400.0 ns  000a   ADD  1800 01
#   20200.0 ns  000c   SKZ  0000 zz
#   21000.0 ns  000e   JMP  0012 zz
#   21800.0 ns  0012   XOR  1802 ff
#   22600.0 ns  0014   ADD  1800 01
#   23400.0 ns  0016   STO  1803 ff
#   24200.0 ns  0018   LDA  1800 01
#   25000.0 ns  001a   ADD  1803 ff
#   25800.0 ns  001c   SKZ  0000 zz
#   26600.0 ns  0020   HLT  0000 zz

# *********************************************
# **  A HALT INSTRUCTION WAS PROCESSED  !!!  **
# *********************************************

# Break in Module cputop at E:/FPGA/study/cpu/cputop.v line 45
run -continue
# rom loaded  successfully!
# ram loaded  successfully!

# ***   RUNNING CPUtest3 - An Executable Program   ***
# *** This program should calculate the fibonacci  ***

#     TIME      FIBONACCI NUMBER
#   ---------   -----------------
#   33250.0 ns       0
#   40450.0 ns       1
#   47650.0 ns       1
#   54850.0 ns       2
#   62050.0 ns       3
#   69250.0 ns       5
#   76450.0 ns       8
#   83650.0 ns      13
#   90850.0 ns      21
#   98050.0 ns      34
#  105250.0 ns      55
#  112450.0 ns      89
#  119650.0 ns     144

# *********************************************
# **  A HALT INSTRUCTION WAS PROCESSED  !!!  **
# *********************************************

# Break in Module cputop at E:/FPGA/study/cpu/cputop.v line 47
# Break key hit 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小兔鲜02

elementplus自动按需引入 elementplus主题色定制 安装sass npm install sass -D要替换的主题色内容&#xff1a; /* 只需要重写你需要的即可 */ forward element-plus/theme-chalk/src/common/var.scss with ($colors: (primary: (// 主色base: #27ba9b,),success: (// 成功…

【前端项目笔记】4 权限管理

权限管理 效果展示&#xff1a; &#xff08;1&#xff09;权限列表 &#xff08;2&#xff09;角色列表 其中的分配权限功能 权限列表功能开发 新功能模块&#xff0c;需要创建新分支 git branch 查看所有分支&#xff08;*表示当前分支&#xff09; git checkout -b ri…

审稿人:拜托,请把模型时间序列去趋势!!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 时间序列分析是数据科学中一个重要的领域。通过对时间序列数据的分析&#xff0c;我们可以从数据中发现规律、预测未来趋势以及做出决策…

web中间件漏洞-Resin漏洞-密码爆破、上传war

web中间件漏洞-Resin漏洞-密码爆破、上传webshell 使用爆破结果resin/resin进入后台&#xff0c;选择deploy。想部署webshell,得使用SSL方式请求&#xff0c;访问https://192.168.1.2:8443/resin-admin/index.php?qdeploy&s0(注&#xff1a;如果使用最新的火狐浏览器或者谷…

[论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?

引言 今天带来论文Are Large Language Models All You Need for Task-Oriented Dialogue?的笔记。 主要评估了LLM在完成多轮对话任务以及同外部数据库进行交互的能力。在明确的信念状态跟踪方面&#xff0c;LLMs的表现不及专门的任务特定模型。然而&#xff0c;如果为它们提…

C语言中字符串处理函数

目录 前言 1. strlen 测字符串长度函数 2.字符串拷贝函数 2.1strcpy 2.2 strncpy 3.strcat字符串追加函数 4. strcmp/strncmp 比较函数 5.字符查找函数 5.1 strchr 5.2 strrchr 6.atoi/atol/atof字符串转换数值 总结 前言 从0开始记录我的学习历程&#xff0c;我会尽…

一小时搞定JavaScript(1)——JS基础

前言,本篇文章是依据bilibili博主(波波酱老师)的学习笔记,波波酱老师讲的很好,很适合速成!!! 本篇文章会与java进行对比学习,因为JS中很多语法和java是相同的,所以大家最好熟悉Java语言后再来进行学习,效果更佳,见效更快. 文章目录 1.基本语法1.1 JS语言的特点1.2 创建一个JS文…

开发一个软件自动运行工具不可缺少的源代码分享!

在软件开发领域&#xff0c;自动运行工具扮演着至关重要的角色&#xff0c;它们能够简化软件部署、提升运行效率&#xff0c;并在很大程度上降低人为操作失误的可能性。 而一个高效的自动运行工具的背后&#xff0c;往往是经过精心设计与实现的源代码在默默支撑&#xff0c;本…

如何解决资源管理器被结束任务后的问题,怎么重启或新建资源管理器任务?

服务器上运行的东西太多&#xff0c;修改个文件夹的名字导致卡死。结束任务后导致系统页面空白。&#xff08;关闭了windows资源管理器&#xff09; 按CtrlShiftDelete没有反应。 按CtrlShiftEsc没有反应。 按CtrlShiftEnd没有反应。 按CtrlALTEnd有反应。 (win2012) 输入…

贝锐蒲公英异地组网方案:实现制药设备远程监控、远程运维

公司业务涉及放射性药品的生产与销售&#xff0c;在全国各地拥有20多个分公司。由于药品的特殊性&#xff0c;在日常生产过程中&#xff0c;需要符合药品监管规范要求&#xff0c;对各个分部的气相、液相设备及打印机等进行监管&#xff0c;了解其运行数据及工作情况。 为满足这…

QT截图程序三-截取自定义多边形

上一篇文章QT截图程序&#xff0c;可多屏幕截图二&#xff0c;增加调整截图区域功能-CSDN博客描述了如何截取&#xff0c;具备调整边缘功能后已经方便使用了&#xff0c;但是与系统自带的程序相比&#xff0c;似乎没有什么特别&#xff0c;只能截取矩形区域。 如果可以按照自己…

conda创建虚拟环境报错解决

1.报错截图 2.解决办法 查看当前所有虚拟环境 conda env list 解决办法 解决方法 bash conda config --add channels conda-forge conda config --set channel_priority strict conda config --set channel_priority flexible

GitLab项目组相关操作(创建项目组Group、创建项目组的项目、为项目添加成员并赋予权限)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 ——《将…

视频监控平台功能:国外的硬盘录像机NVR通过ISUP协议(原ehome协议)接入AS-V1000视频平台

目录 一、背景说明 二、ISUP协议介绍 1、海康ISUP协议概述 2、ISUP协议支持主码流和子码流切换 &#xff08;1&#xff09;灵活配置和个性化 &#xff08;2&#xff09;适应不同网络带宽&#xff0c;提高使用体验 3、海康ehome相关文章 三、ISUP协议接入说明 1、平台侧…

【Day01】0基础微信小程序入门-学习笔记

文章目录 今日学习目标小程序简介1. 小程序和普通网页开发的区别2. 体验小程序 第一个小程序1.第一个小程序-注册2.第一个小程序-安装开发者工具3.第一个小程序-创建小程序项目 小程序代码构成1.小程序代码构成-项目结构2. 小程序代码构成-JSON文件3. 小程序代码构成-WXML模板4…

【DKN: Deep Knowledge-Aware Network for News Recommendation】

DKN: Deep Knowledge-Aware Network for News Recommendation 摘要 在线新闻推荐系统旨在解决新闻信息爆炸的问题&#xff0c;为用户进行个性化推荐。 总体而言&#xff0c;新闻语言高度凝练&#xff0c;充满知识实体和常识。 然而&#xff0c;现有的方法并没有意识到这些外部…

Javase.String 类

String 类 【本节目标】1. String类的重要性2. 常用方法2.1 字符串构造2.2 String对象的比较2.3 字符串查找2.4 转化2.5 字符串替换2.7 字符串截取2.8 其他操作方法2.9 字符串的不可变性2.10 字符串修改 3. StringBuilder和StringBuffer3.2 面试题&#xff1a; 4. String类oj4.…

软件开发为什么写日志,怎样写日志,什么时候写日志?

目录 一、为什么需要写日志 二、什么时候写日志 三、日志是写给谁看的 四、日志里都要写什么 五、日志的组织形式应该怎样 六、综上所述 在软件系统中&#xff0c;记录日志是基本且必要的操作&#xff0c;这一点几乎是所有开发者的共识。各种编程语言中都有众多的日志框架…

基于MATLAB的误码率与信噪比(附完整代码与分析)

目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 &#xff08;1&#xff09;本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…

112、路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是指没有子节点…