合工大计组实验五 在vivado中进行运算器的设计

目录

前言

实验目标及任务

实验内容与结果记录

步骤五:

步骤六:

前言

        在完成实验的时候,注意到实验相关的参考代码很少,可能是题目进行了更新,在这里把我自己的代码(实验五到八)发出来提供给学弟学妹们参考。实验一到四内容都很简单,只是一些基础知识,站内也有人发布,就不再赘述。(提示:老师提供的文档内容非常细致,其实多看文档就能学会如何完成实验,鼓励大家独立完成)

        我最后拿到的成绩是最高分,希望写的内容对大家有所帮助。

        

实验目标及任务

目标:

  1. 掌握一位全加器的工作原理和逻辑功能
  2. 掌握串行进位加法器的工作原理和进位延迟
  3. 掌握减法器的实现原理
  4. 掌握加减法器的设计方法
  5. 掌握ALU基本原理及在CPU中的作用
  6. 掌握ALU的设计方法;

     任务:

  1. 采用原理图方式设计4位加/减法器
  2. 实现4位ALU及应用设计

实验内容与结果记录

(在完成实验基础上额外完成步骤六)

步骤一到四为使用vivado的基础操作,老师已在文档中给出,根据文档操作即可。

步骤五:

源代码:

module adder_1bit(  input wire a,  input b,  input ci,  output wire s, co );
    and m0 (c1 ,a,b) ;
    and m1 (c2 ,b ,ci) ;
    and m2 (c3 ,a ,ci) ;
    xor m3 (s1 ,a ,b) ;
    xor m4 (s , s1,ci) ;
    or m5(co ,c1 ,c2,c3) ;
    endmodule

激励文件:

module adder_tb( );
reg a; reg b; reg ci;
wire s;
wire co;
adder_1bit  u0( .a(a), .b(b), .ci(ci) , .s(s), .co(co) );
initial 
begin
 a = 1'b0; 
b = 1'b0; 
ci = 1'b0;
#100;
a = 1'b0; 
b = 1'b0; 
ci = 1'b1;
#100; 
a = 1'b0; 
b = 1'b1; 
ci = 1'b0;
#100; 
a = 1'b0; 
b = 1'b1; 
ci = 1'b1;
#100;
a = 1'b1; 
b = 1'b0; 
ci = 1'b0;
#100; 
a = 1'b1; 
b = 1'b0; 
ci = 1'b1;
#100;
a = 1'b1; 
b = 1'b1; 
ci = 1'b0;
#100;
a = 1'b1; 
b = 1'b1; 
ci = 1'b1;
#100; 
a = 1'b0; 
b = 1'b0; 
ci = 1'b0;
#100;
end
endmodule

引脚约束文件:

set_property PACKAGE_PIN R1 [get_ports {a}] 
set_property PACKAGE_PIN N4 [get_ports {b}] 
 set_property PACKAGE_PIN M4 [get_ports {ci}]  
 set_property PACKAGE_PIN G4 [get_ports {s}]  
 set_property PACKAGE_PIN F6 [get_ports {co}]  
 set_property IOSTANDARD LVCMOS33 [get_ports {a}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {b}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {ci}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {s}]   
 set_property IOSTANDARD LVCMOS33 [get_ports {co}]

模拟仿真图像:

下载到开发板上的图片结果:

图一
图二

步骤六:

源代码:

module add_sub_1bit(
    input wire a,
    input wire b,
    input wire ci,
    input wire ctrl,
    output wire s,
    output wire co
);
    wire b_xor_ctrl;
    
    // 实现 b 的取反,后面会有ci为ctrl是+1
    xor(b_xor_ctrl, b, ctrl);
    
    // 原有的加法器逻辑
    wire s1, c1, c2, c3;
    and(c1, a, b_xor_ctrl);
    and(c2, b_xor_ctrl, ci);
    and(c3, a, ci);
    xor(s1, a, b_xor_ctrl);
    xor(s, s1, ci);
    or(co, c1, c2, c3);
endmodule

module add_sub_4bit(
    input [3:0] a,
    input [3:0] b,
    input ctrl,
    output [3:0] s,
    output co
);
    wire c1, c2, c3;

    // 使用add_sub_1bit模块实例化四个1位加减法器
    add_sub_1bit u0 (.a(a[0]), .b(b[0]), .ci(ctrl), .ctrl(ctrl), .s(s[0]), .co(c1));//只有此处的ci是ctrl,因为取反加一加也是在最末位
    add_sub_1bit u1 (.a(a[1]), .b(b[1]), .ci(c1), .ctrl(ctrl), .s(s[1]), .co(c2));
    add_sub_1bit u2 (.a(a[2]), .b(b[2]), .ci(c2), .ctrl(ctrl), .s(s[2]), .co(c3));
    add_sub_1bit u3 (.a(a[3]), .b(b[3]), .ci(c3), .ctrl(ctrl), .s(s[3]), .co(co));
endmodule

激励文件:

module adder_4bit_tb();

reg [3:0] a, b;
reg ctrl;
wire [3:0] s;
wire co;
add_sub_4bit u0( .a(a), .b(b), .ctrl(ctrl), .s(s), .co(co));

initial 
begin
    a = 4'b0000;
    b = 4'b0000;
    ctrl = 1'b0;
    #100;
    a = 4'b0001;
    b = 4'b0001;
    ctrl = 1'b0;
    #100; 
    a = 4'b0010;
    b = 4'b0010;
    ctrl = 1'b0;
    #100; 
    a = 4'b0111;
    b = 4'b0011;
    ctrl = 1'b1;
    #100;
    a = 4'b0100;
    b = 4'b0100;
    ctrl = 1'b1;
    #100; 
    a = 4'b0101;
    b = 4'b0101;
    ctrl = 1'b1;
    #100;
    a = 4'b0110;
    b = 4'b0110;
    ctrl = 1'b1;
    #100;
    a = 4'b0111;
    b = 4'b0111;
    ctrl = 1'b0;
    #100; 
    a = 4'b1000;
    b = 4'b1000;
    ctrl = 1'b0;
    #100;
    $finish;
end
endmodule

引脚约束文件:

set_property PACKAGE_PIN R1 [get_ports {a[0]}] 
set_property PACKAGE_PIN N4 [get_ports {a[1]}] 
 set_property PACKAGE_PIN M4 [get_ports {a[2]}]  
 set_property PACKAGE_PIN R2 [get_ports {a[3]}]  
 set_property PACKAGE_PIN P2 [get_ports {b[0]}] 
set_property PACKAGE_PIN P3 [get_ports {b[1]}] 
 set_property PACKAGE_PIN P4 [get_ports {b[2]}]  
 set_property PACKAGE_PIN P5 [get_ports {b[3]}] 
 set_property PACKAGE_PIN U3 [get_ports {ctrl}]  
 set_property PACKAGE_PIN J4 [get_ports {s[0]}]  
 set_property PACKAGE_PIN G3 [get_ports {s[1]}]  
 set_property PACKAGE_PIN G4 [get_ports {s[2]}]  
 set_property PACKAGE_PIN F6 [get_ports {s[3]}]  
 set_property PACKAGE_PIN K2 [get_ports {co}]  
 set_property IOSTANDARD LVCMOS33 [get_ports {a[0]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {a[1]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {a[2]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {a[3]}]   
 set_property IOSTANDARD LVCMOS33 [get_ports {b[0]}]
  set_property IOSTANDARD LVCMOS33 [get_ports {b[1]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {b[2]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {b[3]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {ctrl}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {s[0]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {s[1]}] 
 set_property IOSTANDARD LVCMOS33 [get_ports {s[2]}]   
 set_property IOSTANDARD LVCMOS33 [get_ports {s[3]}]   
 set_property IOSTANDARD LVCMOS33 [get_ports {co}]

模拟仿真图像:

下载到开发板上的图片结果:

图一
图二

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值