Verilog课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.实验目的
(1)学习RISC_CPU的基本结构和原理;
(2)了解Verilog HDL仿真和综合工具的潜力;
(3)展示Verilog设计方法对软/硬件联合设计和验证的意义;
(4)学习并掌握一些常用的Verilog语法和验证方法。
二.实验原理
CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤:
(1)将数据和程序(即指令序列)输入计算机的存储器中。
(2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件并执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能。
①取指令——当程序忆在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。
②分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。
③执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。
将CPU的功能进一步细化,可概括如下:
(1)能对指令进行译码并执行规定的动作;
(2)可以进行算术和逻辑运算;
(3)能与存储器和外设交换数据;
(4)提供整个系统所需要的控制。
尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:(1)算术逻辑运算部件(ALU);
(2)累加器;
(3)程序计数器;
(4)指令寄存器和译码器;
(5)时序和控制部件。
三.实验内容
通过我们自己动手,设计出一个CPU的软核和固核。这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。在设计中我们不但关心CPU总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真,把寻址空间规定为8K(即13们地址线)字节。
四.实验代码
1.源代码
//----------------------------------clk_gen.v------------------------------
`timescale 1ns/1ns //时间单位1ns,时间单位1ns
module clk_gen(clk,reset,fetch,alu_ena); //模块名clk_gen,参数列表(clk,reset,fetch,alu_ena)input clk,reset; //输入clk,reset
output fetch,alu_ena; //输出fetch,alu_ena
wire clk,reset; //wire型变量clk,reset
reg fetch,alu_ena; //reg寄存器型变量fetch,alu_ena
reg[7:0]state; //reg寄存器型变量8位的state
parameter
S1=8'b00000001,S2=8'b00000010,S3=8'b00000100,S4=8'b00001000,S5=8'b00010000,S6=8'b001 00000,S7=8'b01000000,S8=8'b10000000,idle=8'b00000000;
//参数型定义8位二进制常量s1,s2,s3,s4,s5,s6,s7,s8,idle
always@(posedge clk) //always块时钟触发
if(reset) //如果reset为真
begin //执行begin,and顺序块
fetch<=0; //fetch非阻塞赋值赋为0
alu_ena<=0; //alu_ena非阻塞赋值赋为0
state<=idle; //idle非阻塞赋值给state
end
else //reset为假执行下面begin语句
begin
case(state) //case表达式(state)
S1:begin
alu_ena<=1; //alu_ena非阻塞赋值赋为1
state<=S2; //state非阻塞赋值赋为S2
end
S2:begin
alu_ena<=0; //alu_ena非阻塞赋值赋为0
state<=S3; //state非阻塞赋值赋为S3
end
alu_ena<=1; //alu_ena非阻塞赋值赋为1
state<=S4; //state非阻塞赋值赋为S4
end
S4:begin
state<=S5; //state非阻塞赋值赋为S5
end
S5:state<=S6; //state非阻塞赋值赋为S6
S6:state<=S7; //state非阻塞赋值赋为S7
S7:begin
fetch<=0; //fetch非阻塞赋值赋为0
state<=S8; //state非阻塞赋值赋为S8
end
S8:begin
state<=S1; //state非阻塞赋值赋为S1
end
idle:state<=S1; //idle_state非阻塞赋值赋为S1
default:state<=idle; //default_state非阻塞赋值赋为idle
endcase
end
endmodule //结束module模块
//----------------------------register.v-----------------------------
`timescale 1ns/1ns //时间单位1ns,时间精度1ns
module register(opc_iraddr,data,ena,clk,rst); //模块名register参数链表(变量名)output[15:0] opc_iraddr; //输出16位的opc_iraddr
input[7:0]data; //输入8位的data
input ena,clk,rst; //输入ena,clk,rst
reg[15:0]opc_iraddr; //定义16位的寄存器型变量opc_iraddr
reg state; //定义寄存器型变量state
always@(posedge clk) //always时钟触发
begin
if(rst) //判断rst是否为真
begin
opc_iraddr<=16'b0000_0000_0000_0000; //opc_iraddr非阻塞赋值赋为16位的二进制数
state<=1'b0; //state非阻塞赋值赋为1位的二进制数
end
else
begin
if(ena) //如果加载指令寄存器信号load_ir
begin //分两个时钟,每次8位加载指令寄存器
casex(state) //先高字节后低字节