1、同样新建工程
2、本实验要实现的功能是进行4位无符号数的加减运算,板子上电之后进行复位操作,
当最右边的按键按下时,进行加法操作,如果最高位有进位的话,那么蜂鸣器就会响,否则蜂鸣器不响,当然本实验中加法操作的进位为1,所以蜂鸣器会响,同时加法操作的和会在最右边的数码管上面显示;
当最左边的按键按下时,会进行减法操作,如果最高位有借位的话,那么蜂鸣器就会响,否则蜂鸣器不响,当然本实验中减法操作的借位为0,所以蜂鸣器不会响,同时减法操作的差会在最左边的数码管上面显示;
本实验的代码如下:
module binary_to_decimal(clk,Key4,Key3,Key2,Key1,DS_EN4,DS_EN3,DS_EN2,DS_EN1,DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP,BP1);
input clk;
input Key4,Key3,Key2,Key1;
output wire DS_EN4,DS_EN3,DS_EN2,DS_EN1;
output wire DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP;
output wire BP1;
wire [3:0]Key;
wire [3:0]wei;
wire [7:0]duan;
reg [3:0]wei_r;
reg [7:0]duan_r;
reg [1:0]SELE;
wire [3:0]SUM;
wire C;
parameter B=4'b1011,
A=4'b0111;
assign Key={Key4,Key1,Key2,Key3};
assign {DS_EN1,DS_EN2,DS_EN3,DS_EN4}=wei;//低电平选中对应数码管
assign {DS_DP,DS_G,DS_F,DS_E,DS_D,DS_C,DS_B,DS_A}=duan; //数码管共阴极
always @(Key)
begin
if(Key==4'b1101)//按下左数第三个按键时,进行复位操作
begin
wei_r<=4'b1111;
SELE<=2'b00;
end
else if(Key==4'b1110)
begin
SELE<=2'b01;//此时进行加法运算
wei_r<=4'b1110;//最右边的数码管亮
end
else if(Key==4'b0111)
begin
SELE<=2'b10;//此时进行减法运算
wei_r<=4'b0111;//最左边的数码管亮
end
end
adder_sub as(A,B,SELE,SUM,C);//如果为加法运算,那么结果应该为10010,即蜂鸣器会响,并且最右边数码管显示2;
//如果为减法运算,那么结果应该为00100,即蜂鸣器不会响,并且最左边数码管显示4
char_7seg HEX(SUM,duan);//把加减运算的结果显示在对应数码管上
assign wei=wei_r;
assign BP1=(!C);
endmodule
//4bit_unsigned_adder
module adder_sub(A,B,SELE,SUM,C);
input [3:0] A,B;
input [1:0]SELE;
output reg[3:0] SUM;
output wire C;
reg [3:0] c;
always @(SELE)
begin
if(SELE==2'b01)//进行加法运算
begin
SUM[0] <= A[0]^B[0]^0;//初始进位为0
c[0] <= (A[0] & B[0])|(B[0] & 0)|(A[0] & 0);
SUM[1] <= A[1]^B[1]^c[0];
c[1] <= (A[1] & B[1])|(B[1] & c[0])|(A[1] & c[0]);
SUM[2] <= A[2]^B[2]^ c[1];
c[2] <= (A[2] & B[2])|(B[2] & c[1])|(A[2] & c[1]);
SUM[3] <= A[3]^B[3]^ c[2];
c[3] <= (A[3] & B[3])|(B[3] & c[2])|(A[3] & c[2]);
end
else if(SELE==2'b10)//进行减法运算
begin
SUM[0] <=((A[0]^B[0])&1)|((~A[0])&(~B[0])&0);//初始借位为0
c[0] <= (A[0] & (~B[0]))|((~B[0]) & 0)|(A[0] & 0);
SUM[1] <= ((A[1]^B[1])&(~c[0]))|((~A[1])&(~B[1])&c[0]);
c[1] <= (A[1] & (~B[1]))|((~B[1]) & c[0])|(A[0] & c[0]);
SUM[2] <= ((A[2]^B[2])&(~c[1]))|((~A[2])&(~B[2])&c[1]);
c[2] <= (A[2] & (~B[2]))|((~B[2]) & c[1])|(A[2] & c[1]);
SUM[3] <= ((A[3]^B[3])&(~c[2]))|((~A[3])&(~B[3])&c[2]);
c[3] <= (A[3] & (~B[3]))|((~B[3]) & c[2])|(A[3] & c[2]);
end
end
assign C=c[3];
endmodule
//HEX
module char_7seg(S,HEX);
input [3:0]S;
output reg [7:0]HEX;
always @(S)
begin
case(S)
4'b0000: HEX=7'b00111111;
4'b0001: HEX=7'b00000110;
4'b0010: HEX=7'b01011011;
4'b0011: HEX=7'b01001111;
4'b0100: HEX=7'b01100110;
4'b0101: HEX=7'b01101101;
4'b0110: HEX=7'b01111101;
4'b0111: HEX=7'b00000111;
4'b1000: HEX=7'b01111111;
4'b1001: HEX=7'b01101111;
4'b1010: HEX=7'b01110111;
4'b1011: HEX=7'b01111100;
4'b1100: HEX=7'b00111001;
4'b1101: HEX=7'b01011110;
4'b1110: HEX=7'b01111001;
4'b1111: HEX=7'b01110001;
default: HEX=7'b00000000;
endcase
end
endmodule
3、本实验的结果如下:
上图对应复位之后的数码管上面的显示结果
上图对应加法操作的显示结果,并且此时蜂鸣器也在响,说明有进位产生
上图对应减法操作的显示结果,并且此时蜂鸣器不响,说明没有借位的产生