⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alu.v

📁 多周期处理器--verilog写的,欢迎大家来下载
💻 V
字号:
/******************************************Implementation of 32-bit ALU******************************************/module ALU(	//Input and Output Ports	input       clk,          //for multicycle	input		 	 	[31:0]	srca, srcb,			//SrcA(R[rs]), SrcB(R[rt])	input								cin,						//carryin	input				[3:0]		aluctrl,					//ALUControl, ALU control signal	input				[4:0]		shamt,	output reg    [31:0]  aluresult,					//shift amount	output	reg	[31:0]	aluout,				//ALUResult(R[rd]), ALU output	output	reg 	cout, ov, zero, sign			//flags);assign cin=0;/******************Add task. 完整超前进位加法器******************/task add;		reg		[32:0]	shiftedcarry;	//temp	reg		[31:0]	carrychain;	integer				k;	reg		[31:0]	g;	reg		[31:0]	p;	begin		g = srca & srcb;		p = srca ^ srcb;      		begin: carry_generation		integer			k;		carrychain[0] = g[0] + (p[0] & cin);		for (k = 1; k <= 31; k = k+1)			begin				carrychain[k] = g[k] | (p[k] & carrychain[k-1]);			end		end		shiftedcarry = {carrychain, cin};    	aluout = p ^ shiftedcarry;		cout = shiftedcarry[32];   endendtask/******************Subtract task. The same implementation as "Add task" but with changed operants.******************/task sub;			reg		[32:0]	shiftedcarry;	//temp	reg   	[31:0] 	rsrcb;					//Temp for srcb, otherwise syntax errors may occur.	reg		[31:0]	carrychain;	integer				k;	reg		[31:0]	g;	reg		[31:0]	p;	begin		rsrcb = ~srcb + 1;		g = srca & rsrcb;		p = srca ^ rsrcb;		begin: carry_generation		integer			k;		carrychain[0] = g[0] + (p[0] & cin);		for (k = 1; k <= 31; k = k+1)			begin				carrychain[k] = g[k] | (p[k] & carrychain[k-1]);			end		end		shiftedcarry = {carrychain, cin};    	aluout = p ^ shiftedcarry;		cout = shiftedcarry[32];	endendtask/******************Main ALU Operations******************/	always @ (*)	begin	    $display("alu<<<<<<<<srca=%b,srcb=%b>>>>>>>>>",srca,srcb);	//Switching of ALU operations		case (aluctrl)			4'b0010: add();		//"+", add			4'b0110: sub();		//"-", subtract			//4'b0111: //"×", multiply			//4'b1000: //"÷", divide			4'b0000: aluout = srca & srcb;					//"AND", and			4'b0001: aluout =srca | srcb;					//"OR", or			4'b0101: aluout = ~(srca | srcb);				//"NOR", nor, 或非运算,可以当做非运算来使用,只要两个操作数取相同值即可			4'b1011: aluout = srca ^ srcb;					//"XOR", xor, 异或运算			4'b0011: aluout = srcb << shamt;				//"<<", shift left logical			4'b0100: aluout = srcb >> shamt;				//">>", shift right logical				4'b1001: aluout = (srca < srcb) ? 1 : 0;	//"小于置1-1", Set Less Than			//4'b1010: aluout = ????;							//"小于置1-2", Set Less Than			4'b1101:					//BEQ, 等于置ZERO				begin					sub ();					if (aluout == 0)						zero = 1;				end			4'b1111:					//BNE, 不等于置ZERO				begin					sub ();					if (aluout != 0)						zero = 1;				end		endcase		$display("alu<<<<<<aluout=%b>>>>>>",aluout);   endalways @(negedge clk)   begin   aluresult<=aluout;   $display("alu<<<<<<aluresult=%b>>>>>>",aluresult);   end endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -