設計一個簡單的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輸入,輸出的十進制數顯示在七段管上。
1.png (1.76 MB, 下載次數: 43)
下載附件
2023-5-30 21:58 上傳
加法: 將ope撥動為”01”,實現兩個輸入之間相加的操作,分別用四個撥動開關作為in1,in2輸入,輸出的十進制數顯示在七段管上。
2.png (2.14 MB, 下載次數: 47)
下載附件
2023-5-30 21:58 上傳
減法: 將ope撥動為”10”,實現兩個輸入之間相減的操作,分別用四個撥動開關作為in1,in2輸入,輸出的十進制數顯示在七段管上,若結果為負數,則在前一位顯示’-’
3.png (1.88 MB, 下載次數: 47)
下載附件
2023-5-30 21:58 上傳
|