计算机组成实验报告

指导教师姓名:戴老师

学生姓名:wyz_wx@163.com

实验日期:星期六上午

目录

第一部分 运用TDM-CM++实验台的实验

实验三:微控制器实验

第二部分 Verilog-HDL进行计算机设计的实验

实验一:带进位的四位加法器

实验二:时钟发生器

实验三:指令寄存器

实验五:数据控制器

实验九:状态控制器

附一CPU设计

附二:实验波形图

第一部分 运用TDM-CM++实验台的实验

实验三:微控制器实验

(与《实验五:基本微型机设计与实现》一起分析)

[实验目的]

1 掌握时序产生器的组成原理。
2 掌握微程序控制器的组成原理。
3 掌握微程序的编制,写入,观察微程序的运行。

[实验设备]

TDN-CM++计算机组成原理教学实验系统一台。

[实验原理]

1. 时序控制电路

时序控制电路采用一片CPLD芯片,电路框图如图。产生4个等间隔的时序信号TS1TS4

φ:时钟脉冲输入端,接到方波发生器的输出(H23)。WI调频率,W2调脉宽。
START键是实验板上一个微动开关START的按键信号。
STEP(单步开关):STEP开关为0时(EXEC),一旦按下启动键,时序信号TS1TS4将周而复始地发送出去。
STOP:拨动开关。STOP停机;RUN运行。
CLR:拨动开关。时序清零。
TS1~TS4等间隔的时序信号输出。
2 微指令格式

微指令字长共24位,其中UA5UA06位的后续微地址,ABC为三个译码字段,分别由三个控制位译码出多位。

24

23

22

21

20

19

18

17

16

15 14 13

12 11 10

9 8 7

6

5

4

3

2

1

S3

S2

S1

S0

M

Cn

WE

A9

A8

A

B

C

μA5

μA4

μA3

μA2

μA1

μA0

3 微程序控制电路

微程序控制电路组成:控制存储器、微命令寄存器、微地址寄存器。

编程开关 : PROM(编程):根据微地址和微指令格式将微指令二进制代码写入到控制存储器中;READ(校验):可以对写入控制存储器中的二进制代码进行验证;RUN(运行):只要给出微程序的入口微地址,则可根据微程序流程图自动执行微程序。

[实验步骤以及结果]

1 连接实验线路,接通电源。
2 运行实验台系统程序NCMP53,按F7
3 把时序电路中“STOP”开关置“RUN”、“STEP”开关置“EXEC”,按START,用PC模拟字波器观察φ,TS1~TS4波形,画出波形图,测出周期和脉冲宽度。
4 联机装载微程序(把编程开关拨到PROM状态)(按F4,输入文件名EXI.TXT)检查微程序是否正确(按F3,输入起始地址,对照37页微程序代码。)运行实验台系统程序NCMP53,按F7
5 SWITCH单元μMA5~μAO接线接到微控制器单元的SE6~SE1MA5~MA0全置“1”。单步运行微程序。通过改变开关状态,把所有微程序全部执行。(注意:微地址“1”要变“0”)

[解释数据通路]

结合实验五,对照微程序流程图和基本微型机的硬件组成解释数据通路:

SWA

SWB

控制台命令

0

0

读内存

0

1

写内存

1

1

启动程序

默认SWA=1SWB=1,处于启动程序状态。经过控制台指令地址从00-》01,启动控制台。

第二部分 用Verilog-HDL进行计算机设计的实验

[实验目的]

1 了解工作原理。
2 学会编写模块程序
3 学会编写测试的模块程序。

[实验设备]

1 常用微机一台;
2 Model Sim SEPLUS5.6 软件一套。

[实验步骤]

1 编写模块程序;
2 编写测试程序;
3 编辑编译这两个模块程序;
4 运行模拟、观察波形、验证设计的正确性。

[实验内容]

实验一 带进位四位加法器

实验二 时钟发生器

实验五 数据控制器

实验九 状态控制器

附:实验十:CPU

实验一:带进位的四位加法器

[实验原理]

4位输入信号:add_a[4],add_b[4]

输入进位:carry

时钟信号:clk

4位输出信号:sum[4]

进位信号:flow

[实验步骤以及结果]

1. 模块程序add4.v

module add4(add_a,add_b,sum,flow,clk,carry);

output [3:0] sum; //声明输出信号sum

output flow; //声明输出高位进位float

input [3:0] add_a,add_b; //声明两个4位二进制的输入信号add_aadd_b

input carry; //声明输入信号低位进位信号carry

input clk; //声明时钟信号CLK

reg [3:0] sum; //定义了一个4位的名为SUM的寄存器

reg flow; //定义了一个1位的名为FLOW的寄存器

always@(negedge clk) //CLK下降沿时,执行下列语句

begin

sum<=add_a+add_b+carry;//sum<=add_a+add_b+carry;

end

always@(posedge clk) //CLK上升沿时,执行下列语句

begin

flow<=(add_a[3]&add_b[3])|((add_a[3]|add_b[3])&sum[3]<1);

end //计算FLOW的数值

endmodule

2.测试程序add4_test.tst

module add4_test;

reg [3:0] add_a,add_b;

reg carry;

reg clk;

wire [3:0] sum;

wire flow;

add4 add4(add_a,add_b,sum,flow,clk,carry);

initial begin

carry=0;

clk=1;

add_a=4'b1011;

add_b=4'b0101;

end

always #1 clk=~clk; //产生时钟信号

always #5 carry=~carry; //间隔5,低位进位信号改变数值

always@(posedge clk)

begin

add_a<=add_b+1;

add_b<=add_a+1; //改变add_aadd_b

end

endmodule

3.仿真波形,见附件图;

实验二:时钟发生器

[实验原理]

时钟发生器clkgen利用外来时钟信号材料clk1,fetch,aluclk,送往CPU的其他部见。其中fetch是外部时钟,利用fetch的上升沿来触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址;clk1信号用作指令寄存器、累加器、状态控制器的时钟信号;alu_clk则用于触发算术逻辑运算单元。

时钟信号:clk

中间信号:clk2=~clk2(clk1↑);clk4=~clk4(clk2↓)

输出信号:clk1=~clk;

fetch=~fetch(clk4↑);

alu_clk=clk2&clk4&!fetch

[实验步骤以及结果]

1. 模块程序clkgen.v

module clkgen(clk,clk1,fetch,alu_clk);

output clk1,fetch,alu_clk; //声明输出变量clk1,fetch,alu_clk

input clk; //声明时钟信号clk

reg clk2,clk4,fetch; //定义31位寄存器名为clk2,clk4,fetch

initial //初始化

begin

clk2=0;

clk4=1;

fetch=0;

end

assign clk1=~clk; //逻辑功能定义

assign alu_clk=clk2&clk4&!fetch;

always@(posedge clk1) //每当clk1的信号出现上升沿时,下列语句被不断重复执行

begin

clk2<=~clk2;

end

always@(negedge clk2)

begin

clk4<=~clk4;

end

always@(posedge clk4)

begin

fetch<=~fetch;

end

endmodule

2. 测试程序clkgen_test.v

module clkgen_test;

reg clk;reg clk2;reg clk4;

clkgen clkgen(clk,clk1,fetch,alu_clk);

initial

begin

clk=1;

end

always #1 clk=~clk; //信号反相,#1表示延迟1个时间单位。

endmodule

3.仿真波形,见附录二。

实验六:数据控制器

[实验原理]

数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。累加器的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其他部件使用数据总线。数据控制其何时输出累加器的数据则由状态控制器输出的控制信号DAYA_ENA决定。

[实验步骤以及结果]

1模块程序datactl.v

module datactl(data,in,data_ena);

output[7:0] data;

input[7:0] in;

input data_ena; //声明输入输出

assign data=(data_ena)?in:8'bzzz_zzzz;//data_ena为真,则允许输出,否则

//呈现高阻态

endmodule

2.测试程序datactl_test.v

module datactl_test;

wire [7:0] data;

reg [7:0] in;

reg data_ena;

datactl datactl(data,in,data_ena);

initial begin

data_ena=0;

in<=8'b0101_0101;

end

always #1 data_ena=~data_ena; //间隔2nsdata_ena改变

always #1 in=in+1; //间隔1nsin的值在原来的基础上增1

endmodule

3.仿真波形,见附录二。

实验九:状态控制器

[实验原理]

状态控制器有两部分组成:(1)状态机;(2)状态控制器。

状态控制器接受复位信号RST,当RST有效时通过信号ENA使其为0,输入到状态机中停止状态机的工作。

状态机时CPU的控制核心,用于产生一系列的状态信号,启动或停止某些部件。CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量STATE记录,STATE的值就是当前这个指令周期中经过的时钟数。

指令周期由8个时钟周期组成,每个时钟周期都要完成固定的操作。

第0个时钟,因为CPU状态控制器的输出RD和LOAD_IR为高电平,其余均为低电平。指令寄存器寄存由ROM送来的高8位指令代码。

第1个时钟,与上一时钟相比只是INC_PC从0变为1,故PC增1,ROM送来低8位指令代码,指令寄存器寄存该8位代码。

第2个时钟,空操作。

第3个时钟,PC增1,指向下一条指令。若操作符为HLT,则输出信号HLT为高;如果操作符不为HLT,除了PC增1外,其他各控制线输出为零。

第4个时钟,若操作符号为ANDD,ADD,XORR或LDA,读相应地址的数据;若为JMP,将目的地址送给程序计数器;若为STO,输出累加器数据。

第5个时钟,若操作符为ANDD,ADD,XORR,算术运算器就进行相应的运算;若为LDA,就把数据通过算术运算器送给累加器;若为SKZ,线判断累加器的值是否为0,如果为,PC增1,否则保持原值;若为JMP,锁存目的地址;若为STO,将数据写入地址处。

第6个时钟,空操作。

第7个时钟,若操作符为SKZ且累加器值为0,则PC值再增加1,跳过一条指令,否则PC无变化。

[实验步骤以及结果]

1模块程序machinectl.v

module machinectl(ena,fetch,rst);

output ena;

input fetch,rst; //声明输入和输出

reg ena; //定义ena的寄存器

always @(posedge fetch or posedge rst)//fetch或者rst信号出现上升沿时,

begin //根据rst的值确定ena的值

if(rst)

ena<=0;

else

ena<=1;

end

endmodule

machine.v

module machine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,

halt,clk1,zero,ena,opcode);

output inc_pc,load_acc,load_pc,rd,wr,load_ir;

output datactl_ena,halt;

input clk1,zero,ena;

input [2:0] opcode;

reg inc_pc,load_acc,load_pc,rd,wr,load_ir;

reg datactl_ena,halt;

reg [2:0] state; //声明输入输出,以及定义寄存器

parameter //parameter来定义标识符形式的常量

HLT=3'b000,

SKZ=3'b001,

ADD=3'b010,

ANDD=3'b011,

XORR=3'b100,

LDA=3'b101,

STO=3'b110,

JMP=3'b111;

always @(negedge clk1)

begin

if(!ena) //如果接收到复位信号RST,进行复位操作

begin

state<=3'b000;

{inc_pc,load_acc,load_pc,rd}<=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

ctl_cycle; //执行任务ctl_cycle

end

//------------task ctl_cycle------------任务开始---------

task ctl_cycle;

begin

casex(state) //case语句

0: //rdload_ir均为高电平,其余为低电平。指令寄存器寄

Begin //存由ROM送来的高8位指令代码

{inc_pc,load_acc,load_pc,rd}<=4'b0001;

{wr,load_ir,datactl_ena,halt}<=4'b0100;

state<=1;

end

1: //INC_PC0变为1,故PC1ROM送来低8位指令代码,

Begin //指令寄存器寄存该8位代码

{inc_pc,load_acc,load_pc,rd}<=4'b1001;

{wr,load_ir,datactl_ena,halt}<=4'b0100;

state<=2;

end

2: //空操作

Begin

{inc_pc,load_acc,load_pc,rd}<=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

state<=3;

end

3: //PC1,指向下一条指令

begin

if(opcode==HLT) //若操作符为HLT,则输出信号HLT为高

begin

{inc_pc,load_acc,load_pc,rd}<=4'b1000;

{wr,load_ir,datactl_ena,halt}<=4'b0001;

end

else //否则其他各控制线输出为零。

begin

{inc_pc,load_acc,load_pc,rd}<=4'b1000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

state<=4;

end

4:

begin

if(opcode==JMP) //若为JMP,将目的地址送给程序计数器

begin

{inc_pc,load_acc,load_pc,rd}<=4'b0010;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

if(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)

begin //若操作符号为ANDD,ADD,XORRLDA,读相应地址的数据

{inc_pc,load_acc,load_pc,rd}<=4'b0001;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

if(opcode==STO) //若为STO,输出累加器数据

begin {inc_pc,load_acc,load_pc,rd}<=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0010;

end

else

begin //其他则为空操作

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

state<=5;

end

5:

begin

if(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)

begin //若操作符为ANDD,ADD,XORR,算术运算器就进行相应的运算

{inc_pc,load_acc,load_pc,rd} <=4'b0101;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

if (opcode==SKZ&&zero==1) //若为SKZ,线判断累加器的值是否为0,如果为,

begin // PC1,否则保持原值

{inc_pc,load_acc,load_pc,rd} <=4'b1000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

if(opcode==JMP) //若为JMP,锁存目的地址

begin

{inc_pc,load_acc,load_pc,rd} <=4'b1010;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

if(opcode==STO) //若为STO,将数据写入地址处

begin

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b1010;

end

else

begin //其他则为空操作

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

state<=6;

end

6:

begin

if(opcode==STO) //若为STO,将数据写入地址处

begin

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0010;

end

else

if(opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)

begin //若操作符号为ANDD,ADD,XORRLDA,读相应地址的数据

{inc_pc,load_acc,load_pc,rd} <=4'b0001;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else //其余为空操作

begin

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

state<=7;

end

7:

begin

if(opcode==SKZ&&zero==1) //若操作符为SKZ且累加器值为0

begin //PC值再增加1,跳过一条指令,否则PC无变化

{inc_pc,load_acc,load_pc,rd} <=4'b1000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

else

begin

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

end

state<=0;

end

default: //缺省为空操作

begin

{inc_pc,load_acc,load_pc,rd} <=4'b0000;

{wr,load_ir,datactl_ena,halt}<=4'b0000;

state<=0;

end

endcase

end

endtask

//-------------end of task ctl_cycle-----任务结束-----------------

endmodule

control.v

module control(clk1, zero, fetch, rst, opcode, inc_pc, load_acc, load_pc, rd, wr, load_ir, halt, datactl_ena);

output inc_pc,load_acc,load_pc,rd,wr,load_ir;

output datactl_ena,halt;

input clk1,zero,fetch,rst;

input [2:0] opcode; //声明输入和输出

wire ena; //定义wire类型的ena

machinectl machinectl(.fetch(fetch),.rst(rst),.ena(ena));

machine machine(.clk1(clk1),.zero(zero),.opcode(opcode), .ena(ena),.inc_pc(inc_pc),.load_acc(load_acc),.load_pc(load_pc),

.rd(rd),.wr(wr),.load_ir(load_ir),.halt(halt),.datactl_ena(datactl_ena)); //machinectlmachine连接起来

//machinectl.vmachine.v均为上层文件

endmodule

2.测试程序control_test.tst

module control_test;

wire inc_pc ,load_acc ,load_pc, rd, wr ,load_ir ,datactl_ena, halt;

wire clk1,fetch,alu_clock;

reg zero, rst;

reg [2:0] opcode;

reg clk;

clkgen clkgen(clk,clk1,fetch,alu_clk);

//用一个CLKGEN部件来产生clk1,fetch序列

control control(clk1, zero, fetch, rst, opcode, inc_pc, load_acc, load_pc, rd, wr, load_ir, halt, datactl_ena);

initial begin

rst=0;

clk=1;

zero=0;

opcode=3'b000;

end

always #1 clk=~clk; //产生时钟信号,1个时钟周期为2nm

always #160 zero=~zero;

always #16 opcode<=opcode+1;//经过8个时钟信号周期,opcode改变一次

endmodule

3.仿真波形,见附录二;

附录一:

实验十:CPU

源代码

包含:

accum.v累加器

adr.v地址多路器

alu.v算术运算器

clkgen.v 时钟发生器

control.v 状态控制器

machine.v

machinectl.v

counter.v程序计数器

datactl.v数据控制器

register.v指令寄存器

sig.v //生成信号CLK

addr_decode.v

ram.v

rom.v //外部器件

cpu.v //CPU集成

risc.v //CPU+外部器件

rscsys_ex1.v //测试仿真文件

test1.dat

test1.pro

test2.dat

test2.pro

test3.dat

test3.pro

cpu.v

module cpu(rst,clk,rd,wr,halt,addr,data);

input rst;

input clk;

output rd;

output wr;

output halt;

output [12:0] addr;

output [7:0] data;

wire clk1 fetch alu_clk;

wire [15:0] opc_iraddr;

wire [7:0] accum_data;

wire [7:0] alu_out;

wire zeroinc_pc load_acc load_pcload_ir datactl_ena;

wire [12:0] pc_addr;

wire [7:0] data_altera;

register register26p(.opc_iraddr(opc_iraddr), .data(data_altera), .ena(load_ir), .clk1(clk1), .rst(rst));

clkgen clkgen27p(.clk(clk), .clk1(clk1), .fetch(fetch), .alu_clk(alu_clk));

accum accum1p(.accum(accum_data), .data(alu_out), .ena(load_acc), .clk1(clk1), .rst(rst));

datactl datactl24p(.data(data_altera), .in(alu_out),.data_ena(datactl_ena));

adr adr22p(.addr(addr), .fetch(fetch), .ir_addr(opc_iraddr[12:0]), .pc_addr(pc_addr));

counter counter11p( .pc_addr(pc_addr), .ir_addr(opc_iraddr[12:0]), .load(load_pc), .clock(inc_pc), .rst(rst));

alu alu15p(.alu_out(alu_out), .zero(zero), .data(data_altera), .accum(accum_data), .alu_clk(alu_clk), .opcode(opc_iraddr[15:13]));

control control12p(.clk1(clk1), .zero(zero), .fetch(fetch), .rst(rst), .opcode(opc_iraddr[15:13]),.inc_pc(inc_pc), .load_acc(load_acc), .load_pc(load_pc), .rd(rd), .wr(wr), .load_ir(load_ir), .halt(halt), .datactl_ena(datactl_ena));

assign data = data_altera;

endmodule

sig.v

module sig(clk);

output clk;

reg clock;

initial

begin

clock=0;

end

assign clk=clock;

always #1 clock=~clock;

endmodule

Risc.v

module risc(rst);

reg rst;

wire clk, read, write, halt;

wire [7:0] data;

wire [12:0] addr;

wire ramsel, romsel;

sig sys_sig5p(.clk(clk));

cpu sys_rsc4p(.rst(rst),.clk(clk),.rd(read),.wr(write),.halt(halt),.addr(addr[12:0]),.data(data[7:0]));

ram sys_ram3p(.data(data[7:0]),.addr(addr[9:0]), .ena(ramsel), .read(read), .write(write));

rom sys_rom1p(.addr(addr[12:0]),.ena(romsel), .read(read), .data(data[7:0]));

addr_decode sys_addr_decode2p(.addr(addr[12:0]), .romsel(romsel), .ramsel(ramsel));

endmodule

recsya_ex1.v

//------------------------rscsys_ex1.v-------------------------------

`define VLP vlog1

`define PERIOD 100 //matches clkgen/vlog_behaviorial/verilog.v

module rscsys_ex1;

reg reset_req;

integer test;

reg [(3*8):0] mnemonic; //array that holds 3 8-bit ASCII characters

reg [12:0] PC_addr,IR_addr;

assign `VLP.rst =reset_req;

risc vlog1(rst);

initial //display time in nanoseconds

begin

$timeformat(-9,1,"ns",12);

display_debug_message;

end

always @(posedge `VLP.halt) // STOP when HALT instruction decoded

begin

#500

$display("\n************************************");

$display("*A HALT INSTRUCTION WAS PROCESSED!!! *");

$display("************************************\n");

display_debug_message;

end

task display_debug_message;

begin

$display("\n************************************");

$display("*THE FOLLOWING DEBUG TASK ARE AVAILABLE: *");

$display("* test1 to load the 1st diagnostic program. *");

$display("* test2 to load the 2nd diagnostic program. *");

$display("* test3 to load the Fibonacci program.*");

$display("************************************\n");

test1;

test2;

test3;

$stop;

end

endtask

task test1;

begin

test = 0;

disable MONITOR;

$readmemb("test1.pro",`VLP.sys_rom1p.memory);

$display("rom loaded successfully!");

$readmemb("test1.dat",`VLP.sys_ram3p.ram);

$display("ram loaded successfully!");

#1 test = 1;

sys_reset;

end

endtask

task test2;

begin

test = 0;

disable MONITOR;

$readmemb("test2.pro",`VLP.sys_rom1p.memory);

$display("rom loaded successfully!");

$readmemb("test2.dat",`VLP.sys_ram3p.ram);

$display("ram loaded successfully!");

#1 test = 2;

sys_reset;

end

endtask

task test3;

begin

test = 0;

disable MONITOR;

$readmemb("test3.pro",`VLP.sys_rom1p.memory);

$display("rom loaded successfully!");

$readmemb("test3.dat",`VLP.sys_ram3p.ram);

$display("ram loaded successfully!");

#1 test = 3;

sys_reset;

end

endtask

task sys_reset;

begin

reset_req = 0;

#(`PERIOD * 0.7) reset_req = 1;

#(1.5 * `PERIOD) reset_req = 0;

end

endtask

always @(test)

begin: MONITOR

case (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)

@(`VLP.sys_rsc4p.adr22p.pc_addr)

if((`VLP.sys_rsc4p.adr22p.pc_addr%2==1)&&(`VLP.sys_rsc4p.adr22p.fetch==1))

begin

#60 PC_addr<=`VLP.sys_rsc4p.adr22p.pc_addr-1;

IR_addr<=`VLP.sys_rsc4p.adr22p.ir_addr;

#340 $strobe("%t %h %s %h %h",

$time,PC_addr,mnemonic,IR_addr,`VLP.data);

end

end

2:begin

$display("\n***RUNNING CPUtest2-The ad cpu program***");

$display("\n time pc instr addr data");

$display("-------------------------");

while(test==2)

@(`VLP.sys_rsc4p.adr22p.pc_addr)

if((`VLP.sys_rsc4p.adr22p.pc_addr%2==1)&&(`VLP.sys_rsc4p.adr22p.fetch==1))

begin

#60 PC_addr<=`VLP.sys_rsc4p.adr22p.pc_addr-1;

IR_addr<=`VLP.sys_rsc4p.adr22p.ir_addr;

#340 $strobe("%t %h %s %h %h",

$time,PC_addr,mnemonic,IR_addr,`VLP.data);

end

end

3:begin

$display("\n***RUNNING CPUtest3- an executable program***");

$display("***this pro should calculate the fibaci");

$display("***no sequence from 0 to 144***");

$display("\nTIME FIBOCI NO");

$display("-------------------------");

while(test==3)

begin

wait(`VLP.sys_rsc4p.alu15p.opcode==3'h1)

$strobe("%t %d",$time,`VLP.sys_ram3p.ram[10'h2]);

wait(`VLP.sys_rsc4p.alu15p.opcode!=3'h1);

end

end

endcase

end

always@(`VLP.sys_rsc4p.alu15p.opcode)

case(`VLP.sys_rsc4p.alu15p.opcode)

3'h0 :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="???";

endcase

endmodule

posted on 2007-06-07 07:47 闲情万万 阅读(3646) 评论(2)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: