【FPGA】复杂组合逻辑模块设计

本文介绍了一款基于Verilog HDL设计的多功能计算器,能够实现两位十进制数的求和、比较大小、输出最大值和最小值等功能。计算器通过拨动开关输入数据,并通过按键选择功能,结果显示在数码管上,特别设计了BCD码调整和灭零功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【菜鸟新人,仅供参考,欢迎提出改进意见】

具体要求:
1)输入数据为两个一位十进制数A和B,A和B均为8421码表示,其中数据A由拨动开关SW7-SW4输入(SW7为MSB),数据B由SW3-SW0输入(SW3为MSB);
2)电路的功能包括求和、比较大小、输出最大值和输出最小值四种;分别由如下图所示的按键开关控制,当按键按下时,电路执行相对应的功能并输出结果。
3)输出显示在中央的两个数码管上。
4)求和功能描述:当按下求和键时,对A和B两个数相加,相加的结果显示在数码管上,注意相加的结果需要进行BCD码调整,显示模块必须调用实验一中设计的显示译码电路,当十位为0时,需要灭零。
5)比较大小模块描述:当比较大小功能键按下时,比较A和B的大小,当A<B时显示01(不灭0),当A>B时显示10,A=B时显示11。
6)输出最大(小)值功能描述:当按下输出最大(小)值功能键时,将A和B中的最大(小)值显示在数码管上。

简单来说,四个按键实现不同功能,最后输出值显示在数码管。为了直观便捷,将不同功能分为不同逻辑块,最后将个位和十位的数字分别计算并输出。
【新手提示:always模块中不能引用!不能引用!不能引用!】

每次判断是否灭零如果只使用一个值,会在后面跑电路板时造成一值多赋,逻辑混乱,毕竟vivado很笨hhhh,所以每次判断赋到新变量,最后将变量合在一起,列一个逻辑式进行判断最终是否灭零。
个位和十位数的输出也是同理,赋值记得千万不要搞混。

主程序:

module comprehensive(A,B,gewei,shiwei,S1,S0,S3,S4,seg1);
reg RBI_n1,RBI_n2,RBI_n11,RBI_n21,RBI_n12,RBI_n22,RBI_n13,RBI_n23,RBI_n14,RBI_n24;
input wire[3:0] A;
input wire[3:0] B;
output wire[7:0] gewei;
output wire[7:0] shiwei;
reg [4:0]sum;
reg [3:0]ge,ge1,ge2,ge3,ge4;
reg [3:0]shi,shi1,shi2,shi3,shi4;
reg [3:0]chucun;
output wire[7:0] seg1;
input wire S1,S0,S3,S4;//S0求和,S1求最小,S3比较大小,S4求最大
//求和
always@(*) begin
if(S0==1'b1)
    begin
    RBI_n11=1'b0; RBI_n21=1'b1;
    sum=A+B;ge1[0]=sum[0];ge1[1]=sum[1];ge1[2]=sum[2];ge1[3]=sum[3];
    if(sum[4]==1'b1)//分条件讨论,何时十位为2,何时十位为1
       begin 
       if(sum==5'b10100) begin shi1=4'b0010;ge1=4'b0000; end
       else begin shi1=4'b0001;ge1=ge1+4'b0110; end//通过判断需要加6才能显示正确数字。
       end
    else if(sum[4]==1'b0)
       begin
       if(sum>5'b01001) shi1=4'b0001;
       else shi1=4'b0000;
       end
     end
else if(S0==1'b0) begin
shi1=4'b0000;ge1=4'b0000;
RBI_n11=1'b1;RBI_n21=1'b1;
end end

//求最小,直接判断
always@(*) begin
if(S1==1'b1)
   begin
   RBI_n12=1'b0; RBI_n22=1'b1;
   if(A>B)
     begin
       ge2=B;
       begin
       if(B>4'b1001) shi2=4'b0001;
       else shi2=4'b0000;
       end
      end
   else if(A<B||A+B)
     begin
     ge2=A;
       begin
       if(A>4'b1001) shi2=4'b0001;
       else shi2=4'b0000;
       end
     end
   end
else if(S1==1'b0) begin shi2=4'b0000; ge2=4'b0000;RBI_n12=1'b1;RBI_n22=1'b1; end end

//比较大小,同理
always@(*) begin

if(S3==1'b1)
  begin
  RBI_n13=1'b0; RBI_n23=1'b0;
        if(A>B) 
            begin
            shi3=4'b0001;ge3=4'b0000;
            end
        else if(A==B) 
            begin
            shi3=4'b0001; ge3=4'b0001;
            end
        else if(A<B)  
            begin
            shi3=4'b0000;ge3=4'b0001;
            end
  end
else if (S3==1'b0) begin shi3=4'b0000; ge3=4'b0000;RBI_n13=1'b1;RBI_n23=1'b1; end end 

//求最大
always@(*) begin 
if(S4==1'b1)
begin
RBI_n14=1'b0;
RBI_n24=1'b1;
   if(A>B)
     begin
       ge4=A;
       begin
       if(A>4'b1001) shi4=4'b0001;
       else  shi4=4'b0000;
       end
      end
   else if(A<B||A+B)
     begin
     ge4=B;
       begin
       if(B>4'b1001) shi4=4'b0001;
       else shi4=4'b0000;
       end
      end
 end
else if(S4==1'b0) begin shi4=4'b0000; ge4=4'b0000;RBI_n14=1'b1;RBI_n24=1'b1; end end

always@(*)//进行最后的输出值的逻辑式运算
begin
shi=shi1|shi2|shi3|shi4;
ge=ge1|ge2|ge3|ge4;
RBI_n1=RBI_n11&RBI_n12&RBI_n13&RBI_n14;
RBI_n2=RBI_n21&RBI_n22&RBI_n23&RBI_n24;
end

//引用
yima_7 YA1(.data_in(ge),
              .data_out(gewei),
              .pos(seg1),
              .RBI_n0(RBI_n1));
              
yima_7 YA2(.data_in(shi),
              .data_out(shiwei),
              .pos(seg1),
              .RBI_n0(RBI_n2));
endmodule

子模块:【输出值的显示管显示】

module yima_7(input wire [3:0] data_in,
            output reg[7:0] data_out,
            output reg[7:0] pos,
            input wire RBI_n0
            );
always @(*)
begin
pos=8'b00011000;
     if(RBI_n0==1'b0)//灭零判断
               case(data_in)            
               4'b0000: data_out=8'b0111_1110;
               4'b0001: data_out=8'b0011_0000;
               4'b0010: data_out=8'b0110_1101;
               4'b0011: data_out=8'b0111_1001;
               4'b0100: data_out=8'b0011_0011;
               4'b0101: data_out=8'b0101_1011;
               4'b0110: data_out=8'b0101_1111;
               4'b0111: data_out=8'b0111_0000;
               4'b1000: data_out=8'b0111_1111;
               4'b1001: data_out=8'b0111_0011;
               4'b1010: data_out=8'b0111_1110;
               4'b1011: data_out=8'b0011_0000;
               4'b1100: data_out=8'b0110_1101;
               4'b1101: data_out=8'b0111_1001;
               4'b1110: data_out=8'b0011_0011;
               4'b1111: data_out=8'b0101_1011;
               endcase
     else if (RBI_n0==1'b1)
               case(data_in)            
               4'b0000: data_out=8'b0000_0000;
               4'b0001: data_out=8'b0011_0000;
               4'b0010: data_out=8'b0110_1101;
               4'b0011: data_out=8'b0111_1001;
               4'b0100: data_out=8'b0011_0011;
               4'b0101: data_out=8'b0101_1011;
               4'b0110: data_out=8'b0101_1111;
               4'b0111: data_out=8'b0111_0000;
               4'b1000: data_out=8'b0111_1111;
               4'b1001: data_out=8'b0111_0011;
               4'b1010: data_out=8'b0111_1110;
               4'b1011: data_out=8'b0011_0000;
               4'b1100: data_out=8'b0110_1101;
               4'b1101: data_out=8'b0111_1001;
               4'b1110: data_out=8'b0011_0011;
               4'b1111: data_out=8'b0101_1011;
               endcase
          end 
endmodule

仿真模块:

module comprehensive_simulation();
wire RBI_n1,RBI_n2;
reg[3:0] A;
reg[3:0] B;
wire[7:0] gewei;
wire[7:0] shiwei;
wire [4:0]sum;
wire [3:0]ge;
wire [3:0]shi;
wire [3:0]chucun;
wire[7:0] seg1;
reg S1,S0,S3,S4;
comprehensive ut(.A(A),.B(B),.gewei(gewei),.shiwei(shiwei),.S1(S1),.S0(S0),.S3(S3),.S4(S4),.seg1(seg1));
initial begin
#20 A=4'b1100;B=4'b0100;S0=1'b1;S1=1'b0;S3=1'b0;S4=1'b0;
#20 A=4'b1100;B=4'b0100;S0=1'b0;S1=1'b1;S3=1'b0;S4=1'b0;
#20 A=4'b1100;B=4'b0100;S0=1'b0;S1=1'b0;S3=1'b1;S4=1'b0;
#20 A=4'b1100;B=4'b0100;S0=1'b0;S1=1'b0;S3=1'b0;S4=1'b1;
#20 A=4'b0001;B=4'b1000;S0=1'b1;S1=1'b0;S3=1'b0;S4=1'b0;
#20 A=4'b0001;B=4'b1000;S0=1'b0;S1=1'b1;S3=1'b0;S4=1'b0;
#20 A=4'b0001;B=4'b1000;S0=1'b0;S1=1'b0;S3=1'b1;S4=1'b0;
#20 A=4'b0001;B=4'b1000;S0=1'b0;S1=1'b0;S3=1'b0;S4=1'b1;
end
initial
#180 $finish;
Endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值