硬件描述语言Verilog HDL设计进阶之:使用函数实现简单的处理器
4.8典型实例8:使用函数实现简单的处理器4.8.1实例的内容及目标
1.实例内容
本实例使用Verilog HDL设计一个简单8位处理器,可以实现两个8位操作数的4种操作。在设计过程中,使用了函数调用的设计方法。
2.实例目标
通过本实例,读者应达到下面的一些目的。
·掌握使用Verilog函数设计的方法。
·掌握Verilog设计的一般方法。
4.8.2原理简介
处理器发展到现在,已经变成一个功能极其强大,设计也极为复杂的单元。现在一颗小小的CPU的运算能力远远的超过了以前的超级计算机的能力。虽然处理器处理能力的提高和很多方面的因素有关,可是处理器最终要完成的目标还是早期CPU设计时的那个目标,那就是使用操作码实现对操作数的控制和计算。
在本实例中,实现的处理器是一个8位处理器,只实现简单的4种操作:相加、相减、操作数减1和操作数加1。通过这4种操作向读者展示如何使用Verilog语言设计看似复杂的CPU单元。
当然,这个处理器只是一个算术单元,处理器还包括很多其他的功能,在此不进行介绍,感兴趣的读者可以查阅相关的书籍,按照本实例提供的设计方向补充和完善这个处理器。
4.8.3代码分析
下面给出这个处理器的Verilog源代码,读者可以将此处理器模块实例化至自己的工程设计中。
module mpc(instr,out);
//端口说明
input[17:0] instr; //输入指令
output[8:0] out; //输出结果
//内部信号说明
reg[8:0] out;
reg func; //指令中提取出的操作码的内部变量
reg[7:0] op1,op2; //从指令中提取的两个操作数
//函数声明
function[16:0] code_add;//函数的定义,返回一个17位的指令
input[17:0] instr; //函数的输入,采用与模块输入同样的命名,可不同
//函数内部信号说明
reg add_func; //函数内部的操作码变量
reg[2:0] code; //操作码
reg[7:0] opr1,opr2; //两个操作数
begin
code=instr[17:16]; //输入指令instr的高2位为操作码code
opr1=instr[7:0]; //输入指令instr的低8位为操作数opr1
//通过case语句判断操作码的类型,获得操作数opr2
case(code)
2'b00: begin
add_func=1;
opr2=instr[15:8]; //从instr中取第二个操作数
end
2'b01: begin
add_func=0;
opr2=instr[15:8]; //从instr中取第二个操作数
end
2'b10: begin
add_func=1;
opr2=8'd1; //第二个操作数取为1,实现+1操作
end
2'b11: begin
add_func=0;
opr2=8'd1; //实现-1操作
end
endcase
code_add={add_func,opr2,opr1}; //函数的返回值
end
endfunction
//函数调用模块
always @(instr) begin
{func,op2,op1}=code_add(instr); //调用函数
if(func==1)
out=op1+op2; //实现两数相加或操作数1加1操作
else
out=op1-op2; //实现两数相减或操作数1减1操作
end
endmodule
页:
[1]