📄 alu.v
字号:
//**************************************************
//** Revision : 0.1
//** File name : ALU.v
//** Module name : ALU
//** Discription : 本文件描述了算术逻辑部件,此部件有功能
//** Simulator : Max+plus II
//** Synthesizer : Max+plus II
//** Author : IamFree
//** Last modify : @ 2006///
//** Create date : 2006/03/08
//**************************************************
module ALU(ALU_O,ALU_Co,ALU_P,ALU_Z,ALU_Ci,ALU_Op,ALU_A,ALU_B);
//Parameter define
parameter width=8;
//ALU opcode define
parameter ALU_ADD=5'b00001;
parameter ALU_SUB=5'b00010;
parameter ALU_AND=5'b00011;
parameter ALU_OR =5'b00100;
parameter ALU_XOR=5'b00101;
parameter ALU_SHL=5'b00110;
parameter ALU_SHR=5'b00111;
parameter ALU_NOT=5'b01000;
parameter ALU_TA =5'b01001;
parameter ALU_TB =5'b01010;
//Port define
output [width-1:0] ALU_O;
output ALU_Co;
output ALU_P;
output ALU_Z;
input ALU_Ci;
input [4:0] ALU_Op;
input [width-1:0] ALU_A;
input [width-1:0] ALU_B;
//Port Type
reg [width-1:0] ALU_O;
reg ALU_Co;
//Body
always @(ALU_A or ALU_B or ALU_Ci or ALU_Op)
begin
//避免生成不可预知的锁存器
ALU_Co=1'b0;
ALU_O=8'b0000_0000;
case(ALU_Op)
ALU_ADD: begin {ALU_Co,ALU_O}=ALU_A+ALU_B+ALU_Ci ;end //带进位加法
ALU_SUB: begin {ALU_Co,ALU_O}=ALU_A-ALU_B-ALU_Ci ;end //带借位减法
ALU_SHL: begin {ALU_Co,ALU_O}={ALU_A,ALU_Ci} ;end //带进位(借位)循环左移一位
ALU_SHR: begin {ALU_O,ALU_Co}={ALU_Ci,ALU_A} ;end //带进位(借位)循环右移一位
ALU_AND: begin {ALU_Co,ALU_O}={ALU_Ci,ALU_A & ALU_B} ;end //按位与,进位不变
ALU_OR : begin {ALU_Co,ALU_O}={ALU_Ci,ALU_A | ALU_B} ;end //按位或,进位不变
ALU_NOT: begin {ALU_Co,ALU_O}={ALU_Ci,~ALU_A} ;end //按位取反,进位不变
ALU_XOR: begin {ALU_Co,ALU_O}={ALU_Ci,ALU_A ^ ALU_B} ;end //按位异或,进位不变
ALU_TA : begin {ALU_Co,ALU_O}={ALU_Ci,ALU_A} ;end //传送A,进位不变
ALU_TB : begin {ALU_Co,ALU_O}={ALU_Ci,ALU_B} ;end //传送B,进位不变
default: begin {ALU_Co,ALU_O}={ALU_Ci,8'b0000_0000} ;end
//如果操作码不正确,则进位不变,结果为0
endcase
end
assign ALU_P=ALU_A[7];
assign ALU_Z=~|ALU_O; //Zero判决
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -