1. 使用 Verilog 完成 ALU 的设计,并编写测试仿真文件验证其正确性。要求: ALU 支持 16 位的加、减、与、或以及移位运算。
module ALU(a,b,op,y);
input[15:0]a,b;
input[3:0]op;
output y;
reg[15:0]y;
always@(*)begin
case(op)
//算术运算
4'd0: y = a + b;
4'd1: y = a - b;
4'd2: y = a * b;
4'd3: y = a / b;
4'd4: y = a % b; //求余
//位运算
4'd5: y = a & b; //与
4'd6: y = a | b; //或
4'd7: y = ~a; //非
4'd8: y = a ^ b; //异或
4'd9: y = a ~^ b; //同或
4'd10: y = ~(a & b);//与非
4'd11: y = ~(a | b);//或非
//移位运算
4'd12: y = a >> b;//算术右移
4'd15: y = 0;
endcase
end
endmodule
module test(
);
reg[15:0] a,b;
reg[3:0] op;
wire[15:0] y;
ALU f(.a(a),.b(b),.op(op),.y(y));
initial begin
a = 21;b = 16;op = 0;
#170 $stop;
end
always begin
#10 a = a + 2;
b = b-1;
op = op+1;
end
endmodule
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210602150309146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODE4MDAyOQ==,size_16,color_FFFFFF,t_70)
2. 使用 Verilog 完成通用寄存器堆的设计,并编写测试仿真文件验证其正确性。
要求 寄存器堆包含 8 个 16 位的寄存器; 寄存器堆有两个读端口和一个写端口。
设计一个8*16位的寄存器堆,即含有8个寄存器,每个寄存器16位。该寄存器堆有2个读端口、1个写端口,即能够同时读出2个寄存器的值,写入1个寄存器。读操作不需要时钟控制,写操作需要在上跳沿才能写入。
module RegFile(clk,WE,RA,RB,RW,busA,busB,busW);
input clk,WE;
//相当于地址,用来决定读或写的寄存器
input[2:0] RA,RB,RW;
input[15:0] busW;//要写入寄存器堆的内容
output[15:0] busA,busB;//从寄存器堆读出的内容
reg[15:0] regfile[7:0];//寄存器堆
integer i;
initial begin // 初始化寄存器堆
for(i=0;i |