Expérience de composition d'ordinateur Hangdian 3 (3) Expérience de conception d'ALU multifonctionnel

Contenu de l'expérience

1. Apprenez le principe de fonctionnement de l'ALU multifonctionnel et maîtrisez la méthode de conception de l'unité arithmétique
2. Maîtrisez les compétences et les méthodes d'utilisation de Verilog HDL pour la description et la modélisation du comportement

Solution

1. Analysez une ALU 32 bits avec 8 types de fonctions arithmétiques et peut produire les indicateurs des résultats de l'opération: indicateur de bit de résultat zéro (ZF) et indicateur de débordement (OF)
2. Tout d'abord, analysez que ZF n'apparaîtra que dans les opérations d'addition et de soustraction Situation de débordement, puis analysez comment exprimer les 8 calculs ALU, si vous utilisez "-", vous n'avez pas besoin de considérer comment soustraire

3. Affichage du code:

module de niveau supérieur:

module ALU(AB_SW,ALU_OP,F_LED_SW,LED);
input[2:0]AB_SW,ALU_OP,F_LED_SW;
output[7:0]LED;
wire [31:0]A,B,F;
wire ZF,OF;
Third_experiment_second T2(AB_SW,A,B); 
Third_experiment_first T1(OF,ZF,ALU_OP,A,B,F); 
Third_experiment_third T3(F_LED_SW,LED,F,ZF,OF);

endmodule

Module Third_experiment_second (comme entrée de données)

module Third_experiment_second(AB_SW,A,B);
input[2:0]AB_SW;
output reg[31:0]A,B;
always @(*)
	begin
		case(AB_SW)
		3'b000:begin A=32'h0000_0000;B=32'h0000_0000;end
		3'b001:begin A=32'h0000_0003;B=32'h0000_0607;end
		3'b010:begin A=32'h8000_0000;B=32'h8000_0000;end
		3'b011:begin A=32'h7FFF_FFFF;B=32'h7FFF_FFFF;end
		3'b100:begin A=32'hFFFF_FFFF;B=32'hFFFF_FFFF;end
		3'b101:begin A=32'h8000_0000;B=32'hFFFF_FFFF;end
		3'b110:begin A=32'hFFFF_FFFF;B=32'h8000_0000;end
		3'b111:begin A=32'h1234_5678;B=32'h3333_2222;end
		default:begin A=32'h9ABC_DEF0;B=32'h1111_2222;end
		endcase
	end
endmodule 

Module Third_experiment_first (opération)

module Third_experiment_first(OF,ZF,ALU_OP,A,B,F);
input [2:0]ALU_OP;
input [31:0]A,B;
output reg[31:0]F;
reg C32;
output reg OF=0;
output reg ZF=0;
always @(ALU_OP or A or B)
 begin
	case(ALU_OP)
			 3'b000:F<=A&B;
			 3'b001:F<=A|B;
			 3'b010:F<=A^B;
			 3'b011:F<=A~^B;
			 3'b100:{
    
    C32,F}<=A+B;
			 3'b101:{
    
    C32,F}<=A-B;
			 3'b110:begin if(A<B)  F<=32'h0000_0001;else F<=32'h0000_0000;end
			 3'b111:begin F<=B<<A;end
	endcase
	if(F==32'h0000_0000)	
			ZF<=1;
	else
			ZF<=0;
	OF=C32^F[31]^A[31]^B[31];	
	end
endmodule

Module Third_experiment_third (comme affichage LED)

module Third_experiment_third(F_LED_SW,LED,F,ZF,OF);
input[31:0]F;
input ZF,OF;
input[2:0] F_LED_SW;
output reg[7:0] LED;
always@(*)
	begin
		case(F_LED_SW)
			3'b000:LED=F[7:0];
			3'b001:LED=F[15:8];
			3'b010:LED=F[23:16];
			3'b011:LED=F[31:24];
			default:begin LED[7]=ZF;LED[0]=OF;LED[6:1]=6'b0;end
		endcase
	end

endmodule

Module de test

module ALU_TEST;
	// Inputs
	reg [2:0] AB_SW;
	reg [2:0] ALU_OP;
	reg [2:0] F_LED_SW;
	// Outputs
	wire [7:0] LED;
	ALU uut (
		.AB_SW(AB_SW), 
		.ALU_OP(ALU_OP), 
		.F_LED_SW(F_LED_SW), 
		.LED(LED)
	);
	initial begin
		AB_SW = 3'b001;
		ALU_OP = 3'b000;
		F_LED_SW = 3'b000;
		#100;
     	AB_SW = 3'b001;
		ALU_OP = 3'b001;
		F_LED_SW = 3'b000;
		#100;
      	AB_SW = 3'b001;
		ALU_OP = 3'b010;
		F_LED_SW = 3'b000;
	end   
endmodule

Faites attention

Quand je faisais une expérience, des amis m'ont demandé à quoi sert begin ... end, ce qui équivaut en fait aux accolades en langage C

Je suppose que tu aimes

Origine blog.csdn.net/DoMoreSpeakLess/article/details/111476509
conseillé
Classement