算术逻辑单元_verilog代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5 实验5
5.1 实验内容
题目:使用case语句设计八功能的算术运算单元(ALU),其输入信号a和b均为4位,输入功能选择信号select为3位,输出信号out为5位。算术运算单元ALU所执行的操作与select信号有关,其关系如下:
要求:验证仿真波形
5.2 实验步骤
1.系统设计
题目要求设计简单的算术逻辑单元,该电路通过对指令的判断,对输入数据执行相应的操作,这是一个较为复杂的组合逻辑电路,若用assign语句描述,表达起来非常复杂。故磁体我们使用了电平敏感的always块,并且运用了case结构来进行分支判断,不但设计思想得到了直观地体现,而且代码看起来整齐有序,便于理解
2.重要源代码及注释
module alu(
input [3:0] a,
input [3:0] b,
input [2:0] sel,
output [4:0] out
);
reg [4:0] out;
always@(a or b or sel)
begin
case(sel)
3'b000 : out = a;
3'b001 : out = a + b;
3'b010 : out = a - b;
3'b011 : out = a / b;
3'b100 : out = a % b;
3'b101 : out = a * b;
3'b110 : out = a << b;
3'b111 : out = a >> b;
default: out = 5'bx;
endcase
end
endmodule
5.3 结果分析
1.Testbench代码
module test( );
reg[3:0] a,b;
reg[2:0] sel;
wire[4:0] out;
alu f1(.a(a),.b(b),.sel(sel),.out(out));
initial
begin
a=4'b0000;b=4'b0000;sel=3'b0000;
end
always
fork
#10 sel= 3'b000 ;
#20 sel= 3'b001;
#30 sel= 3'b010 ;
#40 sel= 3'b011 ;
#50 sel= 3'b100 ;
#60 sel= 3'b101;
#70 sel= 3'b110 ;
#80 sel= 3'b111 ;
#10 a=4'b0110;
#20 a=4'b0100;
#15 b=4'b0001;
#30 b=4'b0010;
join
endmodule
2.仿真波形图
3.说明
0~10ns : sel=0 : out=a=0;
10~20ns : sel=0 : out=a=6;
20~30ns : sel=1: out=a+b=5;
30~40ns : sel=2 : out=a-b=2;
40~50ns : sel=3 : out=a/b=2;
50~60ns : sel=4 : out=a%b=0;
60~70ns : sel=5 : out=a*b=8;
70~80ns : sel=6 : out=a<
80~90ns : sel=6 : out=a>>b=1;
out定义的是5位2进制数,只能表示0~31,因此当a*b>31时,out溢出,显示值不正常