Verilog课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) //先高字节后低字节

相关文档
最新文档