设计一个简单的CPU指令运算器,指令格式如下: 完成的具体功能定义如下: (1) 操作类型1:将操作数1作为一个无符号二进制数,在七段管以十进制显示二进制序列等效值。 (2) 操作类型2:实现操作数3、操作数4之间相加、减、乘的操作,在七段管以十/十六进制进制显示操作数和结果。操作数3和4为BCD码表示的2位十进制数(表示的值为00-99)。 注意: (1) 操作类型2中,减法逻辑中出现负数,则显示“-”,正数可以不显示符号 (2) 操作类型2中,加、减、乘操作数和结果都用十进制显示,可以在七段管上进行循环显示来实现。 (3) 注意操作数3、4以BCD码输入,超过9的BCD码输出处理问题。 (4) 尝试加法运算采用流水线方式实现。注意有效位数。 (5) 如果感觉七段管显示能力弱,可以查询LCD1602的控制模块代码,采用LCD显示。
代码:
- module zhiling(key,x2,x3,Hex0,Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7,x);
- input [7:0] x2,x3;
- input key;
- reg[7:0] x1;
- input [1:0] x;//表示七段管的显示模式
- output reg[6:0] Hex0,Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7;
- reg[11:0] add;
- reg[7:0] sub;
- reg[13:0] mul;
- wire[7:0] n3,n2;
- integer flag;//符号标志位
- //加法变量
- reg cout1,cout2;
- reg [6:0] fh;
- reg [3:0] low,low0,mid,mid0;
- reg [3:0] a1,a2,a3,a4;//乘法各位表达
- reg [3:0] t1,t2,t3;//x1的值
- reg [3:0] s1,s2;
- assign n2=x2[7:4]*10+x2[3:0];
- assign n3=x3[7:4]*10+x3[3:0];
- always@(*)
- begin
- if(key==1)
- begin
- x1=x2;
- t1=x1%4'b1010;
- t2=x1/4'b1010%4'b1010;
- t3=x1/4'b1010/4'b1010;
- end
- end
- //加法,二级流水线方式
- always@(*)
- begin
- {cout1,low0}=x2[3:0]+x3[3:0];
- if(cout1==1) begin low=low0+4'b0110; end
- else if(low0>9&&cout1==0) begin {cout1,low}=low0+4'b0110;end
- else begin low=low0;cout1=0;end
- end
- always@(*)
- begin
- {cout2,mid0}=x2[7:4]+x3[7:4]+cout1;
- if(cout2==1) begin mid=mid0+4'b0110; end
- else if(mid0>9&&cout2==0) begin {cout2,mid}=mid0+4'b0110;end
- else begin mid=mid0;cout2=0;end
- add={cout2,mid,low};
- end
- //减法
- always@(*)
- begin
- flag=0;
- if(n2>=n3) sub=n2-n3;
- else begin flag=1;sub=n3-n2;end
- fh=(flag==1)?7'b0111111:7'b1111111;
- s1=sub%4'b1010;
- s2=sub/4'b1010;
- end
- //乘法
- always@(*)
- begin
- mul=n2*n3;
- a1=mul%4'b1010;
- a2=mul/4'b1010%4'b1010;
- a3=mul/4'b1010/4'b1010%4'b1010;
- a4=mul/4'b1010/4'b1010/4'b1010;
- end
-
- always@(x)
- begin
- case(x)
- 2'b00:begin {Hex2,Hex1,Hex0}={show(t3),show(t2),show(t1)};Hex3=7'b1111111;Hex4=7'b1111111;Hex5=7'b1111111;Hex6=7'b1111111;Hex7=7'b1111111;end
- 2'b01:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
- {Hex2,Hex1,Hex0}={show(add[11:8]),show(add[7:4]),show(add[3:0])};Hex3=7'b1111111; end
- 2'b10:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
- {Hex2,Hex1,Hex0}={fh,show(s2),show(s1)};Hex3=7'b1111111; end
- 2'b11:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
- {Hex3,Hex2,Hex1,Hex0}={show(a4),show(a3),show(a2),show(a1)}; end
- endcase
- end
- function [6:0]show;
- input[3:0] a0;
- reg[6:0] b;
- begin
- case(a0)
- 4'd0:b=7'b1000000;
- 4'd1:b=7'b1111001;
- 4'd2:b=7'b0100100;
- 4'd3:b=7'b0110000;
- 4'd4:b=7'b0011001;
- 4'd5:b=7'b0010010;
- 4'd6:b=7'b0000010;
- 4'd7:b=7'b1111000;
- 4'd8:b=7'b0000000;
- 4'd9:b=7'b0011000;
- default:b=7'b1111111;
- endcase
- show=b;
- end
- endfunction
- endmodule
复制代码乘法: 将ope拨动为”11”,实现两个输入之间相乘的操作,分别用四个拨动开关作为in1,in2输入,输出的十进制数显示在七段管上。
加法: 将ope拨动为”01”,实现两个输入之间相加的操作,分别用四个拨动开关作为in1,in2输入,输出的十进制数显示在七段管上。
减法: 将ope拨动为”10”,实现两个输入之间相减的操作,分别用四个拨动开关作为in1,in2输入,输出的十进制数显示在七段管上,若结果为负数,则在前一位显示’-’
|