verilog ALU加减运算电路

用verilog写一个简单的ALU加减运算电路,能对四位二进制的数据进行处理,功能控制位为M,M为四位,高位到低位分别为M3、M2、M1、M0,四位选择0或1组合起来不同组合对应不同功能,功能表如下:
M3 M2 M1 M0 运算
0 0 0 0 传送X F=X
0 0 0 1 加法F=X+Y
1 0 0 1 带进位加法F=X+Y+Cin
0 1 1 0 减法F=X-Y
1 0 1 0 带借位减法F=X+Y+Cin
0 1 0 0 加一F=X+1
0 0 1 1 减一F=X-1
1 1 0 0 位与F=X&Y
1 1 0 1 位或F=X|Y
1 1 1 1/0 X位非F=~X

ALU加减运算电路核心代码:

//实验逻辑
wire C0;
wire [3:0] A,B,F,MUX,MUX1,MUX2;
wire S,Z,O,C;
assign A = X;
assign B = (Y*M0)|(~Y*M1);
assign C0 = M2|Cin&M3;
assign {C,MUX2} = A+B+C0;  
assign S = MUX2[3];
assign Z = ~|MUX2;
assign O = C&(MUX2[3]&~MUX2[2]|~MUX2[3]&MUX2[2]);
assign MUX = (M0)? X|Y : X&Y;
assign MUX1 = (M1)? ~X : MUX;
assign F = (M3&M2)? MUX1 : MUX2;

完整的工程文件我已经上传到CSDN了,可以去我的主页查看并下载完整的工程文件进行使用
工程内包含文件如下图:
verilog ALU加减运算电路_第1张图片
贴出来的代码是放在选中的文件Virtual_Lab_Top.v中的

WeLab虚拟面板设置图片:
verilog ALU加减运算电路_第2张图片
X、Y输入数据,M3、M2、M1、M0输入控制位,cin输入进位,FLAG表示为零、进位、溢出、符号四个标志(不一定是按写的这个顺序放置的)

写Verilog的一些注意事项:
不能在不同always块内对同一变量进行赋值。定义变量时可以把常量赋值给变量进行初始化,这个可以在always块外进行,而变量赋值给变量要在always块中进行。时序电路用非阻塞赋值“<=”,组合电路用阻塞赋值“=”,不然就不对

你可能感兴趣的:(verilog ALU加减运算电路)