3800|0

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ZRtech Altera CycloneIV FPGA开发板——4位无符号数的加减运算 [复制链接]

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、本实验的结果如下:

上图对应复位之后的数码管上面的显示结果

上图对应加法操作的显示结果,并且此时蜂鸣器也在响,说明有进位产生

上图对应减法操作的显示结果,并且此时蜂鸣器不响,说明没有借位的产生
此帖出自FPGA/CPLD论坛
点赞 关注
个人签名坚持就会有所收获
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表