计算机组成原理实验十六位运算器ALU16完整代码引脚锁定
Verilog HDL代码
input A
module inputA(p,x,A);
input [1:0]p;
input [15:0]x;
output reg [16:0]A;
always @ (x,p)
begin
if(p == 2'b11) A={x[15],x[15:0]};
end
endmodule
input B
module inputB(p,x,B);
input [1:0]p;
input [15:0]x;
output reg [16:0]B;//17位
always @ (x,p)
begin
if(p == 2'b10) B={x[15],x[15:0]};
end
endmodule
input ABs
module inputABs(p,x,A,B,s,M,Ci);//输入A B
parameter bit_width=16;
input [1:0]p;
output M;
input [bit_width-1:0]x;//输入16位的x
output [bit_width:0]A,B;//定义17位的A,B 用来输入A,B
output [2:0]s;
output Ci;
reg [bit_width:0]A,B;
reg [2:0]s;
reg M,Ci;
always @ (p,x,A,B,s,Ci)
case (p)
2'b01:begin s[2:0] = x[2:0]; M=x[3];Ci=x[4];end//输入 Ci M s
2'b11: A= {x[15],x};//输入A A为17位 采用双符号位
2'b10: B = {x[15],x};//输入B
endcase
endmodule
input Ms
module inputMs(p,x,M,s,Ci);
input [1:0]p;
input [15:0]x;
output reg [2:0]s;
output reg M,Ci;
always @ (x,p)
begin
if(p == 2'b01) begin s<=x[2:0];M=x[3];Ci=x[4];end
end
endmodule
alu_18
module alu_16(S,A,B,F,M,CO,OV,Z,Ci,N);
//Cn Co进位 Ci来自低位的进位 OV溢出 N符号位 Z:0标志
parameter bit_width=16; //定义bit_width为16
input M,Ci;
input [2:0] S;//s是三位的
input [bit_width:0]A,B;//A,B为17位;双符号位判断是否溢出
output N,Z;
output [bit_width:0]F;//F输出17位;双符号位判断是否溢出
output CO,OV; // CO进位;OV判溢出
reg [bit_width:0]F;
reg CO,OV;
reg N,Z;
always @(S)
begin
case(S)
3'b000 :begin
if(M){CO,F}=A+B+Ci; //A B相加;Ci低位向高位的进位
else {CO,F}=A-B+Ci; // A B相减
OV=F[bit_width-1]^F[bit_width];//双符号位 第16位与第17位异或 判断是否溢出
N=F[16];// N为符号位
Z=~|F;// 判断F是否为0
end
3'b001:begin
if(M){CO,F}=A+1; //A+1
else {CO,F}=B+1; //B+1
OV=F[bit_width-1]^F[bit_width];
N=F[bit_width];
Z=~|F;
end
3'b010:begin
if(M) begin F=A&B;end // A&B 对于逻辑运算不考虑符号进位溢出
else begin F=A|B;end //A|B
Z=~|F;
end
3'b011:begin
if(M)begin F=~A;end//#A
else begin F=~B;end//#B
Z=~|F;
end
3'b100:begin
if(M) begin F={A[bit_width-2:0],1'b0};end//A逻辑左移
else begin F={B[bit_width-2:0],1'b0};end //B逻辑左移
Z=~|F;
end
3'b101:begin
if(M) begin F={1'b0,A[bit_width-1:1]};end //A逻辑右移
else begi