实验分析和设计
- 功能定义
完成的具体功能定义如下:
操作类型1:将操作数1作为一个无符号二进制数,在七段管以十进制显示二进制序列等效值。
操作类型2:实现操作数3、操作数4之间相加、减、乘的操作,在七段管以十/十六进制进制显示操作数和结果。操作数3和4为BCD码表示的2位十进制数(表示的值为00-99)。
- 设计模块及代码
Ⅰ、主模块
module hard01(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