Verilog数字系统设计课程设计报告图文.docx
- 文档编号:24248088
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:49
- 大小:3.40MB
Verilog数字系统设计课程设计报告图文.docx
《Verilog数字系统设计课程设计报告图文.docx》由会员分享,可在线阅读,更多相关《Verilog数字系统设计课程设计报告图文.docx(49页珍藏版)》请在冰豆网上搜索。
Verilog数字系统设计课程设计报告图文
VerilogHDL数字系统设计
课程设计
课题:
RISC_CPU设计与验证
第一章:
RISC_CPU概述(5
1.1课题的由来和设计环境介绍(5
1.2什么是CPU(5
第二章:
RISC_CPU结构(6
2.1RISC_CPU整体结构(6
2.2时钟发生器(7
2.2.1时钟发生器的介绍(7
2.2.2时钟发生器symbol(8
2.2.3时钟发生器RTL(8
2.2.4时钟发生器源代码(8
2.2.5时钟发生器测试代码(9
2.2.6时钟发生器仿真波形(10
2.3指令寄存器(10
2.3.1指令寄存器介绍(10
2.3.2指令寄存器symbol(11
2.3.3指令寄存器RTL(11
2.3.4指令寄存器源代码(11
2.3.5指令寄存器测试代码(12
2.3.6指令寄存器仿真波形(13
2.4累加器(13
2.4.1累加器介绍(13
2.4.2累加器symbol(13
2.4.3累加器RTL(14
2.4.4累加器源代码(14
2.4.5累加器仿真代码(14
2.4.6累加器仿真波形(15
2.5算术运算器(15
2.5.1算术运算器介绍(15
2.5.2算术运算器symbol(16
2.5.3算术运算器RTL(17
2.5.4算术运算器源代码(18
2.5.5算术元算器测试代码(19
2.5.6算术运算器仿真波形(20
2.6数据控制器(20
2.6.1数据控制器介绍(20
2.6.2数据控制器smybol(20
2.6.3数据控制器RTL(21
2.6.4数据控制器源代码(21
2.6.5数据控制器测试代码(22
2.6.6数据控制器仿真波形(22
2.7地址多路器(22
2.7.1地址多路器介绍(22
2.7.2地址多路器smybol(23
2.7.3地址多路器RTL(23
2.7.5地址多路器测试代码(23
2.7.6地址多路器仿真波形(24
2.8程序计数器(24
2.8.1程序计数器介绍(24
2.8.2程序计数器symbol(25
2.8.3程序计数器RTL(25
2.8.4程序计数器源代码(25
2.8.5程序计数器测试代码(26
2.8.6程序计数器仿真波形(26
2.9状态控制器(27
2.9.1状态控制器介器(27
2.9.2状态控制器smybol(27
2.9.3状态控制器RTL(27
2.9.4状态控制器源代码(27
2.9.5状态控制器测试代码(28
2.9.6状态控制器仿真波形(29
2.10状态机(29
2.10.1状态机的介绍(29
2.10.2状态机symbol(30
2.10.3状态机RTL(30
2.10.4状态机源代码(31
2.10.5状态机测试代码(35
2.10.6状态机仿真波形(36
2.11CPU内核模块的整合(36
2.11.1CPU内核原理图(36
2.11.2CPU内核smybol(37
第三章:
CPU外围模块的设计(37
3.1地址译码器(37
3.1.1地址译码器介绍(37
3.1.2地址译码器smybol(37
3.1.3地址译码器RTL(38
3.1.4地址译码器源代码(38
3.1.5地址译码器测试代码(38
3.1.6地址译码器仿真波形(39
3.2RAM(39
3.2.1RAM的介绍(39
3.2.2RAMsmybol(39
3.2.3RAMRTL(40
3.2.4RAM源代码(40
3.2.5RAM测试代码(40
3.2.6RAM仿真波形(42
3.3ROM(42
3.3.1ROM的介绍(42
3.3.3ROM的高阻化处理(42
3.4I/O模块(43
3.4.1I/O模块源代码(43
3.4.2I/O模块smybol(44
3.5CPU外围模块连接电路原理图(44
3.6烧录到FPGA上(45
第四章:
CPU功能验证(45
4.1CPU寻址方式和指令系统(45
4.2HLT指令验证(46
4.3SKZ指令验证(46
4.4ADD指令验证(47
4.5AND指令验证(47
4.6LDA、STO、JMP指令验证(47
第五章:
总结(48
参考文献:
(48
第一章:
RISC_CPU概述
1.1课题的由来和设计环境介绍
在本设计课程中,我们通过自己动脑筋,设计出CPU的软核和固核。
这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。
在设计中我们不但关心CPU总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。
因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。
为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真,我们把寻址空间规定为8K(即13位地址线字节。
下面我们就一步一步地来设计这样一个CPU,并进行RTL仿真、经过综合、布局布线后,再次进行一次仿真,从中我们可以体会到这种设计方法的潜力。
次课程设计中的VerilogHDL程序都为我们学习目的而编写的,全部程序在CADENCE公司的NC-Verilog环境、SynopsysVCS、Mentor公司的ModelSim6.1等环境下用Verilog语言进行了仿真。
同时我们分别用Synplify、AlteraQuartusII等工具,针对不同的FPGA进行了综合。
顺利地通过RTL级仿真、综合后门级逻辑网表仿真以及布线后的门级结构电路模型仿真。
这个CPU模型只是一个教学模型,设计也不一定很合理,只是从原理上说明了简单的RISC_CPU是如何构成的。
本次课程设计的内容是想达到以下四个目的:
1学习RISCCPU的基本结构和原理;2了解VerilogHDL仿真和综合工具的潜力;2展示Verilog设计方法对软/硬件联合设计和验证的意义;3学习并掌握一些常用的Verilog语法和验证方法。
作者也希望本章的内容能引起对CPU和复杂数字逻辑系统设计有兴趣的电子工程师们的注意,加入我国集成电路的设计队伍,提高我国电子产品的档次。
1.2什么是CPU
CPU即中央处理单元的英文缩写,它是计算机的核心部件。
计算机进行信息处理可分为两个步骤:
1.将数据和程序(即指令序列输入到计算机的存储器中。
2.从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。
CPU的作用
是协调并控制计算机的各个部件执行程序,使其有条不紊地进行。
因此它必须具有
以下基本功能:
●取指令:
当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此
要发出指令地址及控制信号。
●分析指令:
即指令译码。
是对当前取得的指令进行分析,指出它要求什么操作,
并产生相应的操作命令。
●执行指令:
根据分析指令时产生的操作命令形成相应的操作控制信号序列,通
过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括
对运算结果的处理以及下条指令地址的形成。
将其功能进一步细化,可概括如下:
●能对指令进行译码并执行规定的动作;
●可以进行算术和逻辑运算;
●能与存储器,外设交换数据;
●提供整个系统所需要的控制;
尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。
由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:
●算术逻辑运算部件(ALU,
●累加器,
●程序计数器,
●指令寄存器,译码器,
●时序和控制部件。
RISC即精简指令集计算机(ReducedInstructionSetComputer的缩写。
它是一种八十年代出现的CPU,与一般的CPU相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。
从实现的途径看,RISC_CPU与一般的CPU的不同处在于:
它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。
所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。
RISC_CPU也包括上述这些部件,下面就详细介绍一个简化的用于教学目的的RISC_CPU的可综合VerilogHDL模型的设计和仿真过程。
第二章:
RISC_CPU结构
2.1RISC_CPU整体结构
RISC_CPU是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂。
我们可把它分成八个基本部件来考虑:
1时钟发生器
2指令寄存器
3累加器
4算术逻辑运算单元
5数据控制器
6状态控制器
7程序计数器
8地址多路器
9状态机
各部件的相互连接关系见图17.1。
其中时钟发生器利用外来时钟信号进行分频生成一系列时钟信号,送往其他部件用作时钟信号。
各部件之间的相互操作关系则由状态控制器来控制。
各部件的具体结构和逻辑关系在下面的小节里逐一进行介绍。
2.2时钟发生器
2.2.1时钟发生器的介绍
时钟发生器CLK_GEN利用外来时钟信号clk来生成一系列时钟和控制信号:
clk、fetch、alu_ena送往CPU的其他部件。
其中fetch是控制信号,clk的八分频信号,当fetch高电平时,使clk能触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。
clk信号用作指令寄存器、累加器、状态控制器的时钟信号。
alu_ena则用于控制算术逻辑运算单元的操作。
由于在时钟发生器的设计中采用了同步状态机的设计方法,不但使clk_gen模块的源程序可以被各种综合器综合,也使得由其生成的
fetch、alu_ena在同步性能上有明显的提高,为整个系统的性能提高打下了良好的基础。
2.2.2时钟发生器symbol
2.2.3时钟发生器RTL
2.2.4时钟发生器源代码
`timescale1ns/1ns
moduleCLK_GEN(clk,reset,fetch,alu_ena,clk1;inputclk;
inputreset;
outputfetch,alu_ena,clk1;
regfetch,alu_ena;
reg[7:
0]state;
assignclk1=clk;
parameter
s1=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@(posedgeclkornegedgereset
if(~reset
begin
fetch<=0;
alu_ena<=0;
state<=idle;
end
else
begin
case(state
s1:
beginalu_ena<=1;state<=s2;end
s2:
beginalu_ena<=0;state<=s3;end
s3:
beginfetch<=1;state<=s4;end
s4:
beginstate<=s5;end
s5:
beginstate<=s6;end
s6:
beginstate<=s7;end
s7:
beginfetch<=0;state<=s8;end
s8:
beginstate<=s1;end
idle:
state<=s1;
default:
state<=idle;
endcase
end
endmodule
2.2.5时钟发生器测试代码
`timescale1ns/1ns
moduleTB(;
regclk;
regreset;
wirefetch;
wirealu_ena;
wireclk1;
CLK_GENu1(.clk(clk,.reset(reset,.fetch(fetch,.alu_ena(alu_ena,.clk1(clk1;
initial
begin
clk<=0;
reset<=0;
end
always
begin
#50clk<=~clk;
#400reset<=1;
end
endmodule
2.2.6时钟发生器仿真波形
2.3指令寄存器
2.3.1指令寄存器介绍
指令寄存器,顾名思义,指令寄存器用于寄存指令。
指令寄存器的触发时钟是clk,在clk的正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中。
但并不是每个clk的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。
什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。
load_ir信号通过ena口输入到指令寄存器。
复位后,指令寄存器被清为零。
每条指令为2个字节,即16位。
高3位是操作码,低13位是地址。
(CPU的地址总线为13位,寻址空间为8K字节。
本设计的数据总线为8位,所以每条指令需取两次。
先取高8位,后取低8位。
而当前取的是高8位还是低8位,由变量state记录。
state为零表示取的高8位,存入高8位寄存器,同时将变量state置为1。
下次再寄存时,由于state为1,可知取的是低8位,存入低8位寄存器中。
2.3.2指令寄存器symbol
2.3.3指令寄存器RTL
2.3.4指令寄存器源代码
`timescale1ns/1ns
moduleREGISTER(opcode,ir_addr,data,ena,clk,rst;output[2:
0]opcode;
output[12:
0]ir_addr;
input[7:
0]data;
inputena,clk,rst;
reg[15:
0]opc_iraddr;
regstate;
assign{opcode,ir_addr}=opc_iraddr;
always@(posedgeclkornegedgerst
begin
if(~rst
opc_iraddr<=16'b0000_0000_0000_0000;
state<=1'b0;
end
else
begin
if(ena
begin
casex(state
1'b0:
begin
opc_iraddr[15:
8]<=data;
state<=1;
end
1'b1:
begin
opc_iraddr[7:
0]<=data;
state<=0;
end
default:
begin
opc_iraddr[15:
0]<=16'b0000000000000000;
state<=1'b0;
end
endcase
end
else
state<=1'b0;
end
end
endmodule
2.3.5指令寄存器测试代码
REGISTERu1(.data(data,.ena(ena,.clk(clk,.rst(rst,.opcode(opcode,.ir_addr(ir_addr;
initial
begin
ena<=1'b1;
clk<=1'b0;
rst<=1'b0;
data<=8'b11111100;
end
begin
#200rst<=1'b1;
#50clk<=~clk;
end
endmodule
2.3.6指令寄存器仿真波形
2.4累加器
2.4.1累加器介绍
累加器用于存放当前的结果,它也是双目运算其中一个数据来源。
复位后,累加器的值是零。
当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk时钟正跳沿时就收到来自于数据总线的数据。
2.4.2累加器symbol
2.4.3累加器RTL
2.4.4累加器源代码
moduleACCUM(accum,data,ena,clk,rst;input[7:
0]data;
inputena,clk,rst;
outputreg[7:
0]accum;
always@(posedgeclkornegedgerstbegin
if(~rst
accum<=8'b00000000;
else
if(ena
accum<=data;
end
endmodule
2.4.5累加器仿真代码
`timescale1ns/1ns
moduleTB(;
wire[7:
0]accum;
reg[7:
0]data;
regclk;
regena;
regrst;
ACCUMu1(.accum(accum,.data(data,.clk(clk,.ena(ena,.rst(rst;
initial
begin
clk<=1'b0;
ena<=1'b0;
rst<=1'b0;
data<=8'b00000000;
#400rst<=1'b1;
#400ena<=1'b1;
#800data<=8'b00000011;
#800data<=8'b00001100;
#800data<=8'b00110000;
#800data<=8'b01000000;
#800data<=8'b10000000;
#800data<=8'b00001000;
#800data<=8'b00100000;
end
always
begin
#50clk<=~clk;
end
endmodule
2.4.6累加器仿真波形
2.5算术运算器
2.5.1算术运算器介绍
算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算。
利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。
2.5.2算术运算器symbol
`timescale1ns/1ns
modulealu(alu_out,zero,data,accum,alu_ena,opcode,clk;output[7:
0]alu_out;
outputzero;
input[7:
0]data,accum;
input[2:
0]opcode;
inputalu_ena,clk;
reg[7:
0]alu_out;
parameterHLT=3'b000,
SKZ=3'b001,
ADD=3'b010,
ANDD=3'b011,
XORR=3'b100,
LDA=3'b101,
STO=3'b110,
JMP=3'b111;
assignzero=!
accum;
always@(posedgeclkornegedgealu_ena
if(~alu_ena
begin
casex(opcode
HLT:
alu_out<=accum;
SKZ:
alu_out<=accum;
ADD:
alu_out<=data+accum;
ANDD:
alu_out<=data&accum;
XORR:
alu_out<=data^accum;
LDA:
alu_out<=data;
STO:
alu_out<=accum;
JMP:
alu_out<=accum;
default:
alu_out<=8'bxxxx_xxxx;
endcase
end
endmodule
`timescale1ns/1ns
moduleTB(;
regclk;
reg[7:
0]data;
reg[7:
0]accum;
reg[2:
0]opcode;
regalu_ena;
wire[7:
0]alu_out;
wirezero;
aluu1(.alu_out(alu_out,
.zero(zero,
.data(data,
.accum(accum,
.alu_ena(alu_ena,
.opcode(opcode,
.clk(clk;
initial
begin
clk<=1'b0;
alu_ena<=1'b0;
data<=8'b0010_1100;
accum<=8'b0101_1001;opcode<=3'b000;
#200opcode<=3'b000;#200opcode<=3'b001;#200opcode<=3'b010;#200opcode<=3'b011;#200opcode<=3'b100;#200opcode<=3'b101;#200opcode<=3'b110;#200opcode<=3'b111;end
always
#50clk<=~clk;
Endmodule
2.6数据控制器
2.6.1数据控制器介绍
数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。
有时要传输指令,有时要传送RAM区或接口的数据。
累加器的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。
所以任何部件往总线上输出数据时,都需要一控制信号。
而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。
数据控制器何时输出累加器的数据则由状态控制器输出的控制信号datactl_ena决定。
2.6.2数据控制器smybol
2.6.3数据控制器RTL
2.6.4数据控制器源代码
moduledatactl(data,in,data_ena;output[7:
0]data;
input[7:
0]in;
inputdata_ena;
assigndata=(data_ena?
in:
8'bzzzz_zzzz;endmodule
2.6.5数据控制器测试代码
`timescale1ns/1ns
moduleTB(;
regdata_ena;
reg[7:
0]in;
wire[7:
0]data;
datactlu1(.data_ena(data_ena,.in(in,.data(data;
initial
begin
data_ena<=1'b0;
in<=8'b0000_0000;
#100data_ena<=1'b1;
#200in<=8'b0100_1100;
#200in<=8'b0011_0101;
#200in<=8'b1000_0100;
#200data_ena<=1'b0;
#200data_ena<=1'b1;
#200in<=8'b0011_0101;
#200in<=8'b1000_0100;
end
endmodule
2.6.6数据控制器仿真波形
2.7地址多路器
2.7.1地址多路器介绍
地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog 数字 系统 设计 课程设计 报告 图文