Verilog数字系统设计课程设计报告图文_第1页
Verilog数字系统设计课程设计报告图文_第2页
Verilog数字系统设计课程设计报告图文_第3页
Verilog数字系统设计课程设计报告图文_第4页
Verilog数字系统设计课程设计报告图文_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Verilog HDL 数字系统设计课程设计课题:RISC_CPU设计与验证第一章:RISC_CPU概述 (51.1课题的由来和设计环境介绍 (51.2什么是CPU (5第二章:RISC_CPU结构 (62.1 RISC_CPU整体结构 (62.2 时钟发生器 (72.2.1 时钟发生器的介绍 (72.2.2 时钟发生器symbol (82.2.3 时钟发生器RTL (82.2.4 时钟发生器源代码 (82.2.5 时钟发生器测试代码 (92.2.6 时钟发生器仿真波形 (102.3指令寄存器 (102.3.1 指令寄存器介绍 (102.3.2 指令寄存器symbol (112.3.3 指令寄

2、存器RTL (112.3.4 指令寄存器源代码 (112.3.5 指令寄存器测试代码 (122.3.6指令寄存器仿真波形 (132.4 累加器 (132.4.1 累加器介绍 (132.4.2 累加器symbol (132.4.3 累加器RTL (142.4.4 累加器源代码 (142.4.5 累加器仿真代码 (142.4.6 累加器仿真波形 (152.5 算术运算器 (152.5.1 算术运算器介绍 (152.5.2 算术运算器symbol (162.5.3 算术运算器RTL (172.5.4 算术运算器源代码 (182.5.5 算术元算器测试代码 (192.5.6 算术运算器仿真波形 (20

3、2.6数据控制器 (202.6.1 数据控制器介绍 (202.6.2 数据控制器smybol (202.6.3 数据控制器RTL (212.6.4 数据控制器源代码 (212.6.5 数据控制器测试代码 (222.6.6 数据控制器仿真波形 (222.7 地址多路器 (222.7.1地址多路器介绍 (222.7.2 地址多路器smybol (232.7.3 地址多路器RTL (232.7.5 地址多路器测试代码 (232.7.6 地址多路器仿真波形 (242.8程序计数器 (242.8.1 程序计数器介绍 (242.8.2 程序计数器symbol (252.8.3 程序计数器RTL (252.

4、8.4 程序计数器源代码 (252.8.5 程序计数器测试代码 (262.8.6 程序计数器仿真波形 (262.9 状态控制器 (272.9.1 状态控制器介器 (272.9.2 状态控制器smybol (272.9.3 状态控制器RTL (272.9.4 状态控制器源代码 (272.9.5 状态控制器测试代码 (282.9.6 状态控制器仿真波形 (292.10状态机 (292.10.1状态机的介绍 (292.10.2 状态机symbol (302.10.3 状态机RTL (302.10.4状态机源代码 (312.10.5 状态机测试代码 (352.10.6 状态机仿真波形 (362.11

5、CPU内核模块的整合 (362.11.1 CPU内核原理图 (362.11.2 CPU内核smybol (37第三章:CPU外围模块的设计 (373.1 地址译码器 (373.1.1 地址译码器介绍 (373.1.2 地址译码器smybol (373.1.3 地址译码器RTL (383.1.4 地址译码器源代码 (383.1.5 地址译码器测试代码 (383.1.6 地址译码器仿真波形 (393.2 RAM (393.2.1 RAM的介绍 (393.2.2 RAM smybol (393.2.3 RAM RTL (403.2.4 RAM 源代码 (403.2.5 RAM 测试代码 (403.2

6、.6 RAM 仿真波形 (423.3 ROM (423.3.1 ROM的介绍 (423.3.3 ROM的高阻化处理 (423.4 I/O模块 (433.4.1 I/O模块源代码 (433.4.2 I/O模块smybol (443.5 CPU外围模块连接电路原理图 (443.6 烧录到FPGA上 (45第四章:CPU功能验证 (454.1 CPU寻址方式和指令系统 (454.2 HLT指令验证 (464.3 SKZ指令验证 (464.4 ADD指令验证 (474.5 AND指令验证 (474.6 LDA、STO、JMP指令验证 (47第五章:总结 (48参考文献: (48第一章:RISC_CPU

7、概述1.1课题的由来和设计环境介绍在本设计课程中,我们通过自己动脑筋,设计出CPU的软核和固核。这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。在设计中我们不但关心CPU 总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真, 我们把寻址空间规定为8K(即13位地址线字节。下面我们就一步一步地来设计这样一个CPU,并进行RTL仿真、经过综合、布局布线后,再次进行一次仿真,从中我们可以体会到这种设计方法的潜力。次

8、课程设计中的V erilogHDL程序都为我们学习目的而编写的,全部程序在CADENCE公司的NC-V erilog 环境、Synopsys VCS、Mentor 公司的ModelSim 6.1 等环境下用V erilog语言进行了仿真。同时我们分别用Synplify、Altera Quartus II 等工具,针对不同的FPGA进行了综合。顺利地通过RTL级仿真、综合后门级逻辑网表仿真以及布线后的门级结构电路模型仿真。这个CPU 模型只是一个教学模型,设计也不一定很合理,只是从原理上说明了简单的RISC _CPU是如何构成的。本次课程设计的内容是想达到以下四个目的:1学习RISC CPU的基

9、本结构和原理;2了解V erilog HDL仿真和综合工具的潜力;2展示V erilog设计方法对软/硬件联合设计和验证的意义;3学习并掌握一些常用的V erilog语法和验证方法。作者也希望本章的内容能引起对CPU和复杂数字逻辑系统设计有兴趣的电子工程师们的注意,加入我国集成电路的设计队伍,提高我国电子产品的档次。1.2什么是CPUCPU 即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤:1.将数据和程序(即指令序列输入到计算机的存储器中。2.从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件执行程序,使其有条

10、不紊地进行。因此它必须具有以下基本功能:取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。分析指令:即指令译码。是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作命令。执行指令:根据分析指令时产生的操作命令形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。将其功能进一步细化,可概括如下:能对指令进行译码并执行规定的动作;可以进行算术和逻辑运算;能与存储器,外设交换数据;提供整个系统所需要的控制;尽管各种CPU的性能指标和结构细节各不相同,但它们所能完

11、成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:算术逻辑运算部件(ALU,累加器,程序计数器,指令寄存器,译码器,时序和控制部件。RISC 即精简指令集计算机(Reduced Instruction Set Computer的缩写。它是一种八十年代出现的CPU,与一般的CPU 相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。从实现的途径看,RISC_CPU与一般的CPU的不同处在于:它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和

12、组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。RISC_CPU也包括上述这些部件,下面就详细介绍一个简化的用于教学目的的RISC_CPU的可综合V erilogHDL模型的设计和仿真过程。第二章:RISC_CPU结构2.1 RISC_CPU整体结构RISC_CPU是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂。我们可把它分成八个基本部件来考虑:1时钟发生器2指令寄存器3累加器4算术逻辑运算单元5数据控制器6状态控制器7程序计数器8地址多路器9状态机各部件的相互连接关系见图17.1。其中时钟发生器利用外来时钟信号进行分频生成一系列时钟信号,送

13、往其他部件用作时钟信号。各部件之间的相互操作关系则由状态控制器来控制。各部件的具体结构和逻辑关系在下面的小节里逐一进行介绍。 2.2 时钟发生器2.2.1 时钟发生器的介绍时钟发生器CLK_GEN 利用外来时钟信号clk 来生成一系列时钟和控制信号:clk、fetch、alu_ena 送往CPU的其他部件。其中fetch是控制信号,clk 的八分频信号,当fetch 高电平时,使clk能触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。clk信号用作指令寄存器、累加器、状态控制器的时钟信号。alu_ena 则用于控制算术逻辑运算单元的操作。由于在时钟

14、发生器的设计中采用了同步状态机的设计方法,不但使clk_gen模块的源程序可以被各种综合器综合,也使得由其生成的fetch、alu_ena 在同步性能上有明显的提高,为整个系统的性能提高打下了良好的基础。2.2.2 时钟发生器symbol 2.2.3 时钟发生器RTL 2.2.4 时钟发生器源代码timescale 1ns/1nsmodule CLK_GEN (clk,reset,fetch,alu_ena,clk1; input clk;input reset;output fetch,alu_ena,clk1;reg fetch,alu_ena;reg 7:0 state;assign c

15、lk1=clk;parameters1=8'b00000001,s2=8'b00000010,s3=8'b00000100,s4=8'b00001000,s5=8'b00010000,s6=8'b00100000,s7=8'b01000000,s8=8'b10000000,idle=8'b00000000;always (posedge clk or negedge resetif(resetbeginfetch<=0;alu_ena<=0;state<=idle;endelsebegincase(sta

16、tes1:begin alu_ena<=1;state<=s2;ends2:begin alu_ena<=0;state<=s3;ends3:begin fetch<=1;state<=s4;ends4:begin state<=s5;ends5:begin state<=s6;ends6:begin state<=s7;ends7:begin fetch<=0;state<=s8;ends8:begin state<=s1;endidle: state<=s1;default: state<=idle;end

17、caseendendmodule2.2.5 时钟发生器测试代码timescale 1ns/1nsmodule TB(;reg clk;reg reset;wire fetch;wire alu_ena;wire clk1;CLK_GEN u1(.clk(clk,.reset(reset,.fetch(fetch,.alu_ena(alu_ena,.clk1(clk1;initialbeginclk<=0;reset<=0;endalwaysbegin#50 clk<=clk;#400 reset<=1;endendmodule2.2.6 时钟发生器仿真波形 2.3指令寄

18、存器2.3.1 指令寄存器介绍指令寄存器,顾名思义,指令寄存器用于寄存指令。指令寄存器的触发时钟是clk,在clk的正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中。但并不是每个clk的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。load_ir信号通过ena 口输入到指令寄存器。复位后,指令寄存器被清为零。每条指令为2个字节,即16位。高3位是操作码,低13位是地址。(CPU的地址总线为13位,寻址空间为8K字节。本设计的数据总线为8位,所以每条指令需取两次。先取高8位,后取低8位

19、。而当前取的是高8位还是低8位,由变量state记录。state为零表示取的高8位,存入高8位寄存器,同时将变量state置为1。下次再寄存时,由于state为1,可知取的是低8位,存入低8位寄存器中。2.3.2 指令寄存器symbol 2.3.3 指令寄存器RTL 2.3.4 指令寄存器源代码timescale 1ns/1nsmodule REGISTER (opcode,ir_addr,data,ena,clk,rst; output2:0opcode;output12:0ir_addr;input7:0data;input ena,clk,rst;reg15:0opc_iraddr;re

20、g state;assign opcode,ir_addr = opc_iraddr;always(posedge clk or negedge rstbeginif(rstopc_iraddr<=16'b0000_0000_0000_0000;state<=1'b0;endelsebeginif(enabegincasex(state1'b0:beginopc_iraddr15:8<=data;state<=1;end1'b1:beginopc_iraddr7:0<=data;state<=0;enddefault:begi

21、nopc_iraddr15:0<=16'b0000000000000000;state<=1'b0;endendcaseendelsestate<=1'b0;endendendmodule2.3.5 指令寄存器测试代码REGISTER u1 (.data(data,.ena(ena,.clk(clk,.rst(rst,.opcode(opcode,.ir_addr(ir_addr;initialbeginena<=1'b1;clk<=1'b0;rst<=1'b0;data<=8'b11111100

22、;endbegin#200 rst<=1'b1;#50 clk<=clk;endendmodule2.3.6指令寄存器仿真波形 2.4 累加器2.4.1 累加器介绍累加器用于存放当前的结果,它也是双目运算其中一个数据来源。复位后,累加器的值是零。当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk时钟正跳沿时就收到来自于数据总线的数据。2.4.2 累加器symbol 2.4.3 累加器RTL 2.4.4 累加器源代码module ACCUM(accum,data,ena,clk,rst; input 7:0data;input ena,clk,rst

23、;output reg 7:0accum;always (posedge clk or negedge rst beginif(rstaccum<=8'b00000000;elseif(enaaccum<=data;endendmodule2.4.5 累加器仿真代码timescale 1ns/1nsmodule TB(;wire7:0accum;reg 7:0data;reg clk;reg ena;reg rst;ACCUM u1(.accum(accum,.data(data,.clk(clk,.ena(ena,.rst(rst;initialbeginclk<=

24、1'b0;ena<=1'b0;rst<=1'b0;data<=8'b00000000;#400 rst<=1'b1;#400 ena<=1'b1;#800 data<=8'b00000011;#800 data<=8'b00001100;#800 data<=8'b00110000;#800 data<=8'b01000000;#800 data<=8'b10000000;#800 data<=8'b00001000;#800 dat

25、a<=8'b00100000;endalwaysbegin#50 clk<=clk;endendmodule2.4.6 累加器仿真波形 2.5 算术运算器2.5.1 算术运算器介绍算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算。利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。2.5.2 算术运算器symbol timescale 1ns/1nsmodule alu(alu_out,zero,data,accum,alu_ena,opcode,clk; output7:0 alu_out;output zero;inpu

26、t 7:0 data,accum;input 2:0 opcode;input alu_ena,clk;reg 7:0 alu_out;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;assign zero =! accum;always (posedge clk or negedge alu_enaif(alu_enabegincasex(opcodeHLT:alu_

27、out<=accum;SKZ:alu_out<=accum;ADD:alu_out<=data+accum;ANDD:alu_out<=data&accum;XORR:alu_out<=dataaccum;LDA:alu_out<=data;STO:alu_out<=accum;JMP:alu_out<=accum;default:alu_out<=8'bxxxx_xxxx;endcaseendendmoduletimescale 1ns/1nsmodule TB(;reg clk;reg 7:0data;reg 7:0ac

28、cum;reg 2:0opcode;reg alu_ena;wire 7:0alu_out;wire zero;alu u1( .alu_out(alu_out,.zero(zero,.data(data,.accum(accum,.alu_ena(alu_ena,.opcode(opcode,.clk(clk;initialbeginclk<=1'b0;alu_ena<=1'b0;data<=8'b0010_1100;accum<=8'b0101_1001; opcode<=3'b000;#200 opcode<=3

29、'b000; #200 opcode<=3'b001; #200 opcode<=3'b010; #200 opcode<=3'b011; #200 opcode<=3'b100; #200 opcode<=3'b101; #200 opcode<=3'b110; #200 opcode<=3'b111; endalways#50 clk<=clk;Endmodule 2.6数据控制器2.6.1 数据控制器介绍数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公

30、共通道,不同的情况下传送不同的内容。有时要传输指令,有时要传送RAM区或接口的数据。累加器的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。数据控制器何时输出累加器的数据则由状态控制器输出的控制信号datactl_ena决定。2.6.2 数据控制器smybol 2.6.3 数据控制器RTL 2.6.4 数据控制器源代码module datactl(data,in,data_ena; output7:0data;input7:0in;inp

31、ut data_ena;assign data=(data_ena?in:8'bzzzz_zzzz; endmodule2.6.5 数据控制器测试代码timescale 1ns/1nsmodule TB(;reg data_ena;reg 7:0in;wire 7:0data;datactl u1(.data_ena(data_ena,.in(in,.data(data;initialbegindata_ena<=1'b0;in<=8'b0000_0000;#100 data_ena<=1'b1;#200 in<=8'b0100_

32、1100;#200 in<=8'b0011_0101;#200 in<=8'b1000_0100;#200 data_ena<=1'b0;#200 data_ena<=1'b1;#200 in<=8'b0011_0101;#200 in<=8'b1000_0100;endendmodule2.6.6 数据控制器仿真波形 2.7 地址多路器2.7.1地址多路器介绍地址多路器用于选择输出的地址是PC(程序计数地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周

33、期用于对RAM或端口的读写,该地址由指令中给出。地址的选择输出信号由时钟信号的8分频信号fetch提供。2.7.2 地址多路器smybol 2.7.3 地址多路器RTL 2.7.4 地址多路器源代码module adr(addr,fetch,ir_addr,pc_addr; output 12:0addr;input 12:0ir_addr,pc_addr;input fetch;assign addr=fetch? pc_addr:ir_addr; endmodule2.7.5 地址多路器测试代码timescale 1ns/1nsmodule TB(;reg 12:0ir_addr;reg

34、12:0pc_addr;reg fetch;wire 12:0addr;adr u1(.ir_addr(ir_addr,.pc_addr(pc_addr,.addr(addr,.fetch(fetch;initialbeginfetch<=1'b0;ir_addr<=13'b0_0000_0000_0000;pc_addr<=13'b0_0000_0000_0000;#200 ir_addr<=13'b1_0011_0001_1010;#200 pc_addr<=13'b1_0100_1000_0001;#200 ir_ad

35、dr<=13'b1_0110_1001_1010;#200 pc_addr<=13'b1_1010_1110_1101;#100 fetch<=1'b1;#100 ir_addr<=13'b1_0011_0001_1010;#200 pc_addr<=13'b1_0100_1000_0001;#200 ir_addr<=13'b1_0110_1001_1010;#200 pc_addr<=13'b1_1010_1110_1101;endendmodule2.7.6 地址多路器仿真波形 2.8程序计

36、数器2.8.1 程序计数器介绍程序计数器用于提供指令地址。以便读取指令,指令按地址顺序存放在存储器中。有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,需要形成新的指令地址。下面就来详细说明PC地址是如何建立的。复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。每条指令执行完需2个时钟,这时pc_addr已被增2,指向下一条指令。(因为每条指令占两个字节。如果正执行的指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数器(pc_addr将装入目标地址(ir_a

37、ddr,而不是增2。2.8.2 程序计数器symbol 2.8.3 程序计数器RTL 2.8.4 程序计数器源代码timescale 1ns/1nsmodule counter(pc_addr,ir_addr,load,clock,rst; output12:0pc_addr;input12:0ir_addr;input load,clock,rst;reg12:0pc_addr;always (posedge clock or negedge rstbeginif(rstpc_addr<=13'b0_0000_0000_0000;else if(loadpc_addr<=

38、ir_addr;elsepc_addr<=pc_addr+1'b1;endendmodule2.8.5 程序计数器测试代码timescale 1ns/1nsmodule TB(;reg 12:0ir_addr;reg load;reg clock;reg rst;wire 12:0pc_addr;counteru1(.ir_addr(ir_addr,.load(load,.clock(clock,.rst(rst,.pc_addr(pc_addr; initialbeginrst<=1'b0;clock<=1'b0;load<=1'b0;

39、ir_addr<=13'b0_0000_0000_0000;#100 rst<=1'b1;#600beginload<=1'b1;ir_addr<=13'b0_0110_1010_0111;end#200 load<=1'b0;endalways#50 clock<=clock;endmodule2.8.6 程序计数器仿真波形 2.9 状态控制器2.9.1 状态控制器介器状态机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到状态机中停止状态机的工作。2.9.2 状态控制器smybol 2.9.3

40、状态控制器RTL 2.9.4 状态控制器源代码timescale 1ns/1nmodule machinectl(ena,fetch,clk,rst;input fetch,clk,rst;output ena;reg ena;always (posedge clkbeginif(rstena<=0;elseif(fetchena<=1;endendmodule2.9.5 状态控制器测试代码timescale 1ns/1nsmodule TB(;reg fetch;reg clk;reg rst;wire ena;machinectl u1(.fetch(fetch,.clk(cl

41、k,.rst(rst,.ena(ena; initialbeginfetch<=1'b0;clk<=1'b0;rst<=1'b0;#200 rst<=1'b1;endalways#50 clk<=clk;always#600 fetch<=fetch;endmodule2.9.6 状态控制器仿真波形 2.10状态机2.10.1状态机的介绍状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量state记录,sta

42、te的值就是当前这个指令周期中已经过的时钟数(从零计起。指令周期是由8个时钟周期组成,每个时钟周期都要完成固定的操作。a第0个时钟,因为CPU状态控制器的输出:rd和load_ir为高电平,其余均为低电平。指令寄存器寄存由ROM送来的高8位指令代码。b第1个时钟,与上一时钟相比只是inc_pc从0变为1故PC增1,ROM送来低8位指令代码,指令寄存器寄存该8位代码。c第2个时钟,空操作。d第3个时钟,PC增1,指向下一条指令。若操作符为HLT,则输出信号HLT为高。如果操作符不为HLT,除了PC增1外(指向下一条指令,其它各控制线输出为零。e第4个时钟,若操作符为AND、ADD、XOR或LDA

43、,读相应地址的数据;若为JMP,将目的地址送给程序计数器;若为STO,输出累加器数据。f第5个时钟,若操作符为ANDD、ADD或XORR,算术运算器就进行相应的运算;若为LDA,就把数据通过算术运算器送给累加器;若为SKZ,先判断累加器的值是否为0,如果为0,PC就增1,否则保持原值;若为JMP,锁存目的地址;若为STO,将数据写入指定地址。g第6个时钟,空操作。h第7个时钟,若操作符为SKZ且累加器值为0,则PC值再增1,跳过一条指令,否则PC无变化。2.10.2 状态机symbol 2.10.3 状态机RTL 2.10.4状态机源代码timescale 1ns/1nsmodule mach

44、ine ( inc_pc, load_acc, load_pc, rd,wr, load_ir, datactl_ena, halt, clk, zero, ena, opcode ;output inc_pc, load_acc, load_pc, rd, wr, load_ir;output datactl_ena, halt;input clk, 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 HL

45、T = 3 'b000,SKZ = 3 'b001,ADD = 3 'b010,ANDD = 3 'b011,XORR = 3 'b100,LDA = 3 'b101,STO = 3 'b110,JMP = 3 'b111;always ( posedge clk beginif ( !ena beginstate<=3'b000;inc_pc,load_acc,load_pc,rd<=4'b0000;wr,load_ir,datactl_ena,halt<=4'b0000;endelse

46、ctl_cycle;endtask ctl_cycle;begincasex(state3'b000:begininc_pc,load_acc,load_pc,rd<= 4'b1001;wr,load_ir,datactl_ena,halt <= 4'b0100;state <= 3'b001;end3'b001:begininc_pc,load_acc,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt <= 4'b0100; state <= 3

47、9;b010;end3'b010:begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; state <= 3'b011;end3'b011:beginif(opcode=HLTbegininc_pc,load_acc,load_pc,rd<= 4'b1000; wr,load_ir,datactl_ena,halt <= 4'b0001; endelsebegininc_pc,load_acc,loa

48、d_pc,rd<=4'b1000; wr,load_ir,datactl_ena,halt <=4'b0000; endstate<=3'b100;end3'b100:beginif(opcode=JMPbegininc_pc,load_acc,load_pc,rd<= 4'b0010; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif( opcode=ADD | opcode =ANDD | opcode=XORR | opcode=LDAbegininc_pc,l

49、oad_acc,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif(opcode=STObegininc_pc,load_acc,load_pc,rd<=4'b0000; wr,load_ir,datactl_ena,halt <=4'b0010; endelsebegininc_pc,load_acc,load_pc,rd<=4'b0000; wr,load_ir,datactl_ena,halt<=4'b0000;

50、endstate<=3'b101;end3'b101:beginif ( opcode =ADD|opcode=ANDD|opcode=XORR|opcode=LDA begininc_pc,load_acc,load_pc,rd<= 4'b0101; wr,load_ir,datactl_ena,halt<= 4'b0000; endelseif( opcode =SKZ && zero=1begininc_pc,load_acc,load_pc,rd<= 4'b1000; wr,load_ir,datactl_

51、ena,halt<= 4'b0000; endelseif(opcode=JMPbegininc_pc,load_acc,load_pc,rd<= 4'b1010; wr,load_ir,datactl_ena,halt <= 4'b0000; endelseif(opcode = STObegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b1010; endelsebegininc_pc,load_acc,load_pc,rd

52、<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate <= 3'b110;3'b110:beginif ( opcode = STO begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0010; endelseif ( opcode =ADD|opcode =ANDD| opcode=XORR|opcode=LDAbegininc_pc,load_ac

53、c,load_pc,rd<= 4'b0001; wr,load_ir,datactl_ena,halt<= 4'b0000; endelsebegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate<=3'b111;end3'b111:beginif( opcode=SKZ && zero=1 begininc_pc,load_acc,load_pc,rd<= 4'b

54、1000; wr,load_ir,datactl_ena,halt<= 4'b0000; endelsebegininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt<= 4'b0000; endstate<=3'b000;enddefault:begininc_pc,load_acc,load_pc,rd<= 4'b0000; wr,load_ir,datactl_ena,halt <= 4'b0000; state <=3&

55、#39;b000;endendcaseendtaskendmodule2.10.5 状态机测试代码timescale 1ns/1nsmodule TB(;reg clk, zero, ena;reg 2:0 opcode;wire inc_pc, load_acc, load_pc, rd, wr, load_ir;wire datactl_ena, halt;machine u1(.clk(clk,.zero(zero,.ena(ena,.opcode(opcode,.halt(halt, .inc_pc(inc_pc,.load_acc(load_acc,.load_pc(load_pc,

56、.rd(rd,.wr(wr,.load_ir(load_ir,.datactl_ena(datactl_ena; initialbeginclk<=1'b0;zero<=1'b0;ena<=1'b0;#200 zero<=1'b1;#200 ena<=1'b1;endalwaysbegin#600 opcode<=3'b000;#600 opcode<=3'b001;#600 opcode<=3'b010;#600 opcode<=3'b011;#600 opcode&

57、lt;=3'b100;#600 opcode<=3'b101;#600 opcode<=3'b110;#600 opcode<=3'b111;endalways#50 clk<=clk;endmodule2.10.6 状态机仿真波形 2.11 CPU内核模块的整合2.11.1 CPU内核原理图 2.11.2 CPU内核smybol 第三章:CPU外围模块的设计为了对RISC_CPU进行测试,需要有存储测试程序的ROM和装载数据的RAM、地址译码器。3.1 地址译码器3.1.1 地址译码器介绍地址译码器用于产生选通信号,选通ROM或RAM。1FFFH-1800H RAM17FFH-0000H ROM3.1.2 地址译码器smybol 3.1.3 地址译码器RTL 3.1.4 地址译码器源代码module addr_decode(addr,rom_sel,ram_sel,io1_sel,io2_sel,address; output rom_sel,ram_sel,io1_sel,io2_sel;output 7:0address;input 12:0addr;reg rom_sel,ram_sel,io1_sel,io2_sel;assign address=addr7:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论