数字电路 多功能ALU设计实验

Posted Ice丨shine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字电路 多功能ALU设计实验相关的知识,希望对你有一定的参考价值。

本实验要求设计一个具有8种运算功能的32位ALU,并能够产生运算结果的表示:结果为零标志ZF(Zero Flag)、进借位标志位CF()溢出标志OF(Overflow Flag)、符号位标志SF(Sign Flag)和奇偶标志PF(Parity Flag),标志位值解释见代码。ALU通过4根控制线ALU_OP[2:0]来选择其8种功能,功能见表所示,多余的8位用于后继运算的拓展备用。
图中ALU_OP应该是三位,忽略最左侧的0

程序代码

module ALU(
    input [31:0]A,
    input [31:0]B,
    output reg [31:0]F,
    output reg ZF,
    output reg OF,
	 output reg SF,//符号标志
	 output reg PF,//奇偶标志
	 output reg CF,//进位/借位标志
    input [2:0]ALU_OP
    );
	 always @(*)
		begin
			OF=0;
			CF=0;
			case(ALU_OP)
				3'b000://按位与
					begin 
						F=A&B;
					end
				3'b001:F=A|B;//按位或
				3'b010:F=A^B;//按位异或
				3'b011://按位或非
					begin
						F=A|B;
						F=~F;
					end
				3'b100://算术加
					begin
						CF,F=A+B;
						OF=F[31]^CF;
					end
				3'b101://算术减
					begin
						CF,F=A-B;
						OF=F[31]^CF;
						CF=~CF;
					end
				3'b110://比较,A<B时出1,其他出0
					begin
						if(A<B) F=1;
						else F=0;
					end
				3'b111:F=B<<A;//B逻辑左移A所指定的位数
			endcase
		end
	
	 always @(*)
		begin
			if(F==0) ZF=1;
			else ZF=0;
		end
	always @(*)
		begin
			SF=F[31];
			if(^F==0) PF=1;
			else PF=0;
		end
		
endmodule

测试代码

module ALU_test;

	// Inputs
	reg [31:0] A;
	reg [31:0] B;
	reg [2:0] ALU_OP;

	// Outputs
	wire [31:0] F;
	wire ZF;
	wire OF;
	wire SF;
	wire PF;
	wire CF;

	// Instantiate the Unit Under Test (UUT)
	ALU uut (
		.A(A), 
		.B(B), 
		.F(F), 
		.ZF(ZF), 
		.OF(OF), 
		.SF(SF), 
		.PF(PF), 
		.CF(CF), 
		.ALU_OP(ALU_OP)
	);

	initial begin
		// Initialize Inputs
		A = 0;
		B = 0;
		ALU_OP = 0;

		// Wait 100 ns for global reset to finish
		#10 A = 32'h0000_0010;B = 32'h0000_0011;ALU_OP = 3'b000;//按位与
		#10 A = 32'h0000_0003;B = 32'h0000_0607;ALU_OP = 3'b001;//按位或
		#10 A = 32'h8000_0000;B = 32'h8000_0001;ALU_OP = 3'b010;//按位异或
		#10 A = 32'h7FFF_FFFF;B = 32'h7FFF_FFF1;ALU_OP = 3'b011;//按位或非
		#10 A = 32'h3FFF_FFFF;B = 32'hFFFF_FFFF;ALU_OP = 3'b100;//算术加,有溢出
		#10 A = 32'h0000_1010;B = 32'h0000_0001;ALU_OP = 3'b100;//算术加,无溢出
		#10 A = 32'h8000_0000;B = 32'hFFFF_FFFF;ALU_OP = 3'b101;//算术减
		#10 A = 32'hFFFF_FFFF;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,A大
		#10 A = 32'h8000_0000;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,相等
		#10 A = 32'h0000_0001;B = 32'h8000_0000;ALU_OP = 3'b110;//比较,A小
		#10 A = 32'h1234_5678;B = 32'h3333_2222;ALU_OP = 3'b111;//B逻辑左移A位,全0
		#10 A = 32'h0000_0001;B = 32'h3333_2222;ALU_OP = 3'b111;//B逻辑左移A位
	 
		// Add stimulus here

	end
      
endmodule

仿真波形请各位自行设计实验项进行实验,这里就不放图了
软件采用ISE14.7

以上是关于数字电路 多功能ALU设计实验的主要内容,如果未能解决你的问题,请参考以下文章

数字电路实验(05)二进制计数器设计

计算机组成原理运算器组成实验

计算机组成原理 寄存器堆设计实验(加上与ALU连接)

计算机组成原理 寄存器堆设计实验(加上与ALU连接)

数电实验 数字电子钟设计 基于quartus 实现计时校时闹钟秒表稍复杂音频 分享电路图设计以及工程文件

急!!!用运算放大器设计一个方波、正弦波、三角波的信号发生器